Tehnički članak

Pretvorba PDF-a u PDF/A i popravak njegovih metapodataka

ConvertToPDFA jednim pozivom pretvara običan dokument u arhivski: uklanja ono što odabrani dio zabranjuje, dodaje ono što dio zahtijeva, iskazuje dio koji dokument traži, a zatim provjerava rezultat. Zahtjev se prijavljuje kao ispunjen samo kad provjera prođe, a GetPDFAConversionReport navodi što je učinjeno i što još stoji na putu

Upravo je ta posljednja osobina odluka u dizajnu o kojoj vrijedi razmisliti. Pretvarač koji udara pečat zahtjeva bez provjere gori je od nepostojanja pretvarača uopće, jer datoteka koja kaže da je arhivska, a nije, prolazi ravno kroz sustave koji bi je inače uhvatili. Neuspjeh ispliva godinama kasnije, u reviziji, na dokumentu koji nitko ne može iznova generirati

Zašto PDF koji izgleda valjano pada na PDF/A provjeri?

Najčešće zato što se dva mjesta na kojima PDF kaže tko ga je napisao ne slažu. Validator čita i rječnik podataka o dokumentu i XMP paket te odbacuje datoteku u kojoj se razlikuju, a većina datoteka koje padaju na toj točki jednostavno nikad nije imala zapisanu XMP polovinu

RepairDocumentMetadata usklađuje ih i vraća koliko je unosa popravio. Kad samo jedna polovica nosi vrijednost, druga se puni iz nje, pa se ništa već zabilježeno ne odbacuje. Nitko ne mora odlučivati koja je kopija mjerodavna, jer u praksi jedna kopija ostaje prazna

Postoji drugi popravak u istom pozivu koji hvata suptilniji slučaj. Dokumentu postavljenom u PDF/A način vraća se identifikacija standarda ako je izgubljena, a to se događa kad god pozivatelj dostavi vlastiti XMP paket. Bez te identifikacije validator čita datoteku kao običan PDF i prijavljuje svako pravilo traženog dijela kao neispunjeno, spektakularan neuspjeh s 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 dijela prije pretvorbe

SetPDFAMode i ConvertToPDFA dijele istu numeraciju načina, a tri vrijednosti su nedavne. Način 9 je PDF/A-4, dio izgrađen na PDF 2.0. Način 10 je PDF/A-4e, koji dodatno dopušta 3D i bogate medije, a način 11 je PDF/A-4f, koji dopušta ugrađenu datoteku bilo kojeg formata

Dio 4 identificira se drukčije od dijelova prije njega: brojem dijela i godinom objave svog dijela, bez slova sukladnosti za obični PDF/A-4 i sa slovom E ili F za dva proširenja. Provjera prepoznaje dio 4, sudi njegovim datotekama prema PDF 2.0 umjesto 1.7, i prijavljuje datoteku dijela 4 koja ne navodi svoju godinu revizije

Svaka ugrađena datoteka u dokumentu dijela 4 navodi kako se odnosi prema dokumentu, kako dijelovi 3 i 4 oba zahtijevaju. To je pravilo koje je nekad hvatalo obične privitke: odnos je zapisivan samo za privitke nakon prvog, a nikad za zadnji, pa je dokument s jednim privitkom, uobičajeni slučaj, uopće nije nosio i padao je na provjeri valjanosti upravo na toj 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;

Čemu služi izvješće o pretvorbi

Odluci o tome što dalje. Pretvorba koja uspijeva ne treba izvješće; ona koja ne uspijeva cijeli je razlog postojanja izvješća. Neke su prepreke uklonjive pretvaračem, a neke nisu: šifriranje, zabranjeni sadržaj koji nosi značenje, program fonta koji jednostavno nije prisutan nigdje na stroju. Izvješće razlikuje ono što je učinjeno od onoga što preostaje, što pretvara pretvorba neuspjela u radnu stavku

Postupajte s presudom kao s vratima u skupnoj cjevovodnoj obradi. Pretvorite, pročitajte presudu i usmjerite datoteku: arhivirajte one koje su prošle, ostale stavite u red za čovjeka s priloženim izvješćem. Ono što ne biste trebali jest spremiti izlaz neuspjele pretvorbe u arhivu jer izgleda bolje od ulaza, jer sada nosi zahtjev koji je provjera odbila potvrditi

Čitanje oznake koju datoteka već nosi

Prije pretvaranja ičega, znajte što dokument kaže o sebi. PDF/A provjera koja ne može pročitati postojeću oznaku standarda sudi svakoj datoteci prema dijelu 1, što god ona deklarirala, što znači da se savršeno valjan PDF/A-2 ili PDF/A-3 dokument prijavljuje kao da ne nosi oznaku i da je previsoke verzije, suprotno od istine

Oznaka se čita bez obzira na to je li producent zapisao kao XMP element ili kao atribut. Oba su oblika običan XMP, i prihvaćanje samo jednog od njih ostavlja datoteke drugih producenata neoznačenima. Ako ste se ikada zapitali zašto dokument koji drugdje prolazi provjeru pada u vašem cjevovodu, ovo je dobro mjesto za prvo zaviriti

Sanitizacija prije arhiviranja i greška koju je vrijedno poznavati

Arhivska pretvorba i sanitizacija često teku zajedno, jer se sadržaj koji sigurnosna politika želi ukloniti u velikoj mjeri preklapa sa sadržajem koji PDF/A zabranjuje. SanitizeDocument uklanja JavaScript, a uklanjanje posljednje skripte također uklanja prazno stablo imena koje ona ostavlja za sobom, stabvo koje bi inače i dalje govorilo čitaču da je dokument nosio skripte

Taj drugi dio naučen je na teži način: greška za jedan u popisu paketa značila je da sanitizacija prijavljuje uklanjanje skripti a da ne ukloni nijednu, pa je dokument koji je bio sanitiziran i dalje pokretao svoje skripte pri otvaranju. To je dobar argument za opće načelo na kojem počiva cijeli ovaj članak: provjerite rezultat umjesto da vjerujete operaciji, u vlastitom cjevovodu koliko i u knjižnici

Za okružujući arhivski rad, pogledajte prikaze PDF/A i PDF/UA preleta, stvarnog redigiranja i uklanjanja sadržaja te XMP shema proširenja PDF/A-3 za Factur-X, koji pokriva stranu metapodataka kad arhivirani dokument također nosi strukturirane podatke fakture

PDFlibPas je izvorna Pascal PDF knjižnica za Delphi, C++Builder i Lazarus, pa se pretvorba, popravak i provjera odvijaju unutar vlastitog procesa bez vanjskog alata u lancu. Pogledajte stranicu proizvoda PDFlibPas za podržane PDF/A dijelove i platforme