Artykuł techniczny

Konwersja PDF do jednej przestrzeni kolorów w Delphi

RecolorDocument przenosi cały PDF do jednej przestrzeni kolorów, a RecolorPage robi to samo dla pojedynczej strony. Obie funkcje przyjmują 1 dla odcieni szarości, 2 dla RGB i 3 dla CMYK oraz zwracają liczbę przekonwertowanych kolorów. Geometria, tekst i obrazy pozostają dokładnie tam, gdzie były; zmienia się tylko kolor

To jest operacja, której chcesz przed wysłaniem pracy na maszynę drukarską oczekującą jednej przestrzeni albo gdy dokument kolorowy musi stać się dokumentem w odcieniach szarości bez regeneracji. Alternatywa — przebudowa dokumentu z jego danych źródłowych w przestrzeni docelowej — jest dostępna tylko wtedy, gdy wciąż masz dane źródłowe, a dla czegokolwiek otrzymanego z zewnątrz ich nie masz

Co jest konwertowane i w jakiej kolejności

Najpierw operatory koloru: wypełnienia i obrysy ustawiane przez stronę podczas rysowania. Kolor już w przestrzeni docelowej jest pozostawiany bez zmian, więc strona, której kolory nie wymagają zmiany, zachowuje swoje oryginalne bajty zamiast być przepisywana na identyczne wartości. Ta właściwość ma większe znaczenie, niż się wydaje na dużym dokumencie, ponieważ nietknięte obiekty pozostają nietknięte w pliku

Obrazy przychodzą jako następne i to jest ta część, której kiedyś brakowało. Dokument zamieniony na odcienie szarości z przekonwertowanymi tylko operatorami wciąż pokazywał kolorowe obrazki na szarych stronach, co jest gorsze niż którekolwiek z ekstremów. Obraz jest konwertowany, gdy niesie osiem bitów na składową, przestrzeń kolorów urządzenia i albo brak kompresji, albo czysty Flate

Obrazy indeksowane konwertują się przez swoją tabelę kolorów: paleta jest konwertowana, a każda próbka zachowuje indeks, który już miała. To obejmuje obrazy paletowe, pod które zazwyczaj zapisuje się zrzut ekranu lub wykres, i konwertuje je niezależnie od tego, czym ich próbki są pakowane czy kompresowane, ponieważ próbki nigdy się nie zmieniają

var
  Lib: TPDFlib;
  Converted: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('brochure.pdf', '');
    Converted := Lib.RecolorDocument(1);       // 1 grey, 2 RGB, 3 CMYK
    Log(Format('%d colours converted', [Converted]));
    Lib.SaveToFile('brochure-grey.pdf');
  finally
    Lib.Free;
  end;
end;

Dlaczego JPEG jest pozostawiany bez zmian?

Ponieważ konwersja jego kolorów oznaczałaby ponowne kodowanie, a ponowne kodowanie to inna operacja o innych konsekwencjach. Obraz JPEG lub faksowy zachowuje własne bajty: dekodowanie, konwersja i ponowna kompresja zmieniłyby same dane obrazu, wprowadziły drugą generację artefaktów stratnych i zmieniły rozmiar pliku w sposób, o jaki wywołujący nie prosił

Maski miękkie i maski szablonowe są pozostawione bez zmian z innego powodu. Obie są czytane jako pokrycie, a nie jako kolor, a konwersja którejś sprawiłaby, że strona pokazywałaby maskę jako obraz — maska przezroczystości renderowana jako szara grafika nałożona na treść, którą miała kształtować. Pozostawienie ich nie jest ograniczeniem do obejścia; to poprawny wynik

Kolory ustawione przez przestrzeń ICCBased, Separation, Indexed lub Pattern są także pozostawiane w spokoju na poziomie operatora. Konwersja ich bez odczytania ich profilu zmieniłaby wygląd strony zamiast go zachować, a przebieg rekoloryzacji, którego całą obietnicą jest zachowanie, nie może zacząć zgadywać profili

Gradienty konwertują się razem ze stopniami, które je podpierają

Gradient to przestrzeń kolorów plus funkcja produkująca w niej kolory, a konwersja jednej bez drugiej produkuje bzdurę — przekonwertowany gradient, którego stopnie zostały w tyle, czyta się jako kanał wzięty za poziom szarości, co na stronie wygląda jak pas zupełnie złego koloru. Przestrzeń kolorów gradientu i podpierające ją stopnie przesuwają się razem

Gradienty są znajdowane tam, gdziekolwiek żyją: jako samodzielny obiekt, zapisane wewnątrz patternu, który je maluje, albo siedzące w zasobach cieniowania strony. To pokrycie ma znaczenie, ponieważ narzędzia projektowe rozdzielają je różnie, a konwerter, który obsługiwałby tylko jedną z lokalizacji, zostawiłby dokument w połowie przekonwertowany bez oczywistego wzorca w porażkach

Dwa rodzaje są celowo pozostawiane bez zmian. Gradient zbudowany z funkcji próbkowanej lub PostScript zachowuje własną definicję, a tak samo typy mesh, które niosą swoje kolory w strumieniu zamiast w funkcji. Przepisanie któregokolwiek to inna operacja niż konwersja koloru, a zrobienie tego po cichu wewnątrz przebiegu rekoloryzacji byłoby niespodzianką

// Convert a single page - useful when only the cover needs to change
Lib.SelectPage(1);
Lib.RecolorPage(3);          // this page to CMYK
Lib.SaveToFile('cover-cmyk.pdf');

Gdzie rekoloryzacja się mieści przed zgłoszeniem na maszynę

Używaj jej jako kroku normalizacji, a nie jako zarządzania kolorem. Rekoloryzacja konwertuje wartości między przestrzeniami urządzenia; nie aplikuje profilu ICC, nie honoruje intencji renderowania ani nie symuluje warunków maszyny. Dla zlecenia, które musi trafić w kontraktowy proof, odpowiedzią jest potok sterowany profilem, a rekoloryzacja jest najwyżej krokiem, który najpierw sprowadza wszystko do jednej przestrzeni

Gdzie ona zyskuje swoje miejsce, to zwykły problem produkcyjny: zgłoszenie, które musi być w odcieniach szarości, a przychodzi z logo RGB; dokument wewnętrzny, który nie wolno drukować w kolorze; partia plików, która musi być w jednej przestrzeni, zanim przyjmie je krok preflighitu. Połącz ją ze sprawdzeniem — notatki o preflighicie PDF/A i PDF/UA oraz o stanowisku pracy ds. zgodności i podpisywania omawiają uruchamianie werdyktu jako części tego samego zadania

Jeśli dokument wymaga też zbadania swojej grafiki wektorowej zamiast jej przekonwertowania, przewodnik po grafice wektorowej, shaderach i gradientach omawia, jak te obiekty są budowane w pierwszej kolejności, co jest użytecznym kontekstem do zrozumienia, czego przebieg rekoloryzacji może i czego nie może dosięgnąć

PDFlibPas to natywna biblioteka PDF w Pascalu dla środowisk Delphi, C++Builder i Lazarus bez zewnętrznego runtime, więc krok normalizacji koloru biegnie wewnątrz własnej usługi zamiast shellować do konwertera — zobacz stronę produktu PDFlibPas, by poznać pełne API przetwarzania dokumentów