Technical Article

PDF/A, PDF/X i PDF/UA izlaz u Delphiju: HotPDF vodič

PDF/A, PDF/X i PDF/UA tri su različita standarda koji rješavaju tri različita problema: dugoročno arhiviranje, pripremu za ispis i pristupačnost. Oni nisu samo tri potvrdna okvira na jednom obrascu o usklađenosti, a najčešća pogreška je tretirati ih kao da jesu. Datoteka može biti besprijekoran PDF/A i potpuno neupotrebljiva za tiskaru; savršen grafički predložak za tisak može biti nečitljiv čitaču zaslona. Što je još gore, sva tri standarda su ograničenja za unutarnju strukturu datoteke, a ne za njezin izgled. Dokument koji se čisto otvara u svakom pregledniku koji posjedujete i dalje može pasti na provjeri valjanosti već pri prvom pokušaju, što se obično i događa.

HotPDF, losLabova izvorna VCL PDF knjižnica, tretira usklađenost kao nešto što deklarirate prije nego što prva stranica uopće postoji. Postavljate svojstvo usklađenosti, prilažete strukture koje standard zahtijeva, a knjižnica pri spremanju odbija konfiguracije koje su u suprotnosti s profilu. To je bolji model od generiranja datoteke i nadanja da će je naknadni procesor uspjeti prilagoditi jer se većina onoga što ovi standardi zahtijevaju ne može dodati naknadno.

Tri ISO standarda, tri različita obećanja

PDF/A (ISO 19005) se bavi vremenom. Obećava da će se datoteka i desetljećima kasnije prikazivati identično, pa zahtijeva potpunu samodostatnost: svaki font mora biti ugrađen, svakoj boji mora biti dodijeljeno značenje neovisno o uređaju putem OutputIntent-a, metapodaci moraju biti u potpunom XMP formatu, a zabranjeno je sve čije ponašanje ovisi o okruženju. Šifriranje i JavaScript su isključeni jer nitko ne može jamčiti da će program za dešifriranje ili skriptni mehanizam postojati 2050. godine.

PDF/X (ISO 15930) se bavi bojom na papiru. Postoji kako bi dizajner mogao predati datoteku tiskari bez potrebe za dodatnim raspravama, što znači karakterizirane uvjete tiska, obvezni ključ /Trapped, definirane geometrije obrezivanja (trim) i napusta (bleed), te, u inačici X-1a, bez prozirnosti (transparency) kako je rasterizator (RIP) ne bi morao nagađati. PDF/UA (ISO 14289) se bavi time tko može pročitati rezultat. Asistivna tehnologija zahtijeva cjelovito stablo oznaka (tag tree), razuman redoslijed čitanja, deklarirani jezik dokumenta i tekstualne alternative za sve što nije tekst.

Budući da ova tri standarda teže u različitim smjerovima, odaberite mjerodavni standard prema izlaznom kanalu umjesto da pokušavate stvoriti jednu datoteku koja zadovoljava sve njih. Grafički predložak isključivo u CMYK formatu potpuno je pogrešan izbor za korisnika čitača zaslona koji ne vidi boje, a blokada dinamičkog ponašanja u arhivskom profilu u suprotnosti je s bilo kakvim interaktivnim elementima. Generirajte izlaz po kanalu iz istih izvornih podataka i izbjeći ćete cijeli konflikt.

PDF/A: OutputIntent je dio koji svi zaboravljaju

Ako PDF/A datoteka padne na provjeri, OutputIntent je prva stvar koju treba provjeriti. To je struktura koju generatori najčešće preskaču, upravo zato što ništa vidljivo ne ovisi o njoj. ISO 19005 zahtijeva jednu takvu strukturu: ugrađeni ICC profil koji točno određuje što boje uređaja u dokumentu zapravo znače. HotPDF čini taj profil eksplicitnim unosom, a ne naknadnom mišlju:

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;

Nekoliko detalja ovdje odlučuje o prolazu ili padu. StandardFontEmulation mora biti isključen: emulirani Base-14 fontovi nisu ugrađeni, a ugradnja je obvezna prema ISO 19005. Šifriranje mora ostati onemogućeno, stoga nikada nemojte kombinirati PDFACompliance s ActivateProtection; šifrirana arhivska datoteka je kontradikcija koju validator odmah prepoznaje. Broj komponenti u AddPDFAOutputIntent mora odgovarati profilu, što je 3 za RGB profil poput sRGB IEC61966-2.1 i 4 za CMYK. HotPDF prati upotrebu DeviceRGB i DeviceCMYK u odnosu na deklariranu namjeru dok piše, pa se slučajno CMYK punjenje u dokumentu s RGB namjerom pretvara u prijavljeni problem, a ne u tihi.

Još jedna stvar koju vrijedi reći o ICC profilu: tretirajte ga kao verzirani artefakt implementacije, a ne kao datoteku koju je netko jednom ostavio na poslužitelju za izgradnju. Njezini bajtovi ugrađeni su u svaki dokument koji generirate, pa skraćeni ili oštećeni profil tiho truje cijelu seriju, a to saznajete tek u trenutku provjere. Isporučite ga s instalacijskim programom, zabilježite njegov kontrolni zbroj (checksum) u dnevnik rada i učitajte ga pomoću gore prikazanog predloška TFileStream, kako bi nedostatak datoteke uzrokovao jasnu pogrešku tijekom generiranja, a ne tihi pad na arhivskim vratima.

PDF/X za tisak: Trapped, CMYK i profil tiskarskog stroja

Grafički predlošci za tisak preokreću priču o bojama. Tiskarski stroj zahtijeva karakterizirani CMYK, a standard vas tjera da izjavite je li primijenjen trapping (uklapanje boja) čak i kada je iskren odgovor da nemate pojma. Ključ /Trapped je bez obzira na to obvezan:

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;

Broj komponenti sada je 4 za CMYK profil tiskarskog stroja. X-1a također zabranjuje živu prozirnost, stoga provjerite sav kod za crtanje koji slaže poluprozirne elemente; ono što preglednik spaja na zaslonu upravo je ono što će RIP odbiti interpretirati. Kada vaša tiskara pošalje drugačiju karakterizaciju, zamijenite bajtove profila i identifikacijski niz, ali ostavite okolnu strukturu nepromijenjenom.

PDF/UA: struktura se generira, nikada se ne ugrađuje naknadno

Pristupačnost je standard koji timovi najčešće pokušavaju dodati na samom kraju, a taj pristup biva kažnjen teže od ostala dva. Stablo oznaka mora odražavati redoslijed kojim je sadržaj logički stvoren, a to su informacije koje jednostavno više nemate nakon što je datoteka zapisana. Postavljanje PDFUACompliance uključuje označeni (tagged) izlaz, a API za strukturu povezuje svaki poziv crtanja s njegovom semantičkom ulogom dok radite:

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;

Pogreška na koju treba paziti jest tekst iscrtan izvan bilo kojeg para BeginTaggedContent/EndTaggedContent. On se prikazuje savršeno i ostaje nevidljiv čitaču zaslona, pa ga nijedan ispitivač koji vidi ne može uočiti; bug se isporučuje i pojavljuje tek kada stvarni korisnik asistivne tehnologije naiđe na tu prazninu. Kada vaši predlošci nose prilagođene nazive uloga strukture, preslikajte ih na standardni skup pomoću AddStructRoleMap('MyHead', 'H1') kako bi usklađeni preglednici znali što znače. ISO 14289 također zahtijeva deklarirani jezik. HotPDF se vraća na 'en' kada je Lang prazan, ali to je samo sigurnosna mreža, a ne razlog da stvarni jezik dokumenta ostane nepostavljen.

Provjera: vjerujte validatoru, a ne pregledniku

Preglednik koji otvara vašu datoteku ne dokazuje ništa o usklađenosti, stoga provjera pripada procesu izdavanja pomoću alata koji provjeravaju strukturu, a ne samo prikazivanje. Za PDF/A i PDF/UA, veraPDF je referentni otvoreni validator; on prijavljuje pogreške po ISO klauzulama, što se izravno povezuje s gornjom konfiguracijom. Za PDF/X, profili Preflight u Adobe Acrobatu i dalje su praktična provjera jer se usklađenost za tisak bavi namjerom boja jednako kao i sintaksom.

Generator radi svoj dio posla. Pri spremanju, HotPDF usklađuje flagove značajki s konfiguriranom verzijom PDF-a, tiho spuštajući ono što verzija ne može izraziti, poput prelaska AES-256 na AES-128 ispod verzije PDF 1.7. Sigurnosni uvjeti usklađenosti u EndDoc idu i korak dalje te javljaju pogrešku u slučaju jasnih kontradikcija, kao što je traženje PDFACompliance zajedno sa šifriranjem. Ništa od ovoga ne zamjenjuje vanjski validator. Oni samo sprječavaju da nemoguće konfiguracije uopće dođu do njega.

Jedna navika se višestruko isplati: pratite verziju cijele postavke usklađenosti kao jedne cjeline. Izdanje HotPDF-a, reviziju predloška, kontrolni zbroj ICC profila, verziju validatora koja je dala odobrenje. Usklađenost se gubi u trenutku kada se bilo koja od tih stavki promijeni neovisno o drugima, a najneugodnije revizije su one u kojima nitko ne može rekonstruirati koja je kombinacija proizvela arhivsku datoteku staru pet godina. Jedinstveni zapis konfiguracije po seriji rješava to zauvijek.

Na kraju, pokrenite validator na stvarnom produkcijskom izlazu, nikada na uredno ručno pripremljenom uzorku. Pogreške koje stvaraju probleme dolaze iz podataka koje nitko nije predvidio: korisnički logotip koji stigne u CMYK formatu dok namjera kaže RGB, izmjena predloška koja provuče neugrađeni font, nova putanja koda koja crta tekst izvan stabla oznaka. Čuvajte po jednu poznatu neispravnu datoteku iz svakog prošlog incidenta kao regresijski unos i provjera usklađenosti ostane pouzdana tijekom vremena. Za stranu renderiranja ovih cjevovoda pogledajte naš članak o izlazu izvješća, fontovima i slikama s HotPDF-om; za integraciju validatora u proces izgradnje, postoji prateći članak o automatizaciji PDF preflight provjera.

Svojstva usklađenosti, namjere izlaza i API za označavanje korišteni u ovim primjerima dolaze s komponentom HotPDF Component za Delphi i C++Builder; stranica proizvoda sadrži poveznicu na cjelovitu referencu za svaki ovdje prikazani poziv.