Tehnički članak

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

PDF/E-1 je arhivski profil za inženjerske dokumente, i PDFlibPas ga implementira kao author mode koji uključujete s SetPDFEMode plus ograničeni preflight koji čita content streamove operator po operator. Profil nije PDF/A s drugom etiketom: ima vlastiti identification namespace, vlastiti zahtjev za lifecycle metadata i jedno pravilo koje čini validaciju sadržaja strožom nego u bilo kojem arhivskom profilu koji ste dosad sreli

Inženjerski isporučivi materijali su razlog postojanja profila. Skup nacrta koji mora biti čitljiv i dokazivo nepromijenjen za dvadeset godina, uz povijest revizija koja preživi, i uz boju koja znači isto na ploteru u drugoj zgradi. Ti zahtjevi proizvode specifikaciju čiji se zahtjevi većinom nalaze izvan sadržaja stranice, u metadati i upravljanju bojom, i upravo tamo generički PDF writer pogriješi

Vlastita identifikacija, ne varijacija na PDF/A

Prvo što treba shvatiti je da se PDF/E-1 identifikacija ne može proizvesti prilagodbom PDF/A ili PDF/X obrasca. Koristi poseban XMP namespace, http://www.aim.org/pdfe/ns/id/, i vrijednost verzije mora se pojaviti na dva mjesta: kao unos u document information i kao namespace-kvalificirano XMP svojstvo. Ispisivanje samo XMP svojstva, ili samo information unosa, proizvodi datoteku koja nosi namjeru i pada na validaciji

Output intent ima jednako specifičan oblik. PDF/E-1 zahtijeva ugrađeni ICC profil s identifikatorom podtipa ISO_PDFE1, i profil mora imati broj komponenti koji se poklapa s device color familijom koju dokument stvarno koristi. Ta posljednja klauzula je mjesto gdje implementacije tiho pogriješe, jer znači da se intent ne može odabrati unaprijed i zatim zaboraviti

Zašto device color treba pretragu cijelog dokumenta?

Zato se color prostori skrivaju u resource rječnicima do kojih skeniranje na razini stranice nikad ne dođe. PDF/E-1 tretira DeviceRGB i DeviceCMYK kao međusobno isključive familije za jedan dokument, pa validacija profila znači znati svaki device color space koji išta u datoteci koristi. Form XObject ima svoje resurse. Isto tako pattern, i isto tako slika. Tiling pattern unutar form XObjecta unutar stranice je tri razine duboko, i validator koji provjerava samo resurse najviše razine stranice prolavit će dokument koji koristi obje familije

Pretraga stoga registrira color prostore dok prolazi stranice, forme, slike i patterne kao jedan obilazak, i tek onda odlučuje je li dokument koherentan i odgovara li output intent. Isti razlog pokreće i preflight arhitekturu općenito: djelomični obilazak proizvodi lažne prolaze, a lažan prolaz na conformance provjeri je gori nego nikakva provjera, jer se biljež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 lifecycle metadata usklađenom pri svakom
    // spremanju. Pitajte prije spremanja prođe li dokument svoj gate
    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;

Lifecycle metadata je obveza pri svakom spremanju

PDF/E-1 traži više od identifikatora dokumenta. Minimalni skup uključuje media management identifikator dokumenta, identifikator verzije, rendition klasu, vrijeme stvaranja, vrijeme izmjene, vrijeme metadate i naslov. To je vokabular za praćenje revizija, i postoji jer se od inženjerskog isporučivog materijala očekuje da će biti ponovno izdan, a ne napisan jednom

Posljedica za implementaciju je da se ta polja ne mogu postaviti pri stvaranju dokumenta. Ako je vrijeme izmjene upisano kad ste uključili mod, a dokument je potom uređivan, XMP snapshot i stvarno stanje dokumenta su se razdvojili, i validator koji ih uspoređuje javlja nekonzistentnost koju nitko nije htio. Author mode stoga sinkronizira polja neposredno prije svakog spremanja, pa metadata opisuje bajtove koji tek trebaju biti upisani, a ne bajtove koji su postojali kad je mod uključen

To je općenito načelo za conformance metadata i vrijedi ga izreći odvojeno od PDF/E-a: izvedena metadata pripada putu spremanja, a ne putu uređivanja. Svako polje izračunato iz stanja dokumenta mora se ponovno izračunati u trenutku kada se stanje zamrzne, ili je cache bez invalidacije

PDFlibPas PDF/E-1 dijagram pretrage device colora cijelog dokumenta koja prolazi resource rječnike stranice, form XObjecta, tiling patterna i slike prikupljajući DeviceRGB i DeviceCMYK familije prije ocjene koherentnosti, uz lifecycle metadata polja koja author mode ponovno sinkronizira neposredno prije svakog spremanja da se XMP snapshot poklopi s bajtovima koji tek trebaju biti upisani
Coherentnost boja može se ocijeniti tek nakon što jedan obilazak dođe do svakog resource rječnika, a izvedena lifecycle metadata ponovno se izračunava u trenutku kad se stanje dokumenta zamrzne, a ne kad se mod uključi

Pravilo koje čini validaciju sadržaja strogom

PDF/E-1 ne dopušta da operatori compatibility sekcije upiju nepoznati sadržaj. U običnom PDF-u, BX i EX okružuju regiju u kojoj potrošač mora ignorirati operatore koje ne prepoznaje, i to je escape hatch koji proizvođaču omogućuje da emitira novije konstrukcije ne slamanjem starijih čitača. Pod PDF/E-1 taj je izlaz zatvoren, pa se svaki operator koji preflight ne prepozna javlja bezuvjetno, bilo unutar compatibility sekcije ili ne

Učinak na validator je značajan. Ne može preskočiti regije koje ne razumije, što znači da operand parser mora stvarno parsirati svaki operator u svakom content streamu. Tu na scenu stupa ograničavanje. Obilazak je ograničen na 128 razina ugniježđivanja, milijun objekata i 64 MiB sadržaja, i ta ograničenja nisu podešavanje performansi. Neprijateljska ili samo oštećena datoteka može prikazati graf objekata s ciklusima ili dubinom ugniježđivanja koja rekurzivni validator pretvori u stack overflow, i ograničenja su ono što sprječava da prolaz validacije postane denial-of-service vektor. Isti defanzivni pristup opisan je u sigurnom parsiranju nepouzdanih PDF-ova

// Neovisna validacija datoteke koju niste 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;

Što save gate popravlja a što odbija

Gate dijeli svoj rad u dvije faze, i ta je podjela upotrebljiva dizajnerska ideja i sama za sebe. Prvo normalizira stvari koje je sigurno popraviti: print zastavice anotacija, no-zoom i no-rotate zastavice na tekstnim anotacijama, i appearance-generation zastavicu na rječniku forme. To su postavke s jednom ispravnom vrijednošću pod profilom i bez informativnog sadržaja, pa ih je tiho popraviti ispravno, a odbijati zbog njih bila bi pedanterija

Zatim provjerava ograničenja koja se ne mogu popraviti bez mijenjanja onoga što dokument znači: verziju, identifikaciju, enkripciju, output intent, coherentnost device colora i prisutnost dinamičkog sadržaja forme. Dokument koji pada na bilo kojem od njih se odbija, jer bi izmišljanje output intenta ili odabir color familije u ime autora proizvelo datoteku koja prolazi validaciju a krivo prikazuje sadržaj

PDFlibPas PDF/E-1 dijagram save gatea za Delphi prikazujući ograničeni preflight koji skenira svaki content stream operator pod ograničenjima od 128 razina ugniježđivanja, milijun objekata i 64 MiB, tiho popravlja print, zoom i rotate zastavice anotacija, odbija pogrešnu verziju, identifikaciju, enkripciju, output intent, device color ili dinamički sadržaj forme, i javlja blockere kroz GetPDFEDiagnostics
Gate tiho popravlja samo ono što ne nosi informaciju, odbija svako ograničenje koje bi popravak izvrnuo, i pretvara odbijanje u popis blockera kroz GetPDFEDiagnostics prije nego ijedan bajt stigne na disk

Čitanje dijagnostike nazad kroz GetPDFEDiagnostics prije spremanja pretvara to odbijanje u listu na kojoj se može djelovati, umjesto u operaciju koja je pala. U batch pipelineu, pozovite je na svakom dokumentu, logirajte blockere po datoteci, i usmjerite padove u red kojeg čovjek pregledava. To je daleko korisnije od spremanja koje baca iznimku, jer se blocker obično grupiraju: četrdeset dokumenata koji padaju na istom nedostajućem output intentu je jedan popravak, ne četrdeset

Odabir između arhivskih profila

PDF/E-1 je pravi cilj kada je isporučivi materijal inženjerska dokumentacija s revizijskim životnim ciklusom, i osobito kada je coherentnost device colora bitna jer izlaz ide na plotere i printere velikog formata. PDF/A je pravi cilj kada je cilj dugoročna čitljivost dokumenata općenito, i to je profil s najšrom podrškom validatora. Ta dva nisu zamjenjiva, i dokument može zadovoljiti jedan a pasti na drugom

PDFlibPas dijagram odluke koji uspoređuje PDF/E-1 i PDF/A arhivske profile za Delphi: PDF/E-1 za inženjerske isporučive materijale s revizijskim ciklusima, ploter bojom i ugovornom validacijom pod vlastitim XMP namespaceom s ISO_PDFE1 output intentom, PDF/A za općenitu dugoročnu čitljivost s najšrom podrškom validatora
Krenite od toga tko validira datoteku na kraju lanca: profili traže različite identifikacije, metadate i garancije boja, i dokument može zadovoljiti jedan a pasti na drugom

Ako birate, krenite od toga tko validira datoteku na kraju lanca. PDF/A validacijski alati su posvuda, a odgovarajući preflight u PDFlibPasu opisan je u PDF/A i PDF/UA preflightu. PDF/E validacija je specijaliziranija i obično je ugovorni zahtjev, a ne zadano ponašanje. Kad postojeći arhiv treba dovesti do profila za koji nikad nije pisan, put popravka metadate u pretvorbi u PDF/A s popravkom metadate je obrazac kojeg treba slijediti, i isti oblik vrijedi ovdje: identificiraj, popravi što je sigurno, odbij ostalo s popisom

Author mode, ograničeni content preflight i neovisna compliance provjera svi dolaze uz PDFlibPas Delphi PDF biblioteku, pa dokument može biti proizveden pod profilom i neovisno verificiran poslije kroz odvojeni kodni put, što je jedini aranžman vrijedan povjerenja za conformance tvrdnju