Odborný článok

Prevod PDF na PDF/A a oprava jeho metadát

ConvertToPDFA premení bežný dokument na archivačný jediným volaním: odstráni to, čo vybraná časť zakazuje, pridá to, čo časť vyžaduje, vyhlási časť, ktorú dokument nárokuje, a následne skontroluje výsledok. Nárok je vyhlásený ako splnený iba vtedy, keď kontrola prejde, a GetPDFAConversionReport vypíše, čo bolo urobené a čo ešte stojí v ceste

Posledná vlastnosť je architektonické rozhodnutie, ktoré si zaslúži pozornosť. Konvertor, ktorý opečiatkuje nárok bez kontroly, je horší než žiadny konvertor, pretože súbor, ktorý tvrdí, že je archivačný a nie je, prejde priamo systémami, ktoré by ho inak zachytili. Zlyhanie sa objaví o roky neskôr, pri audite, na dokumente, ktorý už nikto nedokáže regenerovať

Prečo pri padá PDF kontrolou PDF/A, hoci vyzerá platne?

Najčastejšie preto, že sa nezhodujú dve miesta, kde PDF hovorí, kto ho napísal. Validátor číta slovník informácií o dokumente aj XMP paket a odmieta súbor, kde sa líšia — a väčšina súborov, ktoré na tomto mieste zlyhajú, jednoducho nikdy nemala napísanú XMP polovicu

RepairDocumentMetadata ich uvedie do súladu a vráti počet opravených položiek. Ak hodnotu nesie iba jedna polovica, druhá sa z nej doplní, takže sa nič, čo už bolo zaznamenané, nevyhodí. Nikto sa nemusí rozhodovať, ktorá kópia je autoritatívna, pretože v praxi je jedna kópia prázdna

V tom istom volaní existuje druhá oprava, ktorá zachytáva jemnejší prípad. Dokument nastavený do režimu PDF/A získa späť identifikáciu štandardu, ak sa stratila, čo sa stane vždy, keď volajúci dodá vlastný XMP paket. Bez tejto identifikácie validátor číta súbor ako obyčajné PDF a nahlási každé pravidlo nárokovanej časti ako nesplnené — pôsobivé zlyhanie s jedinou malou príčinou

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;

Výber časti pred konverziou

SetPDFAMode a ConvertToPDFA zdieľajú rovnaké číslovanie režimov a tri z hodnôt sú nedávne. Režim 9 je PDF/A-4, časť postavená na PDF 2.0. Režim 10 je PDF/A-4e, ktorý navyše povoľuje 3D a bohaté médiá, a režim 11 je PDF/A-4f, ktorý povoľuje vložený súbor akéhokoľvek formátu

Časť 4 sa identifikuje inak než predchádzajúce časti: číslom časti a rokom vydania, bez písmena zhody pre čistý PDF/A-4 a s písmenom E alebo F pre oba varianty. Kontrola rozpozná časť 4, posudzuje jej súbory voči PDF 2.0 namiesto 1.7 a nahlási súbor časti 4, ktorý neuvádza rok revízie

Každý vložený súbor v dokumente časti 4 uvádza, ako súvisí s dokumentom, ako to vyžadujú časti 3 aj 4. Toto je pravidlo, ktoré kedysi zachytilo bežné prílohy: vzťah sa zapisoval iba pre prílohy po prvej a nikdy pre poslednú, takže dokument s jedinou prílohou — častý prípad — neniesol žiadny vzťah a zlyhal validáciou práve na tomto mieste

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;

Načo je konverzný report

Na rozhodnutie, čo robiť ďalej. Konverzia, ktorá uspeje, report nepotrebuje; konverzia, ktorá neuspeje, je celým dôvodom, prečo report existuje. Niektoré prekážky dokáže konvertor odstrániť a niektoré nie — šifrovanie, zakázaný obsah s významom, font program, ktorý na stroji jednoducho nie je nikde prítomný. Report odlišuje, čo bolo urobené, od toho, čo ostáva, čo premení „konverzia zlyhala" na pracovnú položku

Verdikt považujte za bránu v dávkovej linke. Konvertujte, prečítajte verdikt a smerujte súbor: archivujte tie, ktoré prešli, ostatné zaradte do fronty pre človeka s pripojeným reportom. To, čo by ste nemali robiť, je uložiť výstup neúspešnej konverzie do archívu, pretože vyzerá lepšie než vstup — teraz nesie nárok, ktorý kontrola odmietla potvrdiť

Čítanie značky, ktorú už súbor nesie

Pred akoukoľvek konverziou by ste mali vedieť, čo dokument hovorí o sebe. Kontrola PDF/A, ktorá nedokáže prečítať existujúcu značku štandardu, posudzuje každý súbor voči časti 1 bez ohľadu na to, čo deklaruje, čo znamená, že dokonale platný dokument PDF/A-2 alebo PDF/A-3 je nahlásený ako nedovoľný, bez značky a príliš vysokej verzie — opak pravdy

Značka sa číta bez ohľadu na to, či ju producent zapísal ako XMP element alebo ako atribút. Obe formy sú bežné XMP a prijímanie iba jednej z nich nechá súbory od iných producentov pôsobiť neznačene. Ak ste sa niekedy pýtali, prečo dokument, ktorý inde validuje, zlyhá vo vašej linke, je to vhodné miesto, kde začať hľadať

Sanitizácia pred archiváciou a chyba, ktorú sa oplatí poznať

Archivačná konverzia a sanitizácia často bežia spolu, pretože obsah, ktorý chce bezpečnostná politika odstrániť, sa silne prekrýva s obsahom, ktorý PDF/A zakazuje. SanitizeDocument odstraňuje JavaScript a odstránenie posledného skriptu zároveň odstraňuje prázdny strom názvov, ktorý po sebe zanechá — strom, ktorý by inak čítačke stále hovoril, že dokument skripty nesie

Druhá polovica bola odskúšaná tvrdou cestou: chyba o jeden v zozname balíkov znamenala, že sanitizácia hlásila odstránenie skriptov, ale neodstránila žiadne, takže sanitizovaný dokument pri otvorení stále spúšťal svoje skripty. Je to dobrý argument pre všeobecný princíp, na ktorom stojí celý tento článok — overujte výsledok namiesto dôvery v operáciu, vo vlastnej linke rovnako ako v knižnici

Pre okolitú archivačnú prácu pozri návody k PDF/A a PDF/UA preflightu, skutočnej redakcii a odstráneniu obsahu a XMP rozšíreným schémam PDF/A-3 pre Factur-X, ktoré pokrývajú metadatovú stránku, keď archivovaný dokument zároveň nesie štruktúrované fakturačné dáta

PDFlibPas je natívna Pascal PDF knižnica pre Delphi, C++Builder a Lazarus, takže konverzia, oprava a validácia prebiehajú vo vnútri vášho procesu bez externého nástroja v reťazci — podporované PDF/A časti a platformy nájdete na produktovej stránke PDFlibPas