Tehnični članak

Inženirska dokumentacija PDF/E-1 v Delphi s PDFlibPas

PDF/E-1 je arhivski profil za inženirske dokumente, PDFlibPas pa ga izvaja kot avtorski način, ki ga vklopite s SetPDFEMode, in omejenim predhodnim preverjanjem (preflight), ki bere vsebinske toke operator po operator. Profil ni PDF/A z drugačno oznako: ima svoj imenski prostor za identifikacijo, svojo zahtevo po metapodatkih življenjskega cikla in eno pravilo, ki validacijo vsebine naredi strožjo kot kateri koli arhivski profil, ki ste ga srečali

Inženirske izdelke je razlog, da profil sploh obstaja. Zbirka risb, ki mora biti čez dvajset let berljiva in dokazljivo nespremenjena, z zgodovino revizij, ki preživi, in z barvo, ki pomeni isto na ploterju v drugi stavbi. Te zahteve dajo specifikacijo, katere zahteve ležijo večinoma izven vsebine strani — v metapodatkih in upravljanju barv —, natanko tam, kjer jih splošen zapisovalnik PDF zmoti

Lastna identifikacija, ne različica PDF/A

Prvo, kar je treba urediti prav, je to, da identifikacije PDF/E-1 ni mogoče izdelati s prilagoditvijo vzorca PDF/A ali PDF/X. Uporablja svoj imenski prostor XMP, http://www.aim.org/pdfe/ns/id/, vrednost verzije pa se mora pojaviti na dveh mestih: kot vnos v informacijah dokumenta in kot lastnost XMP, kvalificirana z imenskim prostorom. Izdaja le lastnosti XMP ali le vnosa v informacijah da datoteko, ki nosi namero, validacije pa ne prestane

Output intent ima enako konkretno obliko. PDF/E-1 zahteva vgrajen profil ICC s podtipskim identifikatorjem ISO_PDFE1, profil pa mora imeti število komponent, ki se ujema z družino napravnih barv, ki jih dokument dejansko uporablja. Zadnja določba je tista, kjer se implementacije tiho zmotijo, ker pomeni, da output intenta ni mogoče izbrati vnaprej in ga potem spustiti iz rok

Zakaj napravna barva potrebuje prelet celotnega dokumenta?

Ker se barvni prostori skrivajo v slovarjih virov, do katerih pregled na ravni strani sploh ne pride. PDF/E-1 obravnava DeviceRGB in DeviceCMYK kot med seboj izključujoči se družini znotraj dokumenta, zato validacija profila pomeni vedeti vsak napravni barvni prostor, ki ga karkoli v datoteki uporablja. Form XObject ima svoje vire. Ima jih vzorec (pattern), enako slika. Tiling vzorec znotraj form XObjecta znotraj strani je tri ravni globoko, validator, ki preverja le vrhnje vire strani, pa bo spustil dokument, ki uporablja obe družini

Prelet zato registrira barvne prostore med tem, ko v enem samem prehodu obišče strani, forme, slike in vzorce, in šele nato odloči, ali je dokument koherenten in ali se output intent ujema. Isto razmišljanje poganja arhitekturo preflighta na splošno: delni prehod proizvede napačne uspehe, napačen uspeh pri preverjanju skladnosti pa je slabši kot nobeno preverjanje, ker se zabeleži kot 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');

    // Avtorski način usklajuje metapodatke življenjskega cikla ob vsakem shranjevanju.
    // Pred shranjevanjem vprašaj, ali bi dokument prešel svojo pregrado
    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;

Metapodatki življenjskega cikla so obveza ob vsakem shranjevanju

PDF/E-1 zahteva več kot le identifikator dokumenta. Najmanjši nabor vključuje identifikator dokumenta za upravljanje medijev, identifikator verzije, razred izdaje (rendition class), čas ustvarjanja, čas spremembe, čas metapodatkov in naslov. To je besedišče za sledenje revizijam in obstaja, ker se od inženirskega izdelka pričakuje, da bo ponovno izdan, in ne da bo napisan samo enkrat

Zaradi tega teh polj implementacija ne more nastaviti ob ustvarjanju dokumenta. Če se čas spremembe zapiše, ko vklopite način, dokument pa se uredi kasneje, se posnetek XMP in dejansko stanje dokumenta razideta, validator, ki ju primerja, pa sporoči neskladje, ki ga nihče ni nameraval. Avtorski način zato uskladi polja tik pred vsakim shranjevanjem, tako da metapodatki opisujejo bajte, ki bodo zapisane, in ne bajtov, ki so obstajali, ko je bil način vklopljen

To je splošno načelo za metapodatke skladnosti in vredno je, da se izreče ločeno od PDF/E: izpeljani metapodatki pripadajo poti shranjevanja, ne poti urejanja. Vsako polje, izračunano iz stanja dokumenta, je treba ponovno izračunati v trenutku, ko se stanje zamrzne, sicer je predpomnilnik brez razveljavitve

Diagram PDF/E-1 za PDFlibPas o celodokumentnem preletu napravnih barv, ki obišče slovarje virov strani, form XObjectov, tiling vzorcev in slik ter zbere družine DeviceRGB in DeviceCMYK, preden oceni koherenco, poleg polj metapodatkov življenjskega cikla, ki jih avtorski način ponovno uskladi tik pred vsakim shranjevanjem, tako da se posnetek XMP ujema z bajti, ki bodo zapisani
Barvno koherenco je mogoče oceniti šele, ko en prehod doseže vsak slovar virov, izpeljani metapodatki življenjskega cikla pa se preračunajo v trenutku, ko se stanje dokumenta zamrzne, in ne ko se način vklopi

Pravilo, ki validacijo vsebine naredi strogo

PDF/E-1 ne dopušča, da bi operatorji razdelka za združljivost (compatibility section) pogoltnili neznano vsebino. V običajnem PDF BX in EX ovijeta območje, v katerem mora potrošnik ignorirati operatorje, ki jih ne prepozna — to je zasilni izhod, ki proizvajalcu dovoli izdajati novejše konstrukte, ne da bi pokvaril starejše bralnike. Pod PDF/E-1 je ta izhod zaprt, zato se vsak operator, ki ga preflight ne prepozna, sporoči brezpogojno, ne glede na to, ali sede znotraj razdelka za združljivost

Učinek na validator je znaten. Ta ne more preskočiti območij, ki jih ne razume, kar pomeni, da mora razčlenjevalnik operandov dejansko razčleniti vsak operator v vsakem vsebinskem toku. Tu pridejo na vrsto meje. Prehod je omejen na 128 ravni ugnezdavanja, milijon objektov in 64 MiB vsebine, te meje pa niso uglaševanje zmogljivosti. Sovražna ali zgolj pokvarjena datoteka lahko ponudi graf objektov s cikli ali globino ugnezdavanja, ki rekurzivni validator spremeni v prelivanje sklada, meje pa so tisto, kar prepreči, da bi preverjanje postalo vektor za denial-of-service. Isti obrambni odnos je opisan v varnem razčlenjevanju nezaupljivih PDF-ov

// Samostojno preverjanje datoteke, ki je niste izdelali vi, brez nalaganja
// v primerek 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;

Kaj shranjevalna pregrada popravi in čemur ugovarja

Pregrada razdeli svoje delo na dve stopnji, ta delitev pa je uporabna oblikovna ideja že sama po sebi. Najprej normalizira stvari, ki jih je varno popraviti: zastavice tiskanja pripomb, zastavici brez-zooma in brez-vrtenja na besedilnih pripombah ter zastavico ustvarjanja videza v slovarju obrazca. To so nastavitve z eno samo pravilno vrednostjo pod profilom in brez vsebinske informacije, zato jih je tiho popraviti prav, zavrniti zaradi njih pa bi bila pedanterija

Nato preveri omejitve, ki jih brez spremembe pomena dokumenta ni mogoče popraviti: verzijo, identifikacijo, šifriranje, output intent, napravno barvno koherenco in prisotnost dinamične vsebine obrazcev. Dokument, ki pri kateri koli od njih spodleti, je zavrnjen, ker bi izmišljanje output intenta ali izbira barvne družine v imenu avtorja dalo datoteko, ki preide validacijo in napačno prikaže vsebino

Diagram shranjevalne pregrade PDF/E-1 za PDFlibPas v Delphi, ki prikazuje omejen preflight, ki pregleda vsak operator vsebinskega toka pod omejitvami 128 ravni ugnezdavanja, milijona objektov in 64 MiB, tiho popravi zastavice tiskanja, zooma in vrtenja pripomb, zavrne napačno verzijo, identifikacijo, šifriranje, output intent, napravno barvo ali dinamično vsebino obrazcev in sporoči blokatorje skozi GetPDFEDiagnostics
Pregrada tiho popravi le tisto, kar ne nosi informacije, zavrne vsako omejitev, ki bi jo popravilo popačilo, in spremeni zavrnitev v seznam blokatorjev skozi GetPDFEDiagnostics, še preden kateri koli bajti pridejo na disk

Branje diagnostike skozi GetPDFEDiagnostics pred shranjevanjem spremeni to zavrnitev v seznam, na katerem je mogoče ukrepati, namesto v operacijo, ki spodleti. V paketnem cevovodu jo pokličite na vsakem dokumentu, zabeležite blokatorje na datoteko in usmerite spodletele v vrsto, ki si jo človek ogleda. To je veliko uporabneje kot shranjevanje, ki javi izjemo, ker se blokatorji običajno gnezdijo skupaj: štirideset dokumentov, ki spodleti zaradi istega manjkajočega output intenta, je eno popravilo, ne štirideset

Izbira med arhivskimi profili

PDF/E-1 je pravi cilj, kadar je izdelek inženirska dokumentacija z življenjskim ciklom revizij, in posebej kadar šteje napravna barvna koherenca, ker izhod gre na ploterje in velikoformatne tiskalnike. PDF/A je pravi cilj, kadar je cilj dolgoročna berljivost dokumentov na splošno, in je profil z najširšo podporo validatorjev. Ti dve nista zamenljiva in dokument lahko zadovolji enega, drugemu pa spodleti

Odločitveni diagram PDFlibPas, ki primerja arhivska profila PDF/E-1 in PDF/A za Delphi: PDF/E-1 za inženirske izdelke z življenjskimi cikli revizij, plotersko barvo in pogodbeno validacijo pod svojim imenskim prostorom XMP z output intentom ISO_PDFE1, PDF/A za splošno dolgoročno berljivost z najširšo podporo validatorjev
Začnite od tistega, ki datoteko validira na drugem koncu: profila zahtevata različno identifikacijo, metapodatke in barvna jamstva, dokument pa lahko zadovolji enega in drugemu spodleti

Če izbirate, začnite od tistega, ki datoteko validira na drugem koncu. Orodja za validacijo PDF/A so povsod, pripadajoči preflight v PDFlibPas pa je opisan v preflightu PDF/A in PDF/UA. Validacija PDF/E je bolj specializirana in je običajno pogodbena zahteva in ne privzetek. Ko je treba obstoječ arhiv dvigniti na profil, za katerega ni bil nikoli napisan, je vzorec, ki mu sledite, pot popravila metapodatkov v pretvorbi v PDF/A s popravilom metapodatkov — ista oblika velja tudi tukaj: identificirajte, popravite, kar je varno, ostalo zavrnite s seznamom

Avtorski način, omejen preflight vsebine in samostojno preverjanje skladnosti vsi pridejo z PDFlibPas Delphi PDF library, tako da dokument lahko nastane pod profilom in se nato neodvisno preveri skozi ločeno kodno pot — edina ureditev, ki jo pri trditvi o skladnosti vredi zaupati