ConvertToPDFA pretvara običan dokument u arhivski u jednom pozivu: uklanja ono što izabrani deo zabranjuje, dodaje ono što deo zahteva, navodi deo koji dokument traži, a zatim proverava rezultat. Zahtev se prijavljuje kao ispunjen samo kad provera prođe, a GetPDFAConversionReport navodi šta je urađeno i šta još stoji na putu
To poslednje svojstvo je odluka u dizajnu vredna zadržavanja. Konvertor koji pečatira zahtev bez provere je gori od nikakvog konvertora, jer fajl koji kaže da je arhivski, a nije, prolazi pravo kroz sisteme koji bi ga inače uhvatili. Neuspeh ispliva godinama kasnije, u reviziji, na dokumentu koji niko ne može ponovo generisati
Zašto naizgled ispravan PDF ne prolazi PDF/A proveru?
Najčešće zato što se dva mesta na kojima PDF kaže ko ga je napisao ne slažu. Validator čita i rečnik informacija o dokumentu i XMP paket i odbacuje fajl gde se razlikuju — a većina fajlova koji ne uspeju na ovom mestu jednostavno nikada nije imala napisanu XMP polovinu
RepairDocumentMetadata dovodi ih u slog i vraća koliko je unosa popravio. Tamo gde samo jedna polovina nosi vrednost, druga se popunjava iz nje, tako da se ništa već zabeleženo ne odbacuje. Niko ne mora da odluči koja je kopija autoritativna, jer u praksi jedna kopija je prazna
Postoji druga popravka u istom pozivu koja hvata suptilniji slučaj. Dokument postavljen u PDF/A mod dobija povraćenu identifikaciju standarda ako je izgubljena, što se dešava kad god pozivalac dostavi sopstveni XMP paket. Bez te identifikacije validator čita fajl kao običan PDF i prijavljuje svako pravilo traženog dela kao neispunjeno — spektakularan neuspeh sa jednim malim uzrokom
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;
Biranje dela pre konverzije
SetPDFAMode i ConvertToPDFA dele istu numeraciju modova, a tri vrednosti su nedavne. Mod 9 je PDF/A-4, deo izgrađen na PDF 2.0. Mod 10 je PDF/A-4e, koji dodatno dozvoljava 3D i bogate medije, a mod 11 je PDF/A-4f, koji dozvoljava ugrađeni fajl bilo kog formata
Deo 4 se identifikuje drugačije od delova pre njega: po broju dela i godini u kojoj je deo objavljen, bez slova usklađenosti za običan PDF/A-4, a sa slovom E ili F za dva proširenja. Provera prepoznaje deo 4, ocenjuje njegove fajlove prema PDF 2.0 umesto prema 1.7, i prijavljuje fajl dela 4 koji ne navodi svoju godinu revizije
Svaki ugrađeni fajl u dokumentu dela 4 navodi kako se odnosi prema dokumentu, kao što i delovi 3 i 4 zahtevaju. Ovo je pravilo koje je nekada hvatalo obične priloge: odnos je bio pisan samo za priloge posle prvog i nikad za poslednji, tako da je dokument sa jednim prilogom — uobičajen slučaj — nije nosio uopšte i padao na validaciji baš na toj tački
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;
Čemu služi izveštaj o konverziji
Da odlučite šta dalje. Konverzija koja uspe ne treba izveštaj; konverzija koja ne uspe je ceo razlog zašto izveštaj postoji. Neke prepreke može ukloniti konvertor, a neke ne — šifrovanje, zabranjeni sadržaj koji nosi značenje, font program koji jednostavno ne postoji nigde na mašini. Izveštaj razlikuje šta je urađeno od onoga što preostaje, što «konverzija neuspešna» pretvara u radnu stavku
Shvatite verdikt kao kapiju u paketnoj liniji obrade. Konvertujte, pročitajte verdikt, i usmerite fajl: arhivirajte one koji su prošli, ostale stavite u red za čoveka sa pridruženim izveštajem. Ono što ne treba da radite jeste da sačuvate izlaz neuspele konverzije u arhivu jer izgleda bolje od ulaza — sada nosi zahtev koji je provera odbila da potvrdi
Čitanje oznake koju fajl već nosi
Pre bilo kakve konverzije, znajte šta dokument kaže o sebi. PDF/A provera koja ne može pročitati postojeću oznaku standarda ocenjuje svaki fajl prema delu 1 šta god on deklariše, što znači da savršeno ispravan PDF/A-2 ili PDF/A-3 dokument biva prijavljen kao da ne nosi oznaku i da je previsoke verzije — suprotno od istine
Oznaka se čita bez obzira na to da li ju je producent napisao kao XMP element ili kao atribut. Oba oblika su običan XMP, i prihvatanje samo jednog od njih ostavlja fajlove drugih producenata da izgledaju neoznačeno. Ako ste se ikada zapitali zašto dokument koji drugde prolazi validaciju pada u vašoj liniji obrade, ovo je dobro mesto da prvo pogledate
Sanitizacija pre arhiviranja, i bag vredan poznavanja
Arhivska konverzija i sanitizacija često rade zajedno, jer se sadržaj koji bezbednosna politika želi ukloniti velikim delom preklapa sa sadržajem koji PDF/A zabranjuje. SanitizeDocument uklanja JavaScript, a uklanjanje poslednje skripte takođe uklanja prazno stablo imena koje ona ostavlja za sobom — stabvo koje bi inače i dalje govorilo čitaču da je dokument nosio skripte
Ta druga polovina je naučena na teži način: greška od-jedan u listi paketa značila je da sanitizacija prijavljuje uklanjanje skripti dok ne uklanja nijednu, tako da je dokument koji je bio sanitizovan i dalje pokretao svoje skripte pri otvaranju. To je dobar argument za opšti princip na kome počiva ceo ovaj članak — verifikujte rezultat umesto da verujete operaciji, u svojoj liniji obrade koliko i u biblioteci
Za okolni arhivski rad, pogledajte prolake kroz PDF/A i PDF/UA preflight, pravu redakciju i uklanjanje sadržaja, i PDF/A-3 XMP šeme proširenja za Factur-X, koja pokriva stranu metapodataka kad arhivirani dokument takođe nosi strukturirane podatke fakture
PDFlibPas je nativna Pascal PDF biblioteka za Delphi, C++Builder i Lazarus, tako da konverzija, popravka i validacija sve dešavaju unutar vašeg sopstvenog procesa bez eksternog alata u lancu — pogledajte PDFlibPas stranicu proizvoda za podržane PDF/A delove i platforme