Tehnični članak

Pretvorba PDF v PDF/A in popravilo njegovih metapodatkov

ConvertToPDFA spremeni običajen dokument v arhivskega v enem klicu: odstrani tisto, kar izbrani del prepoveduje, doda tisto, kar del zahteva, navede del, ki ga dokument zahteva, nato preveri rezultat. Zahteva je poročana kot izpolnjena šele, ko preverjanje uspe, GetPDFAConversionReport pa našteje, kaj je bilo storjeno in kaj še stoji na poti

Ta zadnja lastnost je oblikovna odločitev, ki se ji splača posvetiti. Pretvornik, ki žigosanost zahteve nalepi brez preverjanja, je slabši od nobenega pretvornika, ker datoteka, ki pravi, da je arhivska, pa ni, gre naravnost skozi tiste sisteme, ki bi jo sicer ujeli. Napaka se pokaže leta pozneje, v reviziji, na dokumentu, ki ga nihče ne more znova ustvariti

Zakaj veljavno videči PDF ne uspe preverjanju PDF/A?

Najpogosteje zato, ker se kraji, v katerih PDF pove, kdo ga je napisal, ne strinjata. Validator prebere tako slovar informacij dokumenta kot paket XMP in zavrne datoteko, kjer se razlikujeta — datoteke, ki pri tem ne uspejo, pa preprosto sploh niso imele zapisane polovice XMP

RepairDocumentMetadata ju spravi v soglasje in vrne, koliko vnosov je popravil. Kjer vrednost nosi samo ena polovica, se druga zapolni iz nje, tako da nič že zapisanega ne vržemo proč. Nihče se ne mora odločiti, katera kopija je avtoritativna, ker je v praksi ena kopija prazna

V istem klicu je drugo popravilo, ki ujame tanjši primer. Dokumentu, nastavljenemu na način PDF/A, se obnovi identifikacija standarda, če je bila izgubljena, kar se zgodi kadarkoli klicatelj dobavi svoj paket XMP. Brez te identifikacije validator datoteko prebere kot običajen PDF in vsako pravilo zahtevanega dela poroča kot neizpolnjeno — spektakularno videče se neuspeh z enim majhnim vzrokom

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;

Izbira dela pred pretvorbo

SetPDFAMode in ConvertToPDFA si delita isto oštevilčenje načinov, tri od vrednosti pa so novejše. Način 9 je PDF/A-4, del, zgrajen na PDF 2.0. Način 10 je PDF/A-4e, ki dodatno dovoljuje 3D in bogate medije, način 11 pa je PDF/A-4f, ki dovoljuje vdelano datoteko kateregakoli formata

Del 4 se identificira drugače kot deli pred njim: s številko dela in letom, v katerem je bil objavljen, brez črke skladnosti za navadni PDF/A-4, s črko E ali F pa za razširitvi. Preverjanje prepozna del 4, njegove datoteke presoja glede na PDF 2.0 in ne 1.7, ter poroča o datoteki dela 4, ki ne navede svojega leta revizije

Vsakšna vdelana datoteka v dokumentu dela 4 navede, kako se nanaša na dokument, kot zahtevata dela 3 in 4. To je pravilo, ki je nekoč ujemalo običajne priponke: razmerje je bilo zapisano samo za priponke po prvi in nikoli za zadnjo, tako je dokument z eno samo priponko — običajen primer — ni nosil nobenega in ni uspel pri validaciji ravno na tej toč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;

Namenu poročila o pretvorbi

Odločitev, kaj storiti naprej. Uspešna pretvorba ne potrebuje poročila; neuspešna pa je ves razlog, zakaj poročilo obstaja. Nekatere ovire lahko odstrani pretvornik, nekatere pa ne — šifriranje, prepovedana vsebina, ki nosi pomen, program pisave, ki preprosto ni prisoten nikjer na stroju. Poročilo loči, kaj je bilo storjeno, od tega, kaj ostaja, kar "pretvorba ni uspela" spremeni v delovno postavko

Verdikt obravnavajte kot vrata v paketnem cevovodu. Pretvorite, preberite verdikt in usmerite datoteko: arhivirajte tiste, ki so šle skozi, ostale uvrstite v čakalno vrsto za človeka s pripetim poročilom. Česa ne smete storiti, je shraniti izhod neuspele pretvorbe v arhiv, ker je videti lepši od vhoda — zdaj nosi zahtevo, ki jo je preverjanje odklonilo potrditi

Branje žigosanosti, ki jo datoteka že nosi

Pred pretvorbo česarkoli vedite, kaj dokument pravi o sebi. Preverjanje PDF/A, ki ne more prebrati obstoječe oznake standarda, vsako datoteko presoja glede na del 1, karkoli že razglaša, kar pomeni, da se popolnoma veljaven dokument PDF/A-2 ali PDF/A-3 poroča kot brez oznake in kot previsoke različice — nasprotje resnice

Oznaka se prebere, ne glede na to, ali jo je producent zapisal kot element XMP ali kot atribut. Obe obliki sta običajen XMP, sprejemanje samo ene od njiju pusti datoteke drugih producentov videče se neoznačene. Če ste se kdaj vprašali, zakaj dokument, ki se drugje uspešno preveri, v lastnem cevovodu ne uspe, je to dobro mesto, kjer se splača najprej zazreti

Sanitacija pred arhiviranjem in hrošč, ki se splača poznati

Arhivska pretvorba in sanitacija pogosto tečeta skupaj, ker se vsebina, ki jo želi varnostna politika odstranjena, močno prekriva z vsebino, ki jo PDF/A prepoveduje. SanitizeDocument odstrani JavaScript, odstranitev zadnjega skripta pa odstrani tudi prazno drevo imen, ki ga pusti za seboj — drevo, ki bi bralcu sicer še povedalo, da dokument nosi skripte

Ta druga polovica je bila naučena na trdi način: napaka pri ena v seznamu paketov je pomenila, da je sanitacija poročala o odstranitvi skriptov, pri čemer jih ni odstranila, tako da dokument, ki je bil saniran, ob odprtju še vedno zaganja svoje skripte. To je dober argument za splošno načelo, na katerem počiva ves ta članek — preverite rezultat namesto da zaupate operaciji, in sicer tako v lastnem cevovodu kot v knjižnici

Za okoliško arhirsko delo glejte sprehode skozi predlet PDF/A in PDF/UA, pravo redakcijo in odstranitev vsebine ter razširitvene sheme XMP PDF/A-3 za Factur-X, ki obravnava stran metapodatkov, ko arhivirani dokument nosi tudi strukturirane podatke računa

PDFlibPas je izvorna Pascalova knjižnica PDF za Delphi, C++Builder in Lazarus, tako da pretvorba, popravilo in preverjanje tečejo znotraj lastnega procesa brez zunanjega orodja v verigi — glejte stran izdelka PDFlibPas za podprte dele PDF/A in platforme