Műszaki cikk

PDF konvertálása PDF/A-vá és a metaadatok javítása

A ConvertToPDFA egyetlen hívással változtatja a mindennapi dokumentumot archívvá: eltávolítja, amit a választott rész tilt, hozzáadja, amit megkövetel, megnevezi a dokumentum által hivatkozott részt, majd ellenőrzi az eredményt. A hivatkozás csak akkor számít teljesítettnek, ha az ellenőrzés sikeres, és a GetPDFAConversionReport felsorolja, mit végeztek el, és mi áll még útban

Ez utóbbi tulajdonság az a tervezési döntés, amelyet érdemes jobban megnézni. Egy konverter, amely ellenőrzés nélkül bélyegzi a hivatkozást, rosszabb, mint egyáltalán semmilyen konverter, mert egy olyan fájl, amely archívnak mondja magát és nem az, egyenesen átjut azokon a rendszereken, amelyek egyébként elkapnák. A hiba évek múlva, egy audit során, egy olyan dokumentumnál bukkan ki, amit senki nem tud újragenerálni

Miért bukik meg egy érvényesnek tűnő PDF egy PDF/A-ellenőrzésen?

A leggyakrabban azért, mert a PDF két helye, amely megmondja, ki írta, nem egyezik. Egy validátor mind a dokumentuminformációs szótárat, mind az XMP csomagot beolvassa, és elutasítja azt a fájlt, ahol eltérnek — és az ehben a pontban megbukó fájlok nagy része egyszerűen soha nem kapta meg az XMP felét

A RepairDocumentMetadata hozza őket összhangba, és visszaadja, hány bejegyzést javított. Ahol csak az egyik fél hordoz értéket, a másik abból töltődik ki, így semmi már rögzített nem vész el. Senkinek nem kell eldönteni, melyik másolat a mérvadó, mert a gyakorlatban az egyik másolat üres

Ugyanebben a hívásban van egy második javítás is, amely egy finomabb esetet elkap. Egy PDF/A-módra állított dokumentum visszakapja a szabványazonosítását, ha elveszett, ami minden olyan alkalommal megtörténik, amikor a hívó saját XMP csomagot ad meg. Az azonosítás nélkül egy validátor egyszerű PDF-ként olvassa a fájlt, és a hivatkozott rész minden szabályát teljesítetlenként jelenti — egy látványosan tűnő hiba egyetlen kis okkal

var
  Lib: TPDFlib;
  Repaired: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('incoming.pdf', '');
    Repaired := Lib.RepairDocumentMetadata;
    Log(Format('%d metadata entries brought into agreement', [Repaired]));
    Lib.SaveToFile('incoming-fixed.pdf');
  finally
    Lib.Free;
  end;
end;

A rész kiválasztása a konvertálás előtt

A SetPDFAMode és a ConvertToPDFA közös mód­sorszámozást használnak, és három érték friss. A 9-es mód a PDF/A-4, a PDF 2.0-ra épülő rész. A 10-es mód a PDF/A-4e, amely emellett 3D-t és rich media-t engedélyez, a 11-es mód pedig a PDF/A-4f, amely bármilyen formátumú beágyazott fájlt megenged

A 4-es rész máshogy azonosítja magát, mint a korábbi részek: részszámmal és a rész kiadási évével, sima PDF/A-4 esetén nincs megfelelőségi betű, a két kiterjesztésnél pedig E vagy F betű szerepel. Az ellenőrzés felismeri a 4-es részt, a fájljait PDF 2.0, nem pedig 1.7 alapján ítéli meg, és jelent egy olyan 4-es részű fájlt, amely nem tünteti fel a revíziós évét

Egy 4-es részű dokumentum minden beágyazott fájlja megnevezi, hogyan kapcsolódik a dokumentumhoz, ahogy a 3-as és 4-es rész egyaránt megköveteli. Ez az a szabály, amely régebben a mindennapi mellékleteket elkapta: a kapcsolatot csak az első utáni mellékletekhez írták ki, az utolsóhoz soha, tehát egyetlen melléklettel rendelkező dokumentum — a gyakori eset — egyáltalán nem hordozta, és pont emiatt bukik meg a validáción

var
  Verdict: Integer;
begin
  Lib.LoadFromFile('report.pdf', '');
  Verdict := Lib.ConvertToPDFA(9);        // 9 = PDF/A-4, 10 = 4e, 11 = 4f
  Memo1.Lines.Text := Lib.GetPDFAConversionReport;
  if Verdict = 1 then
    Lib.SaveToFile('report-pdfa4.pdf')
  else
    Log('conversion incomplete - see the report for what stands in the way');
end;

Mire való a konvertálási jelentés

Annak eldöntésére, hogy mi a következő lépés. Egy sikeres konvertálásnak nincs szüksége jelentésre; egy sikertelen az egész oka annak, hogy a jelentés létezik. Egyes akadályokat egy konverter el tud távolítani, másokat nem — titkosítás, jelentést hordozó tiltott tartalom, olyan betűprogram, amely egyszerűen nincs sehol a gépen. A jelentés különválasztja, mi lett elvégezve, és mi maradt, ami a „konvertálás sikertelen”-t egy munkaelemmé alakítja

Az ítéletet egy batch-feldolgozó futószalagon kapuként kezeljük. Konvertáljunk, olvassuk az ítéletet, és irányítsuk a fájlt: archiváljuk azokat, amelyek átmentek, a többit pedig soroljuk be egy ember elé a jelentés csatolásával. Amit nem szabad tennünk, az egy sikertelen konvertálás kimenetét elmenteni az archívumba azért, mert jobban néz ki, mint a bemenet — most már egy olyan hivatkozást hordoz, amelyet az ellenőrzés nem igazolt

A már meglévő jelzés kiolvasása

Bármi konvertálása előtt tudnunk kell, mit mond a dokumentum önmagáról. Egy PDF/A-ellenőrzés, amely nem tudja beolvasni a meglévő szabványjelet, minden fájlt az 1-es részhez mér, bármilyet is deklarál, ami azt jelenti, hogy egy tökéletesen érvényes PDF/A-2 vagy PDF/A-3 dokumentum arról kap jelentést, hogy nem hordoz jelet, és túl magas a verziója — az igazság ellentéte

A jelet úgy is beolvassák, ha a producer XMP-elemként, úgy is, ha attribútumként írta. Mindkét forma mindennapi XMP, és csak az egyik elfogadása más producerektől származó fájlokat jelöletlennek tünteti fel. Ha már gondolkodtál azon, miért bukik meg egy máshol validáló dokumentum a saját futószalagodon, ez érdemes elsőként megnézni

Tisztítás archiválás előtt, és egy hiba, amit érdemes ismerni

Az archív konvertálás és a tisztítás gyakran együtt fut, mert a tartalom, amelyet egy biztonsági szabályzat eltávolítana, nagymértékben átfedi a PDF/A által tiltott tartalmat. A SanitizeDocument eltávolítja a JavaScriptet, és az utolsó szkript eltávolítása egyúttal eltávolítja az üres névfát is, amelyet hátrahagy — egy olyan fát, amely egyébként még azt mondaná az olvasónak, hogy a dokumentum szkripteket hordoz

Ez a második felét kemény úton tanultuk meg: a csomaglistában lévő off-by-one azt okozta, hogy a tisztítás arról jelentett, hogy eltávolítja a szkripteket, miközben egyet sem távolított el, tehát egy tisztított dokumentum még mindig lefuttatta a szkriptjeit megnyitáskor. Ez jó érv amellett az általános elv mellett, amelyen ez a cikk nyugszik — ellenőrizzük az eredményt, ne bízzunk a műveletben, a saját futószalagunkon éppúgy, mint a könyvtárban

A körülötte lévő archív munkához lásd a PDF/A és PDF/UA preflight, a valódi redakció és tartalomeltávolítás, valamint a Factur-X-hez tartozó PDF/A-3 XMP kiterjesztés sémák átjárásait, amelyek a metaadati oldalt tárgyalják, amikor az archivált dokumentum strukturált számlaadatokat is hordoz

A PDFlibPas natív Pascal PDF könyvtár Delphihez, C++Builderhez és Lazarushoz, így a konvertálás, a javítás és a validáció mind a saját folyamatunkon belül történik, külső eszköz nélkül a láncban — a támogatott PDF/A részeket és platformokat a PDFlibPas termékoldal tartalmazza