PDF/A, PDF/X, dan PDF/UA adalah tiga standar berbeda yang menyelesaikan tiga masalah berbeda: pengarsipan jangka panjang, pertukaran cetak, dan aksesibilitas. Ketiganya bukanlah tiga checkbox pada satu form kepatuhan, dan kesalahan paling umum adalah memperlakukannya seolah begitu. Sebuah file bisa saja sempurna sebagai PDF/A namun tidak berguna bagi percetakan; sebuah master cetak yang sempurna bisa saja tidak terbaca oleh screen reader. Yang lebih buruk, ketiganya adalah batasan pada struktur internal file, bukan pada tampilannya. Sebuah dokumen yang terbuka dengan mulus di setiap viewer yang Anda miliki tetap bisa gagal validasi pada percobaan pertama, dan biasanya memang begitu
HotPDF, library PDF VCL native milik losLab, memperlakukan kesesuaian sebagai sesuatu yang Anda deklarasikan sebelum halaman pertama pun ada. Anda mengatur sebuah property kepatuhan, melekatkan struktur yang diminta standar tersebut, dan library ini menolak konfigurasi yang bertentangan dengan profil pada saat penyimpanan. Ini adalah model yang lebih baik daripada menghasilkan sebuah file lalu berharap sebuah post-processor bisa menambalnya belakangan, karena sebagian besar yang diminta standar-standar ini tidak bisa ditambahkan setelah faktanya
Tiga standar ISO, tiga janji yang berbeda
PDF/A (ISO 19005) berbicara tentang waktu. Ia menjanjikan sebuah file akan tetap ter-render secara identik puluhan tahun dari sekarang, sehingga ia menuntut kemandirian penuh: setiap font tertanam, setiap warna diberi makna yang tidak bergantung pada perangkat melalui sebuah OutputIntent, metadata XMP lengkap, dan larangan terhadap apa pun yang perilakunya bergantung pada lingkungan. Enkripsi dan JavaScript tidak diperbolehkan, karena tidak ada yang bisa menjamin decryptor atau script engine itu masih ada pada 2050
PDF/X (ISO 15930) berbicara tentang warna di atas kertas. Ia ada agar seorang desainer bisa menyerahkan sebuah file ke percetakan tanpa keduanya perlu berdiskusi lebih jauh, yang berarti kondisi pencetakan yang terkarakterisasi, sebuah kunci /Trapped yang wajib, geometri trim dan bleed yang ditentukan, dan, dalam varian X-1a, tanpa transparansi hidup yang harus ditebak-tebak oleh RIP. PDF/UA (ISO 14289) berbicara tentang siapa yang bisa membaca hasilnya. Teknologi assistive membutuhkan tag tree yang lengkap, urutan baca yang masuk akal, bahasa dokumen yang dideklarasikan, dan alternatif teks untuk apa pun yang bukan teks
Karena ketiganya menarik ke arah yang berbeda, pilih standar yang berlaku per saluran output alih-alih mengejar satu file yang memuaskan ketiganya sekaligus. Sebuah master cetak yang hanya CMYK adalah hal yang persis salah untuk diserahkan kepada pengguna screen reader yang tidak pernah melihat warna, dan penguncian profil arsip terhadap perilaku dinamis berbenturan dengan apa pun yang interaktif. Hasilkan per saluran dari data sumber yang sama dan Anda menghindari seluruh konflik ini
PDF/A: OutputIntent adalah bagian yang selalu dilupakan semua orang
Jika sebuah file PDF/A gagal validasi, OutputIntent adalah hal pertama yang perlu diperiksa. Inilah struktur yang paling sering dilewatkan oleh generator, justru karena tidak ada apa pun yang terlihat bergantung padanya. ISO 19005 mewajibkan satu: sebuah profil ICC tertanam yang memastikan makna sesungguhnya dari warna device dokumen tersebut. HotPDF menjadikan profil itu sebuah input eksplisit, bukan sekadar pemikiran belakangan:
var
Pdf: THotPDF;
ICC: TFileStream;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'invoice-archival.pdf';
Pdf.PDFACompliance := 'B'; // level B: fidelitas visual
Pdf.Lang := 'en-US';
Pdf.StandardFontEmulation := False; // menanamkan font asli, tanpa emulasi Base-14
ICC := TFileStream.Create('sRGB.icc', fmOpenRead);
try
Pdf.AddPDFAOutputIntent('sRGB IEC61966-2.1', '', ICC, 3, 'DeviceRGB');
finally
ICC.Free;
end;
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(50, 760, 0, 'Archival invoice body');
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Ada beberapa detail yang menentukan lulus atau gagal di sini. StandardFontEmulation harus mati: font Base-14 yang diemulasikan tidak tertanam, dan penanaman font tidak bisa ditawar-tawar di bawah ISO 19005. Enkripsi harus tetap dinonaktifkan, jadi jangan pernah menggabungkan PDFACompliance dengan ActivateProtection; sebuah file arsip yang terenkripsi adalah kontradiksi yang langsung ditangkap validator. Jumlah komponen dalam AddPDFAOutputIntent harus cocok dengan profilnya, yakni 3 untuk profil RGB seperti sRGB IEC61966-2.1 dan 4 untuk CMYK. HotPDF melacak penggunaan DeviceRGB dan DeviceCMYK terhadap intent yang dideklarasikan saat menulis, sehingga sebuah fill CMYK yang nyasar dalam dokumen ber-intent RGB berubah menjadi masalah yang dilaporkan, bukan yang diam-diam lolos
Satu hal yang layak disampaikan tentang profil ICC ini: perlakukan sebagai artifact deployment yang diberi versi, bukan sebuah file yang sekali pernah diletakkan seseorang di build server. Byte-nya tertanam ke dalam setiap dokumen yang Anda hasilkan, sehingga sebuah profil yang terpotong atau rusak diam-diam meracuni seluruh batch, dan Anda baru mengetahuinya saat validasi. Sertakan bersama installer Anda, catat checksum-nya dalam run log, dan muat melalui pola TFileStream yang ditunjukkan di atas sehingga sebuah file yang hilang gagal dengan keras saat generasi, bukan diam-diam di gerbang arsip
PDF/X untuk cetak: Trapped, CMYK, dan profil press
Master cetak membalik cerita warnanya. Press menginginkan CMYK yang terkarakterisasi, dan standarnya mewajibkan Anda menyatakan apakah trapping sudah diterapkan bahkan ketika jawaban jujurnya adalah Anda sama sekali tidak tahu. Kunci /Trapped tetap wajib apa pun keadaannya:
Pdf.PDFXCompliance := 'X-1a';
Pdf.Trapped := 'Unknown'; // kunci wajib menurut ISO 15930
ICC := TFileStream.Create('FOGRA39.icc', fmOpenRead);
try
Pdf.AddPDFXOutputIntent('FOGRA39 (ISO 12647-2:2004)', '', ICC, 4, 'DeviceCMYK');
finally
ICC.Free;
end;
Pdf.BeginDoc;
// menggambar dengan warna yang aman untuk CMYK, tanpa transparansi, tanpa enkripsi
Pdf.EndDoc;
Jumlah komponennya sekarang 4 untuk profil press CMYK. X-1a juga melarang transparansi hidup, jadi audit kode gambar mana pun yang menumpuk elemen tembus pandang; apa pun yang dikomposit oleh sebuah viewer di layar adalah persis apa yang akan ditolak diinterpretasikan oleh sebuah RIP. Ketika percetakan Anda mengirim karakterisasi yang berbeda, tukar byte profil dan string identifiernya namun biarkan struktur di sekitarnya tetap sama
PDF/UA: struktur dihasilkan, tidak pernah ditambal belakangan
Aksesibilitas adalah standar yang paling sering dicoba tim untuk ditempelkan di akhir, dan pendekatan itu dihukum lebih keras oleh standar ini dibanding dua lainnya. Tag tree harus mencerminkan urutan konten dibuat secara logis, informasi yang sudah tidak lagi Anda miliki begitu file selesai ditulis. Mengatur PDFUACompliance mengaktifkan output tagged, dan structure API mengikat setiap pemanggilan gambar pada peran semantiknya sambil berjalan:
Pdf.PDFUACompliance := True; // otomatis mengaktifkan tagged PDF
Pdf.Lang := 'en-US'; // atur secara eksplisit; kosong akan kembali ke 'en'
Pdf.BeginDoc;
Root := Pdf.AddStructureElement(sstDocument, nil);
H1 := Pdf.EmitTaggedHeading(1, Root, 50, 700, 'Quarterly Report');
Para := Pdf.BeginTaggedContent('P', Root);
Pdf.CurrentPage.TextOut(50, 650, 0, 'Revenue grew in all regions.');
Pdf.EndTaggedContent;
Pdf.EndDoc;
Kegagalan yang perlu diwaspadai adalah teks yang digambar di luar pasangan BeginTaggedContent/EndTaggedContent mana pun. Ia ter-render sempurna dan tetap tidak terlihat bagi screen reader, sehingga tidak ada tester yang bisa melihat yang pernah menangkapnya; bug itu terkirim dan baru muncul ke permukaan ketika seorang pengguna teknologi assistive sesungguhnya menabrak celah tersebut. Ketika template Anda membawa nama role struktur khusus, petakan nama itu ke set standar dengan AddStructRoleMap('MyHead', 'H1') sehingga reader yang patuh tahu apa maknanya. ISO 14289 juga mewajibkan bahasa yang dideklarasikan. HotPDF kembali ke 'en' ketika Lang kosong, namun itu adalah jaring pengaman, bukan alasan untuk membiarkan bahasa dokumen yang sesungguhnya tidak diatur
Verifikasi: percayai validator, bukan viewer
Sebuah viewer yang berhasil membuka file Anda tidak membuktikan apa pun tentang kesesuaian, sehingga verifikasi seharusnya berada dalam jalur rilis dengan tool yang memeriksa struktur, bukan rendering. Untuk PDF/A dan PDF/UA, veraPDF adalah validator open-source setara referensi; ia melaporkan kegagalan berdasarkan klausul ISO, yang langsung memetakan kembali ke konfigurasi di atas. Untuk PDF/X, profil Preflight milik Adobe Acrobat masih menjadi pemeriksaan yang praktis, karena kesesuaian press sama pentingnya soal intent warna maupun sintaks
Generator melakukan bagiannya sendiri dalam hal ini. Pada saat penyimpanan, HotPDF mencocokkan flag fitur terhadap versi PDF yang dikonfigurasi, secara diam-diam menurunkan apa yang tidak bisa diekspresikan versi tersebut, seperti AES-256 turun menjadi AES-128 di bawah PDF 1.7. Gerbang kepatuhan dalam EndDoc melangkah lebih jauh dan langsung memunculkan error pada kontradiksi keras, seperti meminta PDFACompliance bersamaan dengan enkripsi. Tidak ada satu pun dari ini yang menggantikan validator eksternal. Keduanya hanya mencegah konfigurasi yang mustahil sampai ke sana
Satu kebiasaan yang terus terbukti berharga: beri versi pada seluruh setup kepatuhan sebagai satu unit. Rilis HotPDF, revisi template, checksum profil ICC, build validator yang memberi persetujuan. Kesesuaian bergeser begitu salah satu dari itu berubah tanpa yang lain, dan audit paling buruk adalah yang tidak seorang pun bisa merekonstruksi kombinasi mana yang menghasilkan sebuah file arsip berusia lima tahun. Satu catatan konfigurasi per batch menyelesaikan itu untuk selamanya
Terakhir, jalankan validator pada output produksi yang sesungguhnya, jangan pernah pada sampel buatan tangan yang rapi. Kegagalan yang benar-benar menggigit datang dari data yang tidak pernah diantisipasi siapa pun: logo pelanggan yang datang sebagai CMYK padahal intent-nya menyatakan RGB, sebuah penyesuaian template yang menyelipkan font yang tidak tertanam, sebuah jalur kode baru yang menggambar teks di luar tag tree. Simpan satu file yang diketahui bermasalah dari setiap insiden masa lalu sebagai input regresi dan gerbang kepatuhan tetap jujur seiring waktu. Untuk sisi rendering dari pipeline-pipeline ini, lihat artikel kami tentang output report, font, dan gambar dengan HotPDF; untuk menghubungkan validator ke dalam sebuah build, ada artikel pendamping tentang mengotomatiskan pemeriksaan preflight PDF
Property kepatuhan, output intent, dan tagging API yang digunakan dalam contoh-contoh ini tersedia dalam HotPDF Delphi Component untuk Delphi dan C++Builder; halaman produk menautkan referensi lengkap untuk setiap pemanggilan yang ditunjukkan di sini