Technical Article

Izhodni formati PDF/A, PDF/X in PDF/UA v Delphi: Vodnik za HotPDF

PDF/A, PDF/X in PDF/UA so trije različni standardi, ki rešujejo tri različne težave: dolgoročno arhiviranje, izmenjavo za tisk in dostopnost. To niso tri potrditvena polja na enem obrazcu o skladnosti, največja napaka pa je, da jih obravnavamo, kot da so. Datoteka je lahko brezhiben PDF/A, a popolnoma neuporabna za tiskarno; popolna tiskarska predloga pa je lahko neberljiva za bralnik zaslona. Še huje, vsi trije standardi so omejitve notranje strukture datoteke in ne njenega videza. Dokument, ki se brez težav odpre v vsakem pregledovalniku, lahko še vedno ne opravi preverjanja skladnosti že ob prvem poskusu, kar se biasanya tudi zgodi.

Knjižnica HotPDF, losLabova izvorna knjižnica PDF za VCL, obravnava skladnost ako nekaj, kar določite, preden sploh obstaja prva stran. Nastavite lastnost skladnosti, dodate strukture, ki jih zahteva standard, in knjižnica ob shranjevanju zavrne konfiguracije, ki so v nasprotju s profilom. To je veliko boljši model kot ustvarjanje datoteke in upanje, da jo bo naknadni procesor lahko popravil, saj večine zahtev teh standardov ni mogoče dodati naknadno.

Trije standardi ISO, tri različne obljube

Standard PDF/A (ISO 19005) je povezan s časom. Obljublja, da se bo datoteka čez desetletja izrisala povsem enako, zato zahteva popolno samozadostnost: vgrajene vse pisave, vsaki barvi določen pomen neodvisno od naprave prek OutputIntent, polne metapodatke XMP in prepoved vsega, česar delovanje je odvisno od okolja. Šifriranje in JavaScript sta prepovedana, saj nihče ne more jamčiti, da bosta dešifrator ali skriptni pogon obstajala leta 2050.

Standard PDF/X (ISO 15930) se ukvarja z barvami na papirju. Obstaja zato, da lahko oblikovalec preda datoteko tiskarni brez odvečnih usklajevanj, kar pomeni specificirane pogoje tiskanja, obvezen ključ /Trapped, definirano geometrijo obreza in robov ter, pri različici X-1a, prepoved prosojnosti v živo (live transparency), ki bi jo moral RIP ugibati. Standard PDF/UA (ISO 14289) pa se ukvarja s tem, kdo lahko prebere rezultat. Pomožna tehnologija potrebuje celotno drevo oznak (tags), logičen vrstni red branja, določen jezik dokumenta in besedilne alternative za vse neslikovne elemente.

Ker ti trije standardi težijo v različne smeri, izberite vodilni standard glede na izhodni kanal in ne poskušajte ustvariti ene same datoteke, ki bi ustrezala vsem. Tiskarska predloga, ki vsebuje le barve CMYK, je povsem napačna stvar za uporabnika bralnika zaslona, ki barv sploh ne vidi, prav tako pa se stroge omejitve arhivskega profila glede dinamičnega delovanja izključujejo z interaktivnimi elementi. Ustvarjajte dokumente za vsak kanal posebej iz istih izvornih podatkov in se tako izognite celotnemu konfliktu.

PDF/A: OutputIntent je del, ki ga vsi pozabijo

Če datoteka PDF/A ne prestane preverjanja skladnosti, najprej preverite OutputIntent. To je struktura, ki jo generatorji najpogosteje izpustijo, ravno zato, ker od nje ni odvisno nič vidnega. Standard ISO 19005 jo zahteva: gre za vgrajen profil ICC, ki natančno določa pomen barv naprave v dokumentu. HotPDF zahteva, da ta profil določite eksplicitno:

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;   // embed real fonts, no Base-14 emulation
    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;

O uspehu preverjanja odloča nekaj podrobnosti. Lastnost StandardFontEmulation mora biti izklopljena: emulirane pisave Base-14 niso vgrajene, vgradnja pa je po standardu ISO 19005 obvezna. Šifriranje mora ostati onemogočeno, zato nikoli ne kombinirajte PDFACompliance z ActivateProtection; šifrirana arhivska datoteka je protislovje, ki ga preverjevalnik takoj zazna. Število komponent v metodi AddPDFAOutputIntent se mora ujemati s profilom, kar pomeni 3 za profil RGB (kot je sRGB IEC61966-2.1) in 4 za CMYK. HotPDF med zapisovanjem spremlja uporabo DeviceRGB in DeviceCMYK glede na deklarirani namen, zato se napačno CMYK polnilo v dokumentu z namenom RGB izpiše kot javljena napaka in ne mine neopazeno.

Omeniti velja še nekaj glede profila ICC: obravnavajte ga ako različico produkcijskega artefakta in ne kot datoteko, ki jo je nekdo nekoč odložil na razvojni strežnik. Njegovi bajti so vgrajeni v vsak dokument, ki ga ustvarite, zato lahko okrnjen ali poškodovan profil tiho pokvari celotno serijo, kar boste ugotovili šele med preverjanjem skladnosti. Priložite ga namestitvenemu programu, zabeležite njegovo kontrolno vsoto v dnevnik izvajanja in ga naložite prek vzorca TFileStream, prikazanega zgoraj, tako da bo manjkajoča datoteka povzročila glasno napako že med ustvarjanjem in ne tiho na arhivskih vratih.

PDF/X za tisk: Trapped, CMYK in tiskarski profil

Tiskarske predloge obrnejo zgodbo o barvah. Tiskarski stroj zahteva opredeljen CMYK, standard pa od vas zahteva izjavo, ali je bilo uporabljeno lovljenje barv (trapping), četudi je iskren odgovor ta, da nimate pojma. Ključ /Trapped je v vsakem primeru obvezen:

Pdf.PDFXCompliance := 'X-1a';
Pdf.Trapped := 'Unknown';        // mandatory key under 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;
// draw with CMYK-safe colors, no transparency, no encryption
Pdf.EndDoc;

Število komponent je zdaj 4 za tiskarski profil CMYK. Standard X-1a prepoveduje tudi prosojnost v živo, zato preglejte vso kodo za risanje, ki plasti polprosojne elemente; tisto, kar pregledovalnik sestavi na zaslonu, je natanko tisto, kar bo RIP zavrnil. Če vaša tiskarna pošlje drugačne specifikacije, zamenjajte bajte profila in identifikacijski niz, vendar pustite okoliško strukturo nedotaknjeno.

PDF/UA: struktura se ustvari sproti, nikoli naknadno

Dostopnost je standard, ki ga ekipe najpogosteje poskušajo dodati na koncu, vendar ta pristop kaznuje strožje kot druga dva. Drevo oznak mora odražati vrstni red, v katerem je bila vsebina logično ustvarjena, to pa so informacije, ki jih po zapisu datoteke preprosto nimate več. Nastavitev lastnosti PDFUACompliance omogoči označeni izhod, API za strukturo pa poveže vsak risarski klic z njegovo semantično vlogo sproti:

Pdf.PDFUACompliance := True;     // auto-enables tagged PDF
Pdf.Lang := 'en-US';             // set explicitly; empty falls back to '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;

Napaka, na katero morate paziti, je besedilo, izrisano zunaj katerega koli para BeginTaggedContent/EndTaggedContent. Takšno besedilo se izriše brezhibno, a ostane nevidno za bralnik zaslona, zato ga noben videči preizkuševalec ne bo opazil; hrošč se pokaže šele takrat, ko dejanski uporabnik pomožne tehnologije naleti na to vrzel. Če vaše predloge vsebujejo lastna imena strukturnih vlog, jih preslikajte na standardni nabor z metodo AddStructRoleMap('MyHead', 'H1'), da bodo skladni bralniki razumeli njihov pomen. Standard ISO 14289 zahteva tudi deklariran jezik. HotPDF uporabi privzeto vrednost 'en', ko je lastnost Lang prazna, vendar je to le varnostna mreža in ne razlog, da ne nastavite dejanskega jezika dokumenta.

Preverjanje: verjemite preverjevalniku in ne pregledovalniku

Pregledovalnik, ki uspešno odpre vašo datoteko, ne dokazuje skladnosti, zato preverjanje spada v produkcijski proces z orodji, ki preverjajo strukturo in ne upodabljanja. Za PDF/A in PDF/UA je veraPDF je referenčni odprti preverjevalnik; poroča o napakah po členih standardov ISO, kar se neposredno ujema z zgoraj opisano konfiguracijo. Za PDF/X so profili Preflight v programu Adobe Acrobat še vedno najbolj praktičen preizkus, saj je skladnost za tisk odvisna tako od barvnega namena kot od sintakse.

Generator opravi svoj del tega dela. Ob shranjevanju HotPDF uskladi zastavice funkcij z nastavljeno različico PDF, pri čemer tiho zniža ravni, ki jih različica ne podpira, na primer pretvorbo AES-256 v AES-128 pri različicah pod PDF 1.7. Pravila o skladnosti v EndDoc gredo še dlje in sprožijo izjemo ob očitnih protislovjih, kot je zahteva po PDFACompliance skupaj s šifriranjem. Noben od teh mehanizmov ne nadomešča zunanjega preverjevalnika. Le preprečujejo, da bi nemogoče konfiguracije sploh dosegle preverjanje.

Ena navada se vedno obrestuje: vodite različico celotne konfiguracije za skladnost kot celoto. Izdajo HotPDF, različico predloge, kontrolno vsoto profila ICC, različico preverjevalnika, ki je dal soglasje. Skladnost se lahko spremeni v trenutku, ko se kateri koli od teh delov spremeni neodvisno od drugih, revizije pa so najbolj neprijetne takrat, ko nihče ne more ugotoviti, katera kombinacija je ustvarila pet let staro arhivsko datoteko. En sam konfiguracijski zapis na serijo to težavo reši za vselej.

Nazadnje, preverjevalnik zaženite na dejanskih produkcijskih podatkih in nikoli na urejenem, ročno pripravljenem vzorcu. Napake, ki povzročajo največ preglavic, izvirajo iz podatkov, ki jih nihče ni pričakoval: logotip stranke, ki prispe v CMYK, medtem ko je namen RGB, sprememba predloge, ki vnese nevgrajeno pisavo, nova pot v kodi, ki izriše besedilo zunaj drevesa oznak. Shranite eno znano napačno datoteko iz vsakega preteklega incidenta kot testni primer za regresijo in nadzor skladnosti bo ostal zanesljiv tudi skozi čas. Za upodabljanje teh cevovodov si oglejte naš članek o izhodih poročil, pisavah in slikah s HotPDF; za integracijo preverjevalnikov v gradnjo pa je na voljo članek o avtomatizaciji preverjanja PDF preflight.

Lastnosti skladnosti, izhodni nameni in API za označevanje, uporabljeni v teh primerih, so del komponente HotPDF za Delphi in C++Builder; stran izdelka vsebuje povezavo do celotne reference za vsak prikazan klic.