Technical Article

Izvoz u PDF/A, PDF/X i PDF/UA formate u Delphi-ju: HotPDF vodič

PDF/A, PDF/X i PDF/UA su tri različita standarda koja rešavaju tri različita problema: dugoročno arhiviranje, pripremu za štampu i pristupačnost. To nisu tri kućice za potvrdu na jednom obrascu o usaglašenosti, a najčešća greška je tretiranje ovih standarda kao da jesu. Fajl može biti savršen PDF/A i potpuno neupotrebljiv za štampariju; savršen master za štampu može biti nečitljiv čitaču ekrana. Što je još gore, sva tri standarda predstavljaju ograničenja za unutrašnju strukturu fajla, a ne za to kako on izgleda. Dokument koji se čisto otvara u svakom programu za pregled koji posedujete i dalje može da padne na validaciji iz prvog pokušaja, što se obično i dešava.

HotPDF, losLab-ova izvorna VCL PDF biblioteka, tretira usaglašenost kao nešto što deklarišete pre nego što prva stranica uopšte nastane. Vi podešavate svojstvo usaglašenosti, prilažete strukture koje standard zahteva, a biblioteka odbija konfiguracije koje su u suprotnosti sa profilom u trenutku čuvanja. To je bolji model od generisanja fajla i nade da ga naknadni procesor može prepraviti, jer se većina onoga što ovi standardi zahtevaju ne može dodati naknadno.

Tri ISO standarda, tri različita obećanja

PDF/A (ISO 19005) se odnosi na vreme. Obećava da će se fajl identično renderovati i decenijama od sada, pa zahteva potpunu samodovoljnost: svaki font mora biti ugrađen (embedded), svakoj boji mora biti dodeljeno značenje nezavisno od uređaja kroz OutputIntent strukturu, zahtevaju se kompletni XMP metapodaci i zabranjuje se sve čije ponašanje zavisi od okruženja. Šifrovanje i JavaScript su isključeni, jer niko ne može da garantuje da će program za dešifrovanje ili skriptni mehanizam postojati 2050. godine.

PDF/X (ISO 15930) se bavi bojom na papiru. Postoji da bi dizajner mogao da preda fajl štampariji bez potrebe za dodatnim razgovorima, što podrazumeva karakteristične uslove štampanja, obavezan ključ /Trapped, definisanu geometriju opsecanja i margina (trim i bleed), i, u varijanti X-1a, odsustvo aktivne providnosti o kojoj bi rasterizator (RIP) morao da nagađa. PDF/UA (ISO 14289) se odnosi na to ko može da pročita rezultat. Asistivna tehnologija zahteva kompletno stablo tagova, logičan redosled čitanja, deklarisan jezik dokumenta i tekstualne alternative za sve što nije tekst.

Pošto ova tri standarda vuku u različitim smerovima, izaberite vodeći standard po izlaznom kanalu, umesto da pokušavate da napravite jedan fajl koji zadovoljava sve njih. CMYK-only master za štampu je potpuno pogrešna stvar za korisnika čitača ekrana koji nikada ne vidi boju, a zaključavanje dinamičkog ponašanja u arhivskom profilu kosi se sa bilo čim interaktivnim. Generišite dokumente po kanalima iz istih izvornih podataka i izbeći ćete ceo konflikt.

PDF/A: OutputIntent je deo koji svi zaboravljaju

Ako PDF/A fajl padne na validaciji, OutputIntent je prva stvar koju treba proveriti. To je struktura koju generatori najčešće preskaču, upravo zato što ništa vidljivo ne zavisi od nje. ISO 19005 zahteva njeno prisustvo: ugrađeni ICC profil koji tačno definiše šta boje uređaja u dokumentu zapravo znače. HotPDF čini ovaj profil eksplicitnim ulazom, a ne nečim o čemu se razmišlja naknadno:

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 ovde odlučuje o prolazu ili padu. Svojstvo StandardFontEmulation mora biti isključeno: emulirani Base-14 fontovi nisu ugrađeni, a ugradnja je obavezna po standardu ISO 19005. Šifrovanje mora ostati onemogućeno, tako da nikada nemojte kombinovati PDFACompliance sa ActivateProtection; šifrovani arhivski fajl je kontradiktornost koju validator odmah detektuje. Broj komponenti u AddPDFAOutputIntent mora odgovarati profilu, što je 3 za RGB profil kao što je sRGB IEC61966-2.1 i 4 za CMYK. HotPDF prati upotrebu DeviceRGB i DeviceCMYK modela u odnosu na deklarisanu nameru tokom upisa, tako da zalutalo CMYK popunjavanje u dokumentu sa RGB namerom postaje prijavljeni problem, a ne tiha greška.

Još jedna stvar koju vredi napomenuti u vezi sa ICC profilom: tretirajte ga kao verziran produkcijski artifakt, a ne kao fajl koji je neko nekada ostavio na razvojnom serveru. Njegovi bajtovi su ugrađeni u svaki dokument koji generišete, pa oštećen ili skraćen profil tiho kvari čitavu seriju, što saznajete tek u vreme validacije. Isporučite ga sa svojim instalaterom, zabeležite njegov kontrolni zbir (checksum) u dnevnik rada i učitajte ga preko TFileStream šablona prikazanog iznad, kako bi nedostatak fajla izazvao grešku tokom generisanja, a ne tiho na kapiji arhive.

PDF/X za štampu: Trapped, CMYK i profil štamparske mašine

Masteri za štampu obrću priču o bojama. Štamparska mašina zahteva karakterističan CMYK model, a standard vas primorava da navedete da li je primenjeno uklapanje boja (trapping), čak i kada je iskren odgovor da nemate pojma. Ključ /Trapped je obavezan u svakom slučaju:

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 je sada 4 za CMYK štamparski profil. X-1a takođe zabranjuje aktivnu providnost, pa proverite sav kod za crtanje koji koristi polutransparentne elemente; ono što čitač kombinuje na ekranu je upravo ono što će rasterizator (RIP) odbiti da interpretira. Kada vaša štamparija pošalje drugačiju karakterizaciju, zamenite bajtove profila i identifikacioni string, ali ostavite okolnu strukturu nepromenjenu.

PDF/UA: struktura se generiše, nikada se ne prepravlja naknadno

Pristupačnost je standard koji timovi najčešće pokušavaju da dodaju na samom kraju, a taj pristup se kažnjava strože nego kod prethodna dva standarda. Stablo tagova mora odražavati redosled kojim je sadržaj logički kreiran, a to su informacije koje jednostavno više nemate kada je fajl već zapisan. Podešavanje PDFUACompliance uključuje tagovani izlaz, a strukturni API povezuje svaki poziv crtanja sa njegovom semantičkom ulogom u hodu:

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;

Greška na koju treba obratiti pažnju jeste tekst nacrtan van bilo kog para BeginTaggedContent/EndTaggedContent. On se renderuje savršeno, ali ostaje nevidljiv za čitač ekrana, pa ga nijedan tester koji vidi ne može uočiti; bag odlazni u produkciju i pojavljuje se tek kada stvarni korisnik asistivne tehnologije naiđe na tu prazninu. Kada vaši šabloni nose prilagođena imena strukturnih uloga, mapirajte ih na standardni skup pomoću AddStructRoleMap('MyHead', 'H1') kako bi čitači znali šta znače. Standard ISO 14289 also zahteva deklarisan jezik. HotPDF prelazi na 'en' kada je Lang prazno, ali to je samo sigurnosna mreža, a ne razlog da ostavite stvarni jezik dokumenta nepodešenim.

Verifikacija: verujte validatoru, a ne programu za pregled

Čitač koji otvara vaš fajl ne dokazuje ništa o usaglašenosti, pa verifikacija pripada produkcijskom toku sa alatima koji proveravaju strukturu, a ne renderovanje. Za PDF/A i PDF/UA, veraPDF je referentni javni validator; on prijavljuje neuspehe prema ISO klauzulama, što se direktno preslikava na gornju konfiguraciju. Za PDF/X, Adobe Acrobat Preflight profili su i dalje praktičan izbor, jer se usaglašenost za štampu odnosi podjednako na nameru boja kao i na sintaksu.

Generator obavlja svoj deo ovog posla. Prilikom čuvanja, HotPDF usklađuje flegove funkcija sa konfigurisanom PDF verzijom, tiho spuštajući na niži nivo ono što verzija ne može da izrazi, kao što je pad sa AES-256 na AES-128 za verzije starije od PDF 1.7. Bezbednosne provere u EndDoc idu korak dalje i prijavljuju greške kod teških kontradiktornosti, kao što je zahtevanje PDFACompliance zajedno sa šifrovanjem. Nijedna od ovih provera ne menja eksterni validator. One samo sprečavaju da nemoguće konfiguracije uopšte stignu do njega.

Jedna navika se višestruko isplati: verzirajte celokupno podešavanje usaglašenosti kao jednu celinu. Izdanje HotPDF-a, reviziju šablona, kontrolni zbir ICC profila, verziju validatora koji je odobrio izlaz. Usaglašenost se narušava čim se bilo koji od ovih elemenata promeni, a najteže revizije su one gde niko ne može da rekonstruiše koja je kombinacija proizvela fajl arhive star pet godina. Jedinstven zapis o konfiguraciji po seriji rešava to za sva vremena.

Na kraju, pokrenite validator na stvarnom produkcijskom izlazu, nikada na uredno ručno pripremljenom uzorku. Problemi koji se javljaju dolaze iz podataka koje niko nije predvideo: logotip klijenta koji stiže kao CMYK dok namera kaže RGB, promena šablona koja uvodi neugrađeni font, nova putanja koda koja crta tekst van stabla tagova. Čuvajte po jedan poznato loš fajl iz svakog prošlog incidenta kao regresioni ulaz i bezbednosni mehanizam usaglašenosti će ostati pouzdan tokom vremena. Za renderovanje ovih tokova obrade pogledajte naš članak o izlazu izveštaja, fontovima i slikama uz HotPDF; za povezivanje validatora u proces izgradnje (build), tu je prateći članak o automatizaciji PDF preflight provera.

Svojstva usaglašenosti, izlazne namere i API za tagovanje korišćeni u ovim primerima isporučuju se uz HotPDF komponentu za Delphi i C++Builder; stranica proizvoda sadrži link do kompletne dokumentacije za svaki ovde prikazani poziv.