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