Odborný článok

Výstup PDF/A, PDF/X a PDF/UA v Delphi: Sprievodca HotPDF

PDF/A, PDF/X a PDF/UA sú tri odlišné normy riešiace tri rôzne problémy: dlhodobú archiváciu, tlačovú výmenu a prístupnosť. Nejedná sa o tri zaškrtávacie políčka na jednom formulári o zhode a najčastejšou chybou je pristupovať k nim, akoby to tak bolo. Súbor môže bezchybne spĺňať PDF/A a zároveň byť nepoužiteľný pre tlačiareň. Perfektný tlačový podklad zasa môže byť nečitateľný pre čítačku obrazovky. Čo je horšie, všetky tri normy predstavujú obmedzenia pre vnútornú štruktúru súboru, nie pre to, ako vyzerá. Dokument, ktorý sa bez problémov otvorí v každom vašom prehliadači, môže pri prvej validácii zlyhať – a zvyčajne sa tak aj stane

HotPDF, natívna VCL knižnica pre PDF od spoločnosti losLab, pristupuje k zhode ako k vlastnosti, ktorú deklarujete ešte pred vytvorením prvej stránky. Nastavíte vlastnosť zhody, pripojíte štruktúry vyžadované normou a knižnica pri ukladaní odmietne konfigurácie, ktoré sú v rozpore s profilom. To je oveľa lepší model ako vygenerovať súbor a dúfať, že ho dodatočný proces upraví, pretože väčšinu požiadaviek týchto noriem nie je možné pradať dodatočne

Tri ISO normy, tri rôzne prísľuby

Norma PDF/A (ISO 19005) sa zaoberá časom. Zaručuje, že sa súbor bude zobrazovať rovnako aj o desiatky rokov. Vyžaduje preto úplnú sebestačnosť: všetky písma musia byť vložené, každá farba must mať definovaný význam nezávislý od zariadenia pomocou OutputIntent, súbor musí obsahovať úplné metadáta XMP a nesmie obsahovať nič, čo závisí od okolitého prostredia. Šifrovanie a JavaScript sú zakázané, pretože nikto nemôže zaručiť, že dešifrátor alebo skriptovací engine budú v roku 2050 ešte existovať

Norma PDF/X (ISO 15930) je určená pre farby na papieri. Umožňuje dizajnérom odovzdať súbor tlačiarni bez nutnosti zdĺhavých debát. Vyžaduje definované podmienky tlače, povinný kľúč /Trapped, presnú geometriu orezania a spadávky a vo verzii X-1a aj zákaz priamej priehľadnosti, ktorú by musel rasterizér (RIP) odhadovať. Norma PDF/UA (ISO 14289) zasa rieši, kto dokáže výsledok prečítať. Asistenčné technológie vyžadujú kompletný strom značiek (tags), logické poradie čítania, deklarovaný jazyk dokumentu a textové alternatívy pre všetky netextové prvky

Keďže tieto tri normy smerujú iným smerom, zvoľte si cieľovú normu pre každý výstupný kanál samostatne, namiesto snahy vytvoriť jeden súbor, ktorý splní všetko. Tlačový podklad určený výhradne pre CMYK je nevhodný pre používateľa čítačky obrazovky, ktorý farby nevníma, a obmedzenie dynamického správania v archívnom profile zasa bráni interaktívnym prvkom. Generujte výstupy pre každý kanál zo rovnakých zdrojových dát a vyhnete sa tomuto konfliktu

HotPDF generuje súbory PDF/A, PDF/X a PDF/UA na výstupný kanál z jedného zdrojového dokumentu v Delphi, pričom každá ISO norma drží iný štrukturálny sľub
PDF/A, PDF/X a PDF/UA ťahajú rôznymi smermi, takže HotPDF generuje jeden súbor na výstupný kanál z rovnakého zdroja

PDF/A: OutputIntent je časť, na ktorú každý zabúda

Ak súbor PDF/A neprejde validáciou, OutputIntent je prvá vec, ktorú treba skontrolovať. Ide o štruktúru, ktorú generátory vynechávajú najčastejšie, pretože na nej vizuálne nič nezávisí. Norma ISO 19005 ju však vyžaduje: ide o vložený profil ICC, ktorý presne definuje význam farieb zariadenia v dokumente. HotPDF robí z tohto profilu povinný parameter, nie iba dodatočnú voľbu:

var
  Pdf: THotPDF;
  ICC: TFileStream;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-archival.pdf';
    Pdf.PDFACompliance := 'B';            // level B: visual fidelity
    Pdf.Lang := 'en-US';
    Pdf.StandardFontEmulation := False;   // vložte skutočné písma, bez emulácie Base-14
    ICC := TFileStream.Create('sRGB.icc', fmOpenRead);
    try
      Pdf.AddPDFAOutputIntent('sRGB IEC61966-2.1', '', ICC, 3, 'DeviceRGB');
    finally
      ICC.Free;
    end;
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Archival invoice body');
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

Úspech či zlyhanie tu závisí od niekoľkých detailov. Vlastnosť StandardFontEmulation musí byť vypnutá: emulované písma Base-14 sa do súboru nevkladajú a ich vloženie je podľa ISO 19005 povinné. Šifrovanie musí zostať vypnuté, preto nikdy nekombinujte PDFACompliance s ActivateProtection – šifrovaný archívny súbor je rozpor, ktorý validátor okamžite odhalí. Počet farebných zložiek v metóde AddPDFAOutputIntent musí zodpovedať profilu, čo znamená 3 pre RGB profil (napr. sRGB IEC61966-2.1) a 4 pre CMYK. HotPDF počas zápisu sleduje použitie DeviceRGB a DeviceCMYK voči deklarovanému zámeru, takže neočakávaná CMYK výplň v dokumente s RGB zámerom sa nahlási ako chyba a neprejde potichu

Dôležitá poznámka k profilu ICC: pristupujte k nemu ako k verziovanému artefaktu nasadenia, nie ako k súboru, ktorý niekto kedysi nahral na zostavovací server. Jeho bajty sa vkladajú do každého generovaného dokumentu, takže poškodený profil znehodnotí celú dávku dokumentov a zistíte to až pri validácii. Distribuujte ho spolu s inštalátorom, zaznamenávajte jeho kontrolný súčet do logu a načítavajte ho pomocou TFileStream (ako je znázornené vyššie), aby chýbajúci súbor spôsobil chybu už pri generovaní, a nie až pri archivácii

PDF/X pre tlač: Trapped, CMYK a tlačový profil

Tlačové predlohy majú opačné požiadavky na farby. Tlačiareň vyžaduje definované CMYK a norma vás núti uviesť, či bolo použité prekrývanie farieb (trapping), aj keď na to neviete odpovedať. Kľúč /Trapped je v každom prípade povinný:

Pdf.PDFXCompliance := 'X-1a';
Pdf.Trapped := 'Unknown';        // povinný kľúč podľa ISO 15930
ICC := TFileStream.Create('FOGRA39.icc', fmOpenRead);
try
  Pdf.AddPDFXOutputIntent('FOGRA39 (ISO 12647-2:2004)', '', ICC, 4, 'DeviceCMYK');
finally
  ICC.Free;
end;
Pdf.BeginDoc;
// vykresľujte farbami bezpečnými pre CMYK, bez priehľadnosti a bez šifrovania
Pdf.EndDoc;

Počet zložiek je v tomto prípade 4 pre tlačový profil CMYK. Verzia X-1a navyše zakazuje priamu priehľadnosť. Skontrolujte preto akýkoľvek kresliaci kód, ktorý vrství polopriehľadné prvky – to, čo prehliadač na obrazovke zlúči, môže rasterizér (RIP) odmietnuť spracovať. Ak vaša tlačiareň pošle inú charakteristiku, nahraďte bajty profilu a identifikačný reťazec, ale okolitú štruktúru ponechajte nezmenenú

PDF/UA: štruktúra sa generuje, nedá sa pridať dodatočne

Prístupnosť je norma, ktorú sa vývojové tímy najčastejšie pokúšajú doplniť až na záver, a táto norma takýto prístup trestá najprísnejšie. Strom značiek (tag tree) totiž musí kopírovať poradie, v akom bol obsah logicky vytvorený, čo sú informácie, ktoré po zapísaní súboru už nemáte k dispozícii. Nastavenie PDFUACompliance aktivuje tagovaný výstup a štruktúrne API priradí každému kresliacemu volaniu jeho sémantickú rolu priamo počas generovania:

HotPDF buduje strom značiek PDF/UA naživo, ako sa každé kresliace volanie Delphi vykoná, a text vyslaný mimo BeginTaggedContent a EndTaggedContent zostáva neviditeľný pre čítačky obrazovky
Strom značiek sa zapisuje počas kreslenia a text mimo značkového páru sa renderuje dobre, ale zostáva neviditeľný pre čítačky obrazovky
Pdf.PDFUACompliance := True;     // automaticky povolí tagované PDF
Pdf.Lang := 'en-US';             // nastavte explicitne; prázdna hodnota prejde na 'en'
Pdf.BeginDoc;

Root := Pdf.AddStructureElement(sstDocument, nil);
H1 := Pdf.EmitTaggedHeading(1, Root, 50, 700, 'Quarterly Report');
Para := Pdf.BeginTaggedContent('P', Root);
Pdf.CurrentPage.TextOut(50, 650, 0, 'Revenue grew in all regions.');
Pdf.EndTaggedContent;

Pdf.EndDoc;

Chybou, na ktorú si treba dať pozor, je text vykreslený mimo akejkoľvek dvojice BeginTaggedContent/EndTaggedContent. Zobrazí sa úplne správne, ale pre čítačku obrazovky bude neviditeľný, takže ho žiadny bežný tester neodhalí. Chyba sa dostane do produkcie a prejaví sa až vtedy, keď na ňu narazí používateľ asistenčných technológií. Ak vaše šablóny obsahujú vlastné názvy štruktúrnych rolí, namapujte ich na štandardnú sadu pomocou AddStructRoleMap('MyHead', 'H1'), aby kompatibilné čítačky porozumeli ich významu. Norma ISO 14289 vyžaduje aj deklaráciu jazyka. HotPDF použije predvolenú hodnotu 'en', ak je vlastnosť Lang prázdna, ale to slúži iba ako záchranná sieť a nie ako dôvod nešpecifikovať skutočný jazyk dokumentu

Overovanie: dôverujte validátoru, nie prehliadaču

To, že sa súbor otvorí v prehliadači, nedokazuje jeho zhodu s normami. Overovanie by preto malo byť súčasťou nasadzovacieho procesu pomocou nástrojov, ktoré kontrolujú štruktúru a nie iba vykresľovanie. Pre PDF/A a PDF/UA je referenčným otvoreným validátorom veraPDF, ktorý hlási chyby priamo podľa odsekov noriem ISO, čo uľahčuje lokalizáciu problému v kóde. Pri PDF/X sú praktickým testom profily Preflight v Adobe Acrobat, pretože tlačová zhoda závisí od farebného zámeru rovnako ako od správnej syntaxe

Generátor sám vykonáva časť tejto práce. HotPDF pri ukladaní zosúlaďuje príznaky funkcií s nastavenou verziou PDF a potichu obmedzí to, čo daná verzia nedokáže vyjadriť (napríklad zníži AES-256 na AES-128 pri verziách starších ako PDF 1.7). Kontrolné mechanizmy v metóde EndDoc idú ešte ďalej a vyvolajú výnimku pri zásadných rozporoch, napríklad pri požiadavke na PDFACompliance spoločne so šifrovaním. Tieto interné kontroly nenahrádzajú externý validátor, iba zabraňujú tomu, aby sa k nemu dostali nefunkčné konfigurácie

Brány súladu HotPDF v EndDoc zachytia nemožné konfigurácie skôr, než veraPDF validuje PDF/A a PDF/UA a Acrobat Preflight validuje PDF/X vo vydávacej ceste Delphi
HotPDF odmieta protirečivé konfigurácie pri EndDoc a nezávislé validátory rozhodujú o skutočnej zhode

Jeden návyk sa opakovane vypláca: verzujte celé nastavenie zhody ako jeden celok. Verziu HotPDF, revíziu šablóny, kontrolný súčet ICC profilu a zostavenie validátora, ktorý zhodu potvrdil. Zhoda s normami sa môže narušiť, ak sa zmení ktorákoľvek z týchto zložiek. Najzložitejšie audity bývajú tie, kedy nikto nedokáže rekonštruovať, aká kombinácia nástrojov vygenerovala päťročný archívny súbor. Jediný záznam o konfigurácii pre každú dávku tento problém natrvalo vyrieši

Na záver: spúšťajte validátor na reálnych produkčných výstupoch, nikdy nie iba na pripravených vzorkách. Chyby, ktoré spôsobujú najväčšie problémy, pochádzajú z neočakávaných dát: logo zákazníka dodané v CMYK, hoci zámer dokumentu uvádza RGB, úprava šablóny, ktorá použije nevložené písmo, alebo nová vetva kódu, ktorá vykreslí text mimo stromu značiek. Uložte si aspoň jeden chybový súbor z každého minulého incidentu ako testovací prípad pre regresné testovanie a vaša kontrola kvality zostane spoľahlivá. Pre vykresľovaciu časť spracovania si prečítajte náš článok o reportovom výstupe, písmach a obrázkoch v HotPDF. Integrácii validátorov do procesu zostavenia sa venuje článok o automatizácii PDF kontroly preflight

Vlastnosti zhody, výstupné zámery a tagged-API použité v týchto príkladoch sa dodávajú s komponentom HotPDF Delphi Component pre Delphi a C++Builder. Stránka produktu obsahuje odkaz na kompletnú referenčnú príručku pre všetky zobrazené volania