Tehnički članak

PDF/E-1 inženjerski dokumenti u Delphi-ju uz PDFlibPas

PDF/E-1 je arhivski profil za inženjerske dokumente, i PDFlibPas ga implementira kao author mode koji uključujete sa SetPDFEMode plus ograničenim preflight-om koji čita content stream-ove operator po operator. Profil nije PDF/A sa drugom nalepnicom: ima svoj identifikacioni namespace, svoj zahtev za metapodatke životnog ciklusa i jedno pravilo koje čini validaciju sadržaja strožom nego u bilo kom arhivskom profilu koji ste do sada sreli

Inženjerski isporučljivi rezultati su razlog postojanja ovog profila. Zbirka crteža koja mora biti čitljiva i dokazano nepromenjena i za dvadeset godina, sa istorijom revizija koja preživi, i sa bojama koje znače isto na ploteru u drugoj zgradi. Ti zahtevi proizvode specifikaciju čije se tražbe nalaze uglavnom van sadržaja strane, u metapodacima i upravljanju bojama, i upravo tamo generički PDF pisac pogrešava

Sopstvena identifikacija, ne varijacija na PDF/A

Prvo što treba uklopiti je da se PDF/E-1 identifikacija ne može proizvesti prilagođavanjem PDF/A ili PDF/X obrasca. Koristi poseban XMP namespace, http://www.aim.org/pdfe/ns/id/, i vrednost verzije mora da se pojavi na dva mesta: kao stavka u document information-u i kao namespace-qualified XMP svojstvo. Emitovanje samo XMP svojstva, ili samo information stavke, proizvodi datoteku koja nosi nameru a pada na validaciji

Output intent ima jednako specifičan oblik. PDF/E-1 zahteva ugrađen ICC profil sa podtip identifikatorom ISO_PDFE1, i profil mora imati broj komponenti koji se poklapa sa familijom boja uređaja koju dokument stvarno koristi. Poslednja klauzula je mesto gde implementacije tiho pogrešavaju, jer ona znači da intent ne može biti izabran unapred i zatim zaboravljen

Zašto boje uređaja treba pretragu celog dokumenta?

Zato što se color space-ovi kriju u resource rečnicima do kojih sken na nivou strane nikada ne dopire. PDF/E-1 tretira DeviceRGB i DeviceCMYK kao međusobno isključive familije za jedan dokument, pa validacija profila znači poznavanje svakog device color space-a koji bilo šta u datoteci koristi. Form XObject ima svoje resurse. Isto važi za pattern, i isto za sliku. Tiling pattern unutar form XObject-a unutar strane je tri nivoa duboko, i validator koji proverava samo resurse najvišeg nivoa strane propustiće dokument koji koristi obe familije

Pretraga zato evidentira color space-ove dok prolazi kroz strane, forme, slike i pattern-e kao jedan obilazak, i tek onda odlučuje da li je dokument koherentan i da li output intent odgovara. Isto razmišljanje pokreće i celu arhitekturu preflight-a: delimičan obilazak proizvodi lažne prolaze, a lažan prolaz na proveri usaglašenosti je gori od nijedne provere, jer se beleži kao dokaz

var
  Lib: TPDFlib;
  Diag: WideString;
begin
  Lib := TPDFlib.Create(nil);
  try
    Lib.LoadFromFile('assembly-drawings.pdf');

    if Lib.SetPDFEMode(1) = 0 then
      raise Exception.Create('PDF/E author mode was refused');

    // Author mode drži metapodatke životnog ciklusa usklađenim pri svakom čuvanju.
    // Pitaj pre čuvanja da li bi dokument prošao svoju kapiju
    if not Lib.PDFEReadyForSave then
    begin
      Diag := Lib.GetPDFEDiagnostics;
      Writeln('PDF/E blockers: ', Diag);
      Exit;
    end;

    Lib.SaveToFile('assembly-drawings-pdfe.pdf');
  finally
    Lib.Free;
  end;
end;

Metapodaci životnog ciklusa su obaveza pri svakom čuvanju

PDF/E-1 traži više od identifikatora dokumenta. Minimalni skup uključuje media management identifikator dokumenta, identifikator verzije, rendition klasu, vreme nastanka, vreme izmene, vreme metadata-a i naslov. To je vokabular za praćenje revizija, i postoji jer se od inženjerskog isporučljivog rezultata očekuje da bude ponovo izdat, a ne da bude napisan jednom

Posledica po implementaciju je da ta polja ne mogu biti postavljena pri stvaranju dokumenta. Ako se vreme izmene upiše kad uključite režim, a dokument se posle uređuje, XMP snimak i stvarno stanje dokumenta su se razbežali, i validator koji ih poredi prijavljuje nekonzistentnost koju niko nije nameravao. Author mode zato sinhronizuje polja neposredno pre svakog čuvanja, tako da metapodaci opisuju bajtove koji tek treba da se upišu, a ne bajtove koji su postojali kad je režim uključen

To je opšti princip za conformance metapodatke i vredi ga izdvojiti od PDF/E-a: izvedeni metapodaci pripadaju putanji čuvanja, a ne putanji uređivanja. Svako polje izračunato iz stanja dokumenta mora se ponovo izračunati u trenutku kad se stanje zamrzne, ili je keš bez poništavanja

PDFlibPas PDF/E-1 dijagram pretrage boja uređaja na nivou celog dokumenta koja prolazi kroz resource rečnike strane, form XObject-a, tiling pattern-a i slike i sakuplja DeviceRGB i DeviceCMYK familije pre ocene koherentnosti, uz polja metapodataka životnog ciklusa koje author mode ponovo sinhronizuje neposredno pre svakog čuvanja tako da XMP snimak odgovara bajtovima koji tek treba da se upišu
Bojna koherentnost može se oceniti tek kad jedan obilazak dopre do svakog resource rečnika, a izvedeni metapodaci životnog ciklusa se ponovo računaju u trenutku kad se stanje dokumenta zamrzne, a ne kad je režim uključen

Pravilo koje čini validaciju sadržaja strogom

PDF/E-1 ne dopušta da operatori compatibility sekcije upiju nepoznat sadržaj. U običnom PDF-u, BX i EX ograđuju region u kojem potrošač mora da ignoriše operatore koje ne prepoznaje, i to je beg koji proizvođaču dopušta da emituje novije konstrukcije ne lomivši starije čitače. Pod PDF/E-1 tim begom je zatvoren, pa svaki operator koji preflight ne prepoznaje prijavljuje se bezuslovno, bio on unutar compatibility sekcije ili ne

Efekat po validatora je značajan. Ne može da preskoči regione koje ne razume, što znači da parser operanada stvarno mora da raščlani svaki operator u svakom content stream-u. Tu nastupaju granice. Obilazak je ograničen na 128 nivoa ugnježđivanja, milion objekata i 64 MiB sadržaja, i ta ograničenja niju štelovanje performansi. Neprijateljski ili samo pokvarena datoteka može da prikaže graf objekata sa ciklusima ili dubinu ugnježđivanja koja od rekurzivnog validatora pravi stack overflow, i ograničenja su ono što sprečava da validacioni prolaz postane vektor denial-of-service napada. Isti odbrambeni stav opisan je u članku o bezbednom raščlanjivanju nepouzdanih PDF-ova

// Samostalna validacija datoteke koju niste vi proizveli, bez
// učitavanja u instancu dokumenta
var
  Issues: TStringList;
  Stream: TFileStream;
  I: Integer;
begin
  Issues := TStringList.Create;
  Stream := TFileStream.Create('incoming.pdf', fmOpenRead or fmShareDenyWrite);
  try
    if CheckCompliancePDFE(Stream, '', 0, Issues) = 0 then
      for I := 0 to Issues.Count - 1 do
        Writeln('PDF/E: ', Issues[I]);
  finally
    Stream.Free;
    Issues.Free;
  end;
end;

Šta kapija pri čuvanju popravlja, a šta odbija

Kapija deli svoj posao na dve faze, i ta podela je upotrebljiva dizajnerska ideja i sama za sebe. Prvo normalizuje ono što se bezbedno može popraviti: print zastavice anotacija, no-zoom i no-rotate zastavice na tekst anotacijama i appearance-generation zastavicu na form rečniku. To su podešavanja sa jednom ispravnom vrednošću pod profilom i bez ijednog sadržaja informacije, pa ih je tiho popraviti ispravno, a odbiti zbog njih bila bi pedanterija

Zatim proverava ograničenja koja se ne mogu popraviti a da se ne promeni ono što dokument znači: verzija, identifikacija, enkripcija, output intent, koherentnost boja uređaja i prisustvo dinamičkog form sadržaja. Dokument koji padne na bilo kojem od tih se odbija, jer bi izmišljanje output intent-a ili biranje familije boja u ime autora proizvelo datoteku koja prolazi validaciju a krivo prikazuje sadržaj

PDFlibPas PDF/E-1 dijagram kapije pri čuvanju za Delphi koji prikazuje ograničeni preflight koji skenira svaki operator content stream-a pod ograničenjima od 128 nivoa ugnježđivanja, milion objekata i 64 MiB, tiho popravlja print, zoom i rotate zastavice anotacija, odbija pogrešnu verziju, identifikaciju, enkripciju, output intent, boju uređaja ili dinamički form sadržaj, i prijavljuje prepreke kroz GetPDFEDiagnostics
Kapija tiho popravlja samo ono što ne nosi informaciju, odbija svako ograničenje koje bi popravka iskrivila, i odbijanje pretvara u spisak prepreka kroz GetPDFEDiagnostics pre nego što ijedan bajt stigne na disk

Čitanje dijagnostike kroz GetPDFEDiagnostics pre čuvanja pretvara to odbijanje u spisak sa kojim se može nešto uraditi, a ne u pao operaciju. U batch pipeline-u, pozovite je nad svakim dokumentom, logujte prepreke po datoteci i usmerite padove u red koji čovek pregleda. To je daleko korisnije od čuvanja koje baca izuzetak, jer se prepreke obično gomilaju: četrdeset dokumenata koji padaju na isti nedostajući output intent je jedna popravka, ne četrdeset

Izbor između arhivskih profila

PDF/E-1 je prava meta kad je isporučljivi rezultat inženjerska dokumentacija sa životnim ciklusom revizija, i konkretno kad koherentnost boja uređaja znači, jer izlaz ide na plotere i printere velikog formata. PDF/A je prava meta kad je cilj dugoročna čitljivost dokumenata uopšte, i to je profil sa najširom podrškom validatora. Ta dva nisu zamenljiva, i dokument može zadovoljiti jedan a pasti na drugom

PDFlibPas dijagram odlučivanja koji poredi PDF/E-1 i PDF/A arhivske profile za Delphi: PDF/E-1 za inženjerske isporučljive rezultate sa životnim ciklusom revizija, bojama plotera i ugovornom validacijom pod sopstvenim XMP namespace-om sa ISO_PDFE1 output intent-om, PDF/A za opštu dugoročnu čitljivost sa najširom podrškom validatora
Krenite od toga ko na kraju lanca validira datoteku: profili traže različite garancije identifikacije, metapodataka i boja, i dokument može zadovoljiti jedan a pasti na drugom

Ako birate, krenite od toga ko na kraju lanca validira datoteku. PDF/A validaciona alatka je svuda, i odgovarajući preflight u PDFlibPas-u opisan je u PDF/A i PDF/UA preflight-u. PDF/E validacija je specijalizovanija i obično je ugovoren zahtev, a ne podrazumevana. Kad postojeću arhivu treba dovesti do profila za koji nikada nije pisana, putanja popravke metapodataka iz konverzije u PDF/A uz popravku metapodataka je obrazac koji treba pratiti, i isti oblik važi i ovde: identifikuj, popravi ono što je bezbedno, ostalo odbi sa spiskom

Author mode, ograničeni content preflight i samostalna compliance provera stižu uz PDFlibPas Delphi PDF biblioteku, tako da dokument može biti proizveden pod profilom i nezavisno proveren posle kroz odvojen kodni put, a to je jedini aranžman vredan poverenja kad je conformance tvrdnja u pitanju