ConvertToPDFA mengubah dokumen biasa menjadi dokumen arsip dalam satu panggilan: ia menghapus apa yang dilarang oleh bagian yang dipilih, menambahkan apa yang dipersyaratkan bagian itu, menyatakan bagian yang diklaim dokumen, lalu memeriksa hasilnya. Klaim itu dilaporkan sebagai terpenuhi hanya bila pemeriksaan lulus, dan GetPDFAConversionReport mencantumkan apa yang telah dilakukan dan apa yang masih menghalangi
Properti terakhir itu adalah keputusan desain yang patut dipertimbangkan. Konverter yang menstempel klaim tanpa memeriksa lebih buruk daripada tidak ada konverter sama sekali, karena file yang mengatakan dirinya arsip padahal tidak akan langsung lolos dari sistem yang seharusnya menangkapnya. Kegagalan muncul bertahun-tahun kemudian, dalam audit, pada dokumen yang tidak bisa diregenerasi siapa pun
Kenapa PDF yang tampak valid gagal dalam pemeriksaan PDF/A?
Paling sering karena dua tempat PDF mengatakan siapa penulisnya tidak konsisten. Validator membaca baik dictionary informasi dokumen maupun paket XMP dan menolak file di mana keduanya berbeda — dan sebagian besar file yang gagal pada titik ini memang belum pernah menulis bagian XMP sama sekali
RepairDocumentMetadata menyelaraskan keduanya dan mengembalikan berapa entri yang diperbaikinya. Bila hanya satu bagian yang membawa nilai, bagian lain diisi darinya, jadi apa pun yang sudah terekam tidak dibuang. Tidak ada yang harus memutuskan salinan mana yang otoritatif, karena pada praktiknya satu salinan kosong
Ada perbaikan kedua dalam panggilan yang sama yang menangkap kasus yang lebih halus. Dokumen yang disetel ke mode PDF/A mendapatkan identifikasi standarnya dipulihkan jika hilang, yang terjadi setiap kali pemanggil menyediakan paket XMP sendiri. Tanpa identifikasi itu validator membaca file sebagai PDF biasa dan melaporkan setiap aturan dari bagian yang diklaim sebagai tidak terpenuhi — kegagalan yang tampak spektakuler dengan satu sebab kecil
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;
Memilih bagian sebelum mengonversi
SetPDFAMode dan ConvertToPDFA berbagi penomoran mode yang sama, dan tiga dari nilai-nilainya baru. Mode 9 adalah PDF/A-4, bagian yang dibangun di atas PDF 2.0. Mode 10 adalah PDF/A-4e, yang tambahan mengizinkan 3D dan rich media, dan mode 11 adalah PDF/A-4f, yang mengizinkan file tertanam format apa pun
Bagian 4 mengidentifikasi dirinya secara berbeda dari bagian-bagian sebelumnya: dengan nomor bagian dan tahun bagian itu diterbitkan, tanpa huruf conformance untuk PDF/A-4 biasa dan huruf E atau F untuk dua ekstensi. Pemeriksaan mengenali bagian 4, menilai filenya terhadap PDF 2.0 alih-alih 1.7, dan melaporkan file bagian 4 yang tidak menyatakan tahun revisinya
Setiap file tertanam dalam dokumen bagian 4 menyatakan bagaimana hubungannya dengan dokumen, sebagaimana dipersyaratkan baik bagian 3 maupun 4. Inilah aturan yang dulu menangkap lampiran biasa: hubungan ditulis hanya untuk lampiran setelah yang pertama dan tidak pernah untuk yang terakhir, sehingga dokumen dengan satu lampiran — kasus yang umum — tidak membawanya sama sekali dan gagal validasi persis pada titik itu
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;
Untuk apa laporan konversi
Untuk memutuskan apa yang harus dilakukan selanjutnya. Konversi yang berhasil tidak memerlukan laporan; konversi yang tidak berhasil adalah seluruh alasan laporan itu ada. Beberapa hambatan dapat dihilangkan oleh konverter dan beberapa tidak — enkripsi, konten terlarang yang membawa makna, program font yang memang tidak ada di mana pun pada mesin. Laporan membedakan apa yang telah dilakukan dari apa yang tersisa, yang mengubah "konversi gagal" menjadi item kerja
Perlakukan vonis sebagai gerbang dalam pipeline batch. Konversikan, baca vonisnya, dan arahkan file: arsipkan yang lulus, antrikan sisanya untuk manusia dengan laporan terlampir. Apa yang tidak boleh Anda lakukan adalah menyimpan output konversi yang gagal ke dalam arsip karena terlihat lebih baik daripada input — ia kini membawa klaim yang ditolak untuk dikonfirmasi oleh pemeriksaan
Membaca tanda yang sudah dibawa file
Sebelum mengonversi apa pun, ketahui apa yang dikatakan dokumen tentang dirinya. Pemeriksaan PDF/A yang tidak bisa membaca tanda standar yang ada menghakimi setiap file terhadap bagian 1 apa pun yang dideklarasikannya, yang berarti dokumen PDF/A-2 atau PDF/A-3 yang sah dilaporkan sebagai tidak membawa tanda dan memiliki versi yang terlalu tinggi — kebalikan dari kebenaran
Tanda itu dibaca apakah producer menuliskannya sebagai elemen XMP atau sebagai atribut. Kedua bentuk adalah XMP biasa, dan menerima hanya salah satunya membuat file dari producer lain terlihat tidak ditandai. Jika Anda pernah bertanya-tanya mengapa dokumen yang valid di tempat lain gagal di pipeline Anda sendiri, ini adalah tempat yang baik untuk dicheck pertama
Menyaring sebelum mengarsipkan, dan bug yang perlu diketahui
Konversi arsip dan sanitasi sering berjalan bersama, karena konten yang ingin dihapus oleh kebijakan keamanan sangat tumpang tindih dengan konten yang dilarang PDF/A. SanitizeDocument menghapus JavaScript, dan menghapus skrip terakhir juga menghapus name tree kosong yang ditinggalkannya — tree yang jika tidak akan tetap memberi tahu pembaca bahwa dokumen membawa skrip
Setengah kedua itu dipelajari dengan cara yang sulit: off-by-one dalam daftar paket berarti sanitasi melaporkan menghapus skrip sementara tidak menghapus satu pun, jadi dokumen yang telah disanitasi tetap menjalankan skripnya saat dibuka. Itu argumen yang baik untuk prinsip umum yang menjadi dasar seluruh artikel ini — verifikasi hasil alih-alih mempercayai operasi, dalam pipeline Anda sendiri maupun di library
Untuk pekerjaan arsip di sekitarnya, lihat panduan preflight PDF/A dan PDF/UA, redaction sejati dan penghapusan konten, dan skema ekstensi XMP PDF/A-3 untuk Factur-X, yang membahas sisi metadata ketika dokumen yang diarsipkan juga membawa data faktur terstruktur
PDFlibPas adalah library PDF Pascal native untuk Delphi, C++Builder dan Lazarus, jadi konversi, perbaikan dan validasi semuanya terjadi di dalam proses Anda sendiri tanpa alat eksternal dalam rantainya — lihat halaman produk PDFlibPas untuk bagian PDF/A dan platform yang didukung