Technický článek

Převod PDF do jednoho barevného prostoru v Delphi

RecolorDocument přesune celé PDF do jednoho barevného prostoru a RecolorPage udělá totéž pro jednu stránku. Obě volby přijímají 1 pro odstíny šedi, 2 pro RGB a 3 pro CMYK a vrací počet převedených barev. Geometrie, text i obrázky zůstávají přesně tam, kde byly; mění se jen barva

To je operace, kterou chcete před odesláním práce do tiskárny, která čeká jeden prostor, nebo když se barevný dokument musí stát dokumentem v odstínech šedi bez toho, aby byl znovu generován. Alternativa — přestavba dokumentu ze zdrojových dat v cílovém prostoru — je dostupná jen tehdy, když zdrojová data stále máte, což u čehokoli přijatého zvenčí neplatí

Co se převádí a v jakém pořadí

Nejprve barevné operátory: výplje a tahy, které stránka při kreslení nastavuje. Barva už v cílovém prostoru se nechává na pokoji, takže stránka, jejíž barvy nepotřebují změnu, si ponechá původní bajty místo aby byla přepsána na totožné hodnoty. Tato vlastnost má na velkém dokumentu větší váhu, než zní, protože nedotčené objekty zůstávají v souboru nedotčeny

Po nich přicházejí obrázky, a to je část, která dříve chyběla. Dokument převedený na odstíny šedi jen s převedenými operátory stále ukazoval na šedých stránkách barevné obrázky, což je horší než oba extrémy. Obrázek se převádí, pokud nese osm bitů na komponentu, barevný prostor typu device a buď žádnou kompresi, nebo čistý Flate

Indexované obrázky se převádějí přes svou barevnou tabulku: paleta se převede a každý vzorek si podrží index, který už měl. Tím se pokryjí paletové obrázky, jakými se obvykle ukládá snímek obrazovky či graf, a to bez ohledu na to, jak jsou vzorky baleny nebo komprimovány, protože vzorky se nemění

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;

Proč se JPEG nechává na pokoji?

Protože převod jeho barev by znamenal jeho překódování a překódování je jiná operace s jinými následky. JPEG nebo faxový obrázek si ponechává vlastní bajty: dekódování, převod a rekomprese by změnily samotná obrazová data, přinesly by druhou generaci ztrátových artefaktů a změnily velikost souboru způsobem, o který volající nežádal

Měkké masky a šablonové masky se nechávají na pokoji z jiného důvodu. Obě se čtou jako pokrytí, nikoli jako barva, a převod jedné by vedl k tomu, že by stránka ukazovala masku jako obrázek — průhlednostní maska vykreslená jako šedá grafika navrstvená na obsahu, který měla tvarovat. Nechat je tak není omezení, které by se mělo obcházet; je to správný výsledek

Barvy nastavené přes ICCBased, Separation, Indexed nebo Pattern prostor se na úrovni operátoru rovněž nechávají tak, jak jsou. Převod bez přečtení jejich profilu by změnil vzhled stránky místo jeho zachování a průběh přebarvení, jehož celým příslibem je zachování, nemůže začít hádat profily

Přechody se převádějí se zarážkami, které za nimi stojí

Přechod je barevný prostor plus funkce, která v něm produkuje barvy, a převést jedno bez druhého dává nesmysl — převedený přechod, jehož zarážky zůstaly pozadu, se čte jako kanál zaměněný za úroveň šedi, což na stránce vypadá jako pruh úplně špatné barvy. Barevný prostor přechodu i zarážky za ním se přesouvají společně

Přechody se hledají všude, kde žijí: jako samostatný objekt, zapsané uvnitř patternu, který je vykresluje, nebo uložené ve shading resources stránky. Toto pokrytí je důležité, protože návrhové nástroje je distribuují různě a konvertor, který by zpracoval jen jedno umístění, by zanechal dokument napůl převedený bez zjevného vzoru v tom, co selhalo

Dva druhy se záměrně nechávají tak, jak jsou. Přechod sestavený ze vzorkované nebo PostScript funkce si podrží svou vlastní definici a totéž platí pro mesh typy, které nesou své barvy ve streamu místo ve funkci. Přepsat obojí je jiná operace než převod barvy a udělat to potichu uvnitř přebarvovacího průchodu by bylo překvapením

// 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');

Kam přebarvení patří před odesláním do tisku

Použijte ho jako krok normalizace, ne jako správu barev. Přebarvení převádí hodnoty mezi prostory device; neaplikuje ICC profil, neřídí se rendering intentem a nesimuluje podmínky tisku. Pro zakázku, která má trefit kontraktní proof, je odpovědí profilová roura a přebarvení je nanejvýš krok, který dostane vše do jednoho prostoru jako první

Vydlédlá své místo má u běžného produkčního problému: podání, které musí být šedé a přijde s RGB logem, interní dokument, který se nesmí vytisknout barevně, dávka souborů, která musí být v jednom prostoru, než ji preflight přijme. Spojte ji s kontrolou — poznámky k preflightu PDF/A a PDF/UA a k workbenci pro shodu a podepisování ukazují, jak verdict spustit jako součást stejné úlohy

Pokud dokument potřebuje prozkoumat vektorovou grafiku raději než ji převést, průvodce vektorovou grafikou, shadery a přechody rozebírá, jak se tyto objekty vůbec konstruují, což je užitečný kontext k pochopení toho, čeho průběh přebarvení může a nemůže dosáhnout

PDFlibPas je nativní Pascal PDF knihovna pro Delphi, C++Builder a Lazarus bez externího runtime, takže krok normalizace barev běží uvnitř vaší vlastní služby místo volání externího konvertoru — viz stránka produktu PDFlibPas pro úplné API na zpracování dokumentů