Műszaki cikk

PDF/E-1 mérnöki dokumentumok Delphiben a PDFlibPas-ban

A PDF/E-1 a mérnöki dokumentumok archiválási profilja, és a PDFlibPas úgy valósítja meg, mint egy szerzői módot, amelyet a SetPDFEMode-bal kapcsol be, plusz egy határolt preflightot, amely operátoronként olvassa a tartalomstream-eket. A profil nem PDF/A másik címkével: saját azonosító névtere van, saját életciklus-metaadat követelménye, és egy szabálya, amely a tartalomérvényesítést szigorúbbá teszi, mint bármely eddigi archiválási profil

A mérnöki leszállítandók miatt létezik a profil. Egy rajzkészletnek húsz év múlva is olvashatónak kell lennie, bizonyíthatóan változatlanul, fennmaradó revíziótörténettel, és olyan színnel, amely a másik épületben álló plotteren ugyanazt jelenti. Ezek a követelmények olyan specifikációt eredményeznek, amelynek az igényei nagyrészt az oldaltartalomon kívül ülnek, a metaadatokban és a színkezelésben, és pontosan itt téved el az általános PDF író

Saját azonosítás, nem a PDF/A variációja

Az első dolog, amit el kell találni, hogy a PDF/E-1 azonosítás nem gyártható a PDF/A vagy PDF/X minta átalakításával. Külön XMP névteret használ, a http://www.aim.org/pdfe/ns/id/ nevteret, és a verzióértéknek két helyen kell szerepelnie: dokumentuminformációs bejegyzésként és névtér-minősített XMP tulajdonságként. Csak az XMP tulajdonság, vagy csak az információs bejegyzés kiírása olyan fájlt ad, amely viseli a szándékot, és elbukik az érvényesítésen

A kimeneti szándéknak ugyanilyen specifikus alakja van. A PDF/E-1 beágyazott ICC profilt követel meg ISO_PDFE1 altípusazonosítóval, és a profil komponensszámának egyeznie kell azzal az eszközszín-családdal, amelyet a dokumentum ténylegesen használ. Ez az utolsó záradék az, ahol az implementációk csendben elhibázzák, mert azt jelenti, hogy a szándékot nem lehet előre kiválasztani, aztán elfelejteni

Miért igényel az eszközszín teljes dokumentumot bejáró vizsgálat?

Mert a színterek olyan erőforrás-szótárakban rejtőznek, ahová egy oldalszintű vizsgálat sosem jut el. A PDF/E-1 a DeviceRGB és a DeviceCMYK családokat kölcsönösen kizárónak tekinti egy dokumentumon belül, tehát a profil érvényesítése azt jelenti, hogy tudni kell a fájl bármije által használt minden eszközszíntérről. A form XObjectnak saját erőforrásai vannak. Ugyanígy a mintázatnak, és ugyanígy a képnek. Egy oldalba ágyazott form XObjectba ágyazott tiling mintázat három szint mélyen van, és egy csak a legfelső szintű oldal-erőforrásokat ellenőrző érvényesítő átenged egy dokumentumot, amely mindkét családot használja

A bejárás ezért egyetlen végigjárásként járja a lapokat, formokat, képeket és mintázatokat, közben jegyzi a színtereket, és csak utána dönti el, hogy a dokumentum koherens-e, és hogy a kimeneti szándék egyezik-e. Ugyanez a gondolkodás hajtja általában a preflight architektúrát: a részleges bejárás hamis megfelelést ad, és egy megfelelőségvizsgálaton kapott hamis megfelelés rosszabb, mint a vizsgálat hiánya, mert bizonyítékként rögzítik

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');

    // A szerzői mód minden mentéskor szinkronban tartja az életciklus-metaadatot.
    // Mentés előtt kérdezze meg, átmennék-e a dokumentum a saját kapuján
    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;

Az életciklus-metaadat mentésenkénti kötelezettség

A PDF/E-1 többet kér egy dokumentumazonosítónál. A minimális készlet tartalmazza a médiakezelési dokumentumazonosítót, egy verzióazonosítót, egy rendition osztályt, a létrehozás idejét, a módosítás idejét, a metaadat idejét és egy címet. Ez egy revíziókövető szókincs, és azért létezik, mert egy mérnöki leszállítandótól azt várják, hogy újra kiadják, nem egyszer megírják

A következmény egy implementációra az, hogy ezeket a mezőket nem lehet dokumentumlétrehozáskor beállítani. Ha a módosítás ideje akkor íródik, amikor bekapcsolja a módot, és a dokumentum utána szerkesztődik, az XMP pillanatkép és a tényleges dokumentumállapot széttart, és egy őket összehasonlító érvényesítő olyan ellentmondást jelent, amelyet senki nem akart. A szerzői mód ezért minden mentés közvetlenül előtt szinkronizálja a mezőket, tehát a metaadat a kiírásra váró bájtokat írja le, nem azokat, amelyek a mód bekapcsolásakor léteztek

Ez általános elv a megfelelőségi metaadatokra, és érdemes a PDF/E-től függetlenül is kimondani: a származtatott metaadat a mentési útra való, nem a szerkesztési útra. Minden mezőt, amelyet a dokumentumállapotból számolnak, újra kell számolni abban a pillanatban, amikor az állapot befagy, különben ez egy érvénytelenítés nélküli cache

PDFlibPas PDF/E-1 ábra a teljes dokumentumot bejáró eszközszín-vizsgálatról, amely végigmegy az oldal, form XObject, tiling mintázat és kép erőforrás-szótárakon, gyűjtve a DeviceRGB és DeviceCMYK családokat, mielőtt koherenciát ítélné, mellette az életciklus-metaadat mezőkkel, amelyeket a szerzői mód minden mentés közvetlenül előtt újraszinkronizál, hogy az XMP pillanatkép egyezzen a kiírásra váró bájtokkal
A színkoherenciát csak egyetlen bejárás után lehet megítélni, amely minden erőforrás-szótárhoz eljut, és a származtatott életciklus-metaadat abban a pillanatban számolódik újra, amikor a dokumentumállapot befagy, nem a mód bekapcsolásakor

A szabály, amely szigorúvá teszi a tartalomérvényesítést

A PDF/E-1 nem engedi, hogy a kompatibilitási szakasz operátorai felfalják az ismeretlen tartalmat. Közönséges PDF-ben a BX és az EX közrefog egy olyan régiót, amelyben a fogyasztónak figyelmen kívül kell hagynia a fel nem ismert operátorokat, ez az a menekülőnyílás, amely lehetővé teszi, hogy a gyártó újabb szerkezeteket adjon ki régebbi olvasók törése nélkül. PDF/E-1 alatt ez a kijárat zárva, tehát minden operátort, amelyet a preflight nem ismer fel, feltétel nélkül jelent, attól függetlenül, hogy kompatibilitási szakaszban ül-e

A hatás egy érvényesítőre jelentős. Nem ugorhatja át a nem értett régiókat, ami azt jelenti, hogy az operanduselemzőnek ténylegesen elemeznie kell minden operátort minden tartalomstreamben. Itt jönnek képbe a határok. A bejárás 128 beágyazási szintre, egymillió objektumra és 64 MiB tartalomra van korlátozva, és ezek a korlátok nem teljesítményhangolás. Egy ellenséges vagy csupán sérült fájl olyan objektumgráfot mutathat, amely ciklusokat tartalmaz, vagy olyan beágyazási mélységgel bír, amely a rekurzív érvényesítőt stack overflowba kergeti, és a korlátok azok, amelyek megakadályozzák, hogy egy érvényesítési menet denial-of-service vektorrá váljon. Ugyanezt a védekező álláspontot írja le a nem megbízható PDF-ek biztonságos elemzése

// Különálló érvényesítés egy olyan fájlon, amelyet Ön nem állított
// elő, anélkül, hogy dokumentumpéldányba töltené
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;

Mit javít meg a mentési kapu, és mit utasít el?

A kapu két szakaszra bontja a munkáját, és ez a bontás önmagában is használható tervezési ötlet. Először normalizálja azokat a dolgokat, amelyek biztonságosan javíthatók: a megjegyzés nyomtatási zászlóit, a szöveges megjegyzések nincs-nagyítás és nincs-forgatás zászlóit, és a megjelenés-előállítás zászlóját a form szótáron. Ezek olyan beállítások, amelyeknek a profil alatt egy helyes értékük van és nincs információtartalmuk, tehát csendes javításuk helyes, és rajtuk való elutasítás pedantéria volna

Aztán ellenőrzi azokat a megszorításokat, amelyek a dokumentum jelentésének megváltoztatása nélkül nem javíthatók: verzió, azonosítás, titkosítás, kimeneti szándék, eszközszín-koherencia és a dinamikus formatartalom jelenléte. A valamelyiken elbukó dokumentumot elutasítja, mert egy kimeneti szándék kitalálása vagy egy színcsalád megválasztása a szerző nevében olyan fájlt adna, amely átmegy az érvényesítésen, és félreábrázolja a tartalmat

PDFlibPas PDF/E-1 mentési kapu ábra Delphihez, amely a határolt preflightot mutatja: minden tartalomstream operátort átvizsgál 128 szintű beágyazás, egymillió objektum és 64 MiB korlátok alatt, csendben javítja a megjegyzés nyomtatási, nagyítási és forgatási zászlóit, elutasítja a rossz verziót, azonosítást, titkosítást, kimeneti szándékot, eszközszínt vagy dinamikus formatartalmat, és a blokkolókat a GetPDFEDiagnostics-ön keresztül jelenti
A kapu csak azt javítja csendben, ami nem hordoz információt, elutasít minden megszorítást, amelyet a javítás torzítana, és az elutasítást blokkolólistává alakítja a GetPDFEDiagnostics-ön keresztül, mielőtt bármely bájt lemezre érne

A diagnosztika visszaolvasása a GetPDFEDiagnostics-szal mentés előtt az elutasítást cselekvhető listává teszi, nem megbukott műveletté. Egy batch folyamatsorban hívja meg minden dokumentumon, naplózza a blokkolókat fájlonként, és a hibákat irányítsa egy olyan sorba, amelyet ember néz. Ez sokkal hasznosabb, mint egy kivételt dobó mentés, mert a blokkolók általában csoportosulnak: negyven dokumentum, amely ugyanazon hiányzó kimeneti szándékért bukik meg, egy javítás, nem negyven

Választás az archiválási profilok között

A PDF/E-1 a helyes cél, amikor a leszállítandó revízió életciklusú mérnöki dokumentáció, és konkrétan akkor, amikor az eszközszín-koherencia számít, mert a kimenet plotterekre és nagyformátumú nyomtatókra megy. A PDF/A a helyes cél, amikor a cél általában a dokumentumok hosszú távú olvashatósága, és ez az a profil, amelyet a legszélesebb körben támogatnak az érvényesítők. A kettő nem felcserélhető, és egy dokumentum teljesítheti az egyiket, és megbukhat a másikon

PDFlibPas döntési ábra a PDF/E-1 és a PDF/A archiválási profilok összehasonlítására Delphihez: PDF/E-1 revízió életciklusú mérnöki leszállítandókhoz, plotter színhez és szerződéses érvényesítéshez a saját XMP névtér alatt ISO_PDFE1 kimeneti szándékkal, PDF/A általános hosszú távú olvashatósághoz a legszélesebb érvényesítői támogatással
Induljon ki abból, ki érvényesíti a fájlt a távoli végén: a profilok eltérő azonosítást, metaadatot és szingaranciákat követelnek, és egy dokumentum teljesítheti az egyiket, miközben megbukik a másikon

Ha választania kell, induljon ki abból, ki érvényesíti a fájlt a távoli végén. A PDF/A érvényesítő eszközök mindenhol ott vannak, és a PDFlibPasban lévő megfelelő preflightot a PDF/A és PDF/UA preflight írja le. A PDF/E érvényesítés specializáltabb, és általában szerződéses követelmény, nem alapértelmezés. Amikor egy meglévő archívumot fel kell hozni egy profilhoz, amelyre sosem írták, a PDF/A-ra konvertálás metaadatjavítással cikk metaadatjavítási útja a követendő minta, és itt is ugyanez az alak érvényes: azonosítson, javítsa, ami biztonságos, a többit utasítsa el listával

A szerzői mód, a határolt tartalom-preflight és a különálló megfelelőségvizsgálat a PDFlibPas Delphi PDF könyvtárral együtt jár, tehát a dokumentum előállítható a profil alatt, és utána függetlenül is ellenőrizhető egy külön kódúton, ami az egyetlen elrendezés, amelyet egy megfelelőségi állításnál érdemes megbízni