Műszaki cikk

PDF konvertálása egyetlen színtérbe Delphiben

A RecolorDocument egy teljes PDF-et egyetlen színtérbe mozgat, a RecolorPage pedig ugyanezt végzi egyetlen oldallal. Mindkettő 1-et vár szürkéhez, 2-t RGB-hez és 3-at CMYK-hez, és visszaadja, hány szín került konvertálásra. A geometria, a szöveg és a képek pontosan ott maradnak, ahol voltak; csak a szín változik

Ez az a művelet, amelyet egy olyan nyomda elé akarunk végezni, amely egyetlen teret vár, vagy amikor egy színes dokumentumnak szürkévé kell válnia újragenerálás nélkül. A másik lehetőség — a dokumentum forrásadataiból való újraépítése a céltérben — csak akkor áll rendelkezésre, ha még megvannak a forrásadatok, ami kívülről érkező anyagoknál általában nincs így

Mi kerül konvertálásra, és milyen sorrendben

Először a színoperátorok: azok a kitöltések és vonalvastagságok, amelyeket egy oldal rajzolás közben beállít. Egy már a céltérben lévő szín érintetlen marad, tehát egy olyan oldal, amelynek színein nem kell változtatni, megtartja az eredeti bájtjait ahelyett, hogy azonos értékekre írnák újra. Ez a tulajdonság egy nagy dokumentumnál többet számít, mint amennyinek hangzik, mert az érintetlen objektumok érintetlenek maradnak a fájlban

A képek következnek, és ez az a rész, amely régebben hiányzott. Egy olyan dokumentum, amely csak az operátorok konvertálásával lett szürkévé, még mindig színes képeket mutatott szürke oldalakon, ami rosszabb, mint bármelyik szélsőérték. Egy kép akkor kerül konvertálásra, ha nyolc bitet hordoz komponensenként, eszközsíntérrel rendelkezik, és nincs tömörítése, vagy egyszerű Flate

Az indexelt képek a színtáblájukon keresztül konvertálódnak: a paletta konvertálódik, és minden minta megtartja azt az indexet, amelyet már birtokolt. Ez lefedi azokat a palettás képeket, amelyekként egy képernyőfotó vagy egy diagramot szokás menteni, és azokat is konvertálja, bármivel is legyenek csomagolva vagy tömörítve a mintái, mert a minták sosem változnak

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;

Miért marad egy JPEG érintetlenül?

Mert a színeinek konvertálása újrakódolást jelentene, az újrakódolás pedig más művelet, más következményekkel. Egy JPEG vagy fax kép megtartja a saját bájtjait: a dekódolás, a konvertálás és az újrakomprimálás megváltoztatná magát a képadatot, bevezetne egy második generációs veszteséges artefaktokat, és olyan módon változtatná meg a fájlméretet, amelyre a hívó nem kért

A soft maszkok és a stencil maszkok más okból maradnak érintetlenül. Mindkettő fedettségként van beolvasva, nem színként, és az egyik konvertálása arra vezetne, hogy az oldal a maszkot képként mutassa — egy átlátszósági maszk szürke grafikaként renderelve azon tartalom tetején, amelyet alakítania kellett volna. Az érintetlenül hagyásuk nem egy megkerülendő korlátozás; ez a helyes eredmény

Az ICCBased, Separation, Indexed vagy Pattern síton beállított színek szintúgy úgy maradnak, ahogy az operátorszinten állnak. Ezen értékek konvertálása a profiljuk beolvasása nélkül megváltoztatná, hogyan néz ki az oldal, ahelyett hogy megőrizné, és egy olyan átszínezési menet, amelynek egész ígérete a megőrzés, nem kezdhet el találgatni a profilokról

A színátmenetek a mögöttük lévő megállókkal együtt konvertálódnak

Egy színátmenet egy színtér plusz egy függvény, amely színeket állít elő benne, és az egyik konvertálása a másik nélkül értelmetlenséget eredményez — egy konvertált színátmenet, amelynek megállói lemaradtak, úgy olvasható, mint egy szürke szintnek vélt csatorna, ami egy oldalon teljesen rossz színű sávnak tűnik. A színátmenet színtere és a mögötte lévő megállók együtt mozognak

A színátmenetek ott kerülnek megtalálásra, ahol élnek: saját objektumként, a őket festő minta belsejébe írva, vagy egy oldal árnyékolási erőforrásaiban ülve. Ez a lefedettség azért számít, mert a tervezőeszközök eltérően osztják el őket, és egy konverter, amely csak egy elhelyezést kezelt, félig konvertált dokumentumot hagyna hátra, a hibáknak nyilvánvaló mintázata nélkül

Két fajta szándékosan úgy marad, ahogy van. A mintavételezett vagy PostScript függvényből épített színátmenet megtartja a saját definícióját, és ugyanez igaz a mesh típusokra is, amelyek a színeiket egy folyamban hordozzák függvény helyett. Bármelyik újraírása más művelet, mint egy szín konvertálása, és csendben, egy átszínezési folyamaton belül történő elvégzése meglepetés lenne

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

Hol illeszkedik az átszínezés egy nyomdai leadás elé

Normalizálási lépésként használjuk, nem színkezelésként. Az átszínezés értékeket konvertál az eszközsínek között; nem alkalmaz ICC-profilt, nem veszi figyelembe a megjelenítési szándékot, és nem szimulál nyomdai feltételt. Egy olyan munkánál, amelynek el kell találnia egy szerződéses proofot, a profilvezérelt workflow a válasz, és az átszínezés legfeljebb az a lépés, amely mindent először egy térbe hoz

Ahol megérdemli a helyét, az a mindennapi termelési probléma: egy leadás, amelynek szürkének kell lennie, és egy RGB logóval érkezik; egy belső dokumentum, amelyet nem szabad színben nyomtatni; egy fájlköteg, amelynek egy térben kell lennie ahhoz, hogy egy preflight lépés elfogadja. Párosítsuk egy ellenőrzéssel — a PDF/A és PDF/UA preflight és a megfelelőségi és aláírási munkapad jegyzetei azt tárgyalják, hogyan futtassuk az ítéletet ugyanannak a feladatnak a részeként

Ha a dokumentum vektorgrafikáját is meg kell vizsgálni, nem konvertálni, a vektorgrafika, árnyékolók és színátmenetek átjárása azt mutatja be, hogyan épülnek fel ezek az objektumok eredetileg, ami hasznos kontextus annak megértéséhez, mit érhet el és mit nem egy átszínezési menet

A PDFlibPas natív Pascal PDF könyvtár Delphihez, C++Builderhez és Lazarushoz külső futtatókörnyezet nélkül, így egy szín-normalizálási lépés a saját szolgáltatásunkon belül fut, ahelyett hogy egy konverterhez nyúlna — a teljes dokumentumfeldolgozási API-t a PDFlibPas termékoldal tartalmazza