ConvertToPDFA transformă un document obișnuit într-unul de arhivare într-un singur apel: elimină ceea ce partea aleasă interzice, adaugă ceea ce partea cere, declară partea pe care o revendică documentul, apoi verifică rezultatul. Revendicarea este raportată ca îndeplinită doar când verificarea trece, iar GetPDFAConversionReport enumeră ce s-a făcut și ce încă stă în cale
Această ultimă proprietate este decizia de proiectare asupra căreia merită să insistați. Un convertor care ștampilează revendicarea fără să verifice este mai rău decât niciun convertor, deoarece un fișier care spune că este de arhivare și nu este trece direct prin sistemele care altfel l-ar fi prins. Eșecul apare ani mai târziu, într-un audit, pe un document pe care nimeni nu îl mai poate regenera
De ce eșuează un PDF cu aspect valid la o verificare PDF/A?
De cele mai multe ori pentru că cele două locuri în care un PDF spune cine l-a scris nu sunt de acord. Un validator citește atât dicționarul de informații al documentului, cât și pachetul XMP și respinge un fișier în care diferă — iar majoritatea fișierelor care eșuează pe acest punct pur și simplu nu au avut niciodată scrisă jumătatea XMP
RepairDocumentMetadata le aduce la acord și returnează câte intrări a reparat. Acolo unde doar o jumătate poartă o valoare, cealaltă este completată din ea, astfel încât nimic din ce a fost deja înregistrat nu este aruncat. Nimeni nu trebuie să decidă ce copie este autoritară, deoarece în practică o copie este goală
Există o a doua reparație în același apel care prinde un caz mai subtil. Un document setat la un mod PDF/A primește identificarea standardelor restaurată dacă a fost pierdută, ceea ce se întâmplă ori de câte ori un apelant furnizează propriul pachet XMP. Fără acea identificare un validator citește fișierul ca un PDF obișnuit și raportează fiecare regulă a părții revendicate ca neîndeplinită — un eșec de aspect spectacular cu o cauză mică
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;
Alegerea părții înainte de a converti
SetPDFAMode și ConvertToPDFA împart aceeași numerotare de moduri, iar trei dintre valori sunt recente. Modul 9 este PDF/A-4, partea construită pe PDF 2.0. Modul 10 este PDF/A-4e, care permite suplimentar 3D și media bogată, iar modul 11 este PDF/A-4f, care permite un fișier încorporat în orice format
Partea 4 se identifică diferit față de părțile dinaintea ei: prin număr de parte și anul publicării, fără literă de conformanță pentru PDF/A-4 simplu și cu litera E sau F pentru cele două extensii. Verificarea recunoaște partea 4, își judecă fișierele după PDF 2.0 mai degrabă decât 1.7 și raportează un fișier de partea 4 care nu își declară anul reviziei
Fiecare fișier încorporat într-un document de partea 4 declară cum se raportează la document, așa cum cer și părțile 3 și 4. Aceasta este regula care prindea înainte atașamentele obișnuite: relația era scrisă doar pentru atașamentele de după primul și niciodată pentru ultimul, așa că un document cu un singur atașament — cazul comun — nu purta deloc una și eșua validarea exact pe acel punct
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;
La ce folosește raportul de conversie
La decizia ce urmează făcut. O conversie care reușește nu are nevoie de raport; o conversie care nu reușește este motivul întreg pentru care există raportul. Unele obstacole sunt eliminabile de un convertor, altele nu — criptarea, conținutul interzis care poartă înțeles, un program de font care pur și simplu nu este nicăieri pe mașină. Raportul distinge ce s-a făcut de ce rămâne, ceea ce transformă „conversia a eșuat” într-un element de lucru
Tratați verdictul ca poartă într-un flux de lot. Convertiți, citiți verdictul și direcționați fișierul: arhivați-le pe cele care au trecut, le puneți în coadă pe restul pentru un om, cu raportul atașat. Ceea ce nu trebuie să faceți este să salvați ieșirea unei conversii eșuate în arhivă pentru că arată mai bine decât intrarea — acum poartă o revendicare pe care verificarea a refuzat să o confirme
Citirea mărcii pe care un fișier o poartă deja
Înainte de a converti ceva, știți ce spune documentul despre sine. O verificare PDF/A care nu poate citi marca de standarde existentă judecă fiecare fișier după partea 1 indiferent ce declară, ceea ce înseamnă că un document PDF/A-2 sau PDF/A-3 perfect valid este raportat ca nepurtând nicio marcă și ca fiind de versiune prea mare — opusul adevărului
Marca este citită indiferent dacă producătorul a scris-o ca element XMP sau ca atribut. Ambele forme sunt XMP obișnuit, iar acceptarea doar a uneia lasă fișierele de la alți producători să pară nemarcate. Dacă v-ați întrebat vreodată de ce un document care se validează altundeva eșuează în propriul flux, acesta este un loc bun de verificat mai întâi
Igienizare înainte de arhivare și bug-ul care merită cunoscut
Conversia de arhivare și igienizarea rulează adesea împreună, deoarece conținutul pe care o politică de securitate vrea să îl elimine se suprapune masiv cu conținutul pe care PDF/A îl interzice. SanitizeDocument elimină JavaScript, iar eliminarea ultimului script elimină și arborele de nume gol pe care îl lasă în urmă — arbore care altfel i-ar mai spune unui cititor că documentul purta scripturi
Acea a doua jumătate a fost învățată pe pielea proprie: o eroare off-by-one în lista de pachete făcea igienizarea să raporteze că elimină scripturi în timp ce nu elimina nimic, așa că un document care fusese igienizat își rula încă scripturile la deschidere. Este un argument bun pentru principiul general pe care se sprijină întregul acest articol — verificați rezultatul în loc să aveți încredere în operațiune, în propriul flux la fel de mult ca în bibliotecă
Pentru munca de arhivare înconjurătoare, vedeți prezentările detaliate despre preflight PDF/A și PDF/UA, redactarea reală și eliminarea conținutului, și schemele de extensie XMP PDF/A-3 pentru Factur-X, care acoperă partea de metadate când documentul arhivat poartă și date de factură structurate
PDFlibPas este o bibliotecă PDF nativă în Pascal pentru Delphi, C++Builder și Lazarus, astfel încât conversia, repararea și validarea au loc toate în interiorul propriului proces, fără niciun instrument extern în lanț — vedeți pagina produsului PDFlibPas pentru părțile PDF/A suportate și platforme