Techninis straipsnis

PDF konvertavimas į PDF/A ir jo metaduomenų taisymas

ConvertToPDFA vienu kvietimu paprastą dokumentą paverčia archyviniu: pašalina tai, ką pasirinkta dalis draudžia, prideda tai, ko dalis reikalauja, nurodo dalį, kurią dokumentas deklaruoja, ir po to patikrina rezultatą. Deklaracija pranešama kaip įvykdyta tik tada, kai patikra praeina, o GetPDFAConversionReport išvardija, kas buvo padaryta ir kas vis dar trukdo

Būtent ši paskutinė savybė yra dizaino sprendimas, vertas apsistoti. Konverteris, kuris antspauduoja deklaraciją netikrinęs, yra blogesnis už jokį konverterį, nes failas, sakantis, kad yra archyvinis, o toks nėra, praeina tiesiai per sistemas, kurios kitu atveju jį būtų pagavusios. Triktis iškyla po metų audite, dokumente, kurio niekas negali iš naujo sugeneruoti

Kodėl tinkamai atrodantis PDF nepraeina PDF/A patikros?

Dažniausiai todėl, kad dvi vietos, kuriose PDF sako, kas jį parašė, nesutampa. Validatorius skaito ir dokumento informacijos žodyną, ir XMP paketą bei atmeta failą, kuriame jie skiriasi — ir dauguma failų, kurie trikiasi šiuo klausimu, tiesiog neturi XMP pusės išvis užrašytos

RepairDocumentMetadata juos sugretina ir grąžina, kiek įrašų pataisė. Kur viena pusė neša reikšmę, kita užpildoma iš jos, todėl niekas jau užregistruota nėra išmetama. Niekam nereikia spręsti, kuri kopija yra patikimą, nes praktikoje viena kopija būna tuščia

Tame pačiame kvietime yra antras taisymas, kuris pagauna subtilesnį atvejį. Dokumentui, nustatytam į PDF/A režimą, atstatoma standartų identifikacija, jei ji buvo prarasta — tai atsitinka kiekvieną kartą, kai kviesiantysis pateikia savo XMP paketą. Be tos identifikacijos validatorius skaito failą kaip paprastą PDF ir praneša kiekvieną deklaruotos dalies taisyklę kaip neįvykdytą — įspūdingai atrodanti triktis su viena maža priežastimi

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;

Dalies parinkimas prieš konvertuojant

SetPDFAMode ir ConvertToPDFA dalijasi tą patį režimų numeraciją, ir trys reikšmės yra naujos. Režimas 9 yra PDF/A-4, dalis, sukurta ant PDF 2.0. Režimas 10 yra PDF/A-4e, kuris papildomai leidžia 3D ir praturtintą mediją, o režimas 11 yra PDF/A-4f, kuris leidžia įterptą failą bet kokiu formatu

4 dalis identifikuoja save kitaip nei dalys prieš ją: pagal dalies numerį ir savo dalies publikavimo metus, be atitikties laiško paprastam PDF/A-4 ir su laišku E arba F dviem plėtiniams. Patikra atpažįsta 4 dalį, vertina jos failus pagal PDF 2.0, o ne 1.7, ir praneša apie 4 dalies failą, kuris nenurodo savo revizijos metų

Kiekvienas įterptas failas 4 dalies dokumente nurodo, kaip jis siejasi su dokumentu, kaip reikalauja tiek 3, tiek 4 dalys. Tai yra taisyklė, kuri anksčiau gaudydavo įprastus priedus: ryšys buvo užrašomas tik priedams po pirmuoju ir niekada paskutiniam, todėl dokumentas su vienu priedu — įprastas atvejis — neturėjo jo išvis ir nepraėjo tikrinimo būtent šiuo klausimu

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;

Kam reikalingas konvertavimo ataskaita

Spręsti, ką daryti toliau. Konvertavimui, kuris pavyksta, ataskaitos nereikia; konvertavimui, kuris nepavyksta, ji ir yra visa priežastis, kodėl ataskaita egzistuoja. Kai kurios kliūtys pašalinamos konverterio, o kai kurios — ne: šifravimas, draudžiamas turinys, nešantis prasmę, šrifto programa, kurios tiesiog nėra niekur kompiuteryje. Ataskaita atskiria, kas buvo padaryta, nuo to, kas liko, ir tai paverčia „konvertavimas nepavyko“ darbo elementu

Traktuokite verdiktą kaip vartus paketinio konvejerio. Konvertuokite, skaitykite verdiktą ir nukreipkite failą: archyvuokite tuos, kurie praėjo, o likusius įdėkite į eilę žmogui su pridėta ataskaita. Ko neturėtumėte daryti — tai išsaugoti nepavykusio konvertavimo išvestį į archyvą, nes ji atrodo geriau nei įvestis — ji dabar neša deklaraciją, kurios patikra atsisakė patvirtinti

Jau esamo įrašo, kurį failas neša, skaitymas

Prieš konvertuodami bet ką, žinokite, ką dokumentas sako apie save. PDF/A patikra, negalinti perskaityti esamo standartų įrašo, vertina kiekvieną failą pagal 1 dalį, ką jis bedeklaruotų, o tai reiškia, kad visiškai taisyklingas PDF/A-2 ar PDF/A-3 dokumentas pranešamas kaip neturintis įrašo ir esantis per aukštos versijos — priešingai tiesai

Įrašas skaitomas nepriklausomai nuo to, ar gamintojas užrašė jį kaip XMP elementą, ar kaip atributą. Abi formos yra įprastas XMP, ir priimant tik vieną iš jų, failai iš kitų gamintojų atrodo nepažymėti. Jei kada nors svarstėte, kodėl dokumentas, kuris patikrinamas kitur, trikiasi jūsų pačių konvejeryje, tai gera vieta pažiūrėti pirmiausia

Valymas prieš archyvavimą ir riktas, vertas žinoti

Archyvinis konvertavimas ir valymas dažnai vyksta kartu, nes turinys, kurį nori pašalinti saugumo politika, stipriai persidengia su turiniu, kurį draudžia PDF/A. SanitizeDocument pašalina JavaScript, o paskutinio scenarijaus pašalinimas taip pat pašalina tuščią pavadinimų medį, kurį jis palieka — medį, kuris kitaip vis dar sakytų skaitytuvui, kad dokumentas nešė scenarijus

Antrąją pusę išmoko sunkiu būdu:Vienetas išjungimas paketų sąraše reiškė, kad valymas pranešdavo šalinantis scenarijus, nors iš tikrųjų jų nešalino, todėl išvalytas dokumentas vis dar paleisdavo savo scenarijus atidaromas. Tai geras argumentas už bendrąjį principą, kuriuo remiasi visas šis straipsnis — patikrinkite rezultatą, o ne pasitikėkite operacija, tiek savo konvejeryje, tiek bibliotekoje

Dėl supančio archyvavimo darbo žr. PDF/A ir PDF/UA skrydžio prieš tai, tikrojo redagavimo ir turinio pašalinimo bei PDF/A-3 XMP plėtimo schemų, skirtų Factur-X aprašymus, kurie padengia metaduomenų pusę, kai archyvuojamas dokumentas taip pat neša struktūrizuotus sąskaitų duomenis

PDFlibPas yra natyvi Pascal PDF biblioteka, skirta Delphi, C++Builder ir Lazarus, todėl konvertavimas, taisymas ir tikrinimas vyksta jūsų pačių procese be išorinio įrankio grandinėje — žr. PDFlibPas produkto puslapį dėl palaikomų PDF/A dalių ir platformų