Artikel Teknis

Output PDF 2.0, PDF/A-4 dan PDF/UA-2 dengan HotPDF di Delphi

HotPDF menulis dokumen PDF 2.0 native dari Delphi dan C++Builder, termasuk tiga profil arsip PDF/A-4 dan output aksesibel PDF/UA-2 dengan elemen struktur bernama-ruang. Memilihnya adalah urusan dua properti, tetapi standar di balik properti itu berubah lebih banyak daripada yang disiratkan nomor versi: PDF/A-4 menjatuhkan huruf conformance yang dipelajari semua orang dengan PDF/A-2, dan PDF/UA-2 memperkenalkan ruang nama struktur yang tidak pernah dimiliki dokumen bagian 1

Artikel ini membahas apa yang sebenarnya berubah di file yang dihasilkan, dan kesalahan mana yang diubah HotPDF menjadi pengecualian pada EndDoc alih-alih menjadi dokumen yang gagal validasi di lokasi pelanggan

Bagaimana identifikasi PDF/A-4 berbeda dari bagian 2 dan 3

PDF/A-4 mengidentifikasi dirinya dengan nomor bagian dan tahun revisi, tanpa huruf conformance untuk bagian dasar. Setel PDFACompliance ke '4' dan HotPDF memancarkan pdfaid:part=4 dengan pdfaid:rev=2020 dan tidak ada entri pdfaid:conformance sama sekali. Huruf itu tidak hilang — bagian 4 tidak memiliki level A/B/U, karena persyaratan yang dulu memisahkannya dilipat ke dalam bagian dasar

Dua ekstensi mempertahankan huruf. '4E' memilih PDF/A-4e untuk dokumen engineering dan memancarkan conformance E, yang mengizinkan jalur anotasi 3D dan RichMedia yang dilarang profil lain. '4F' memilih PDF/A-4f dan memancarkan conformance F, yang mengizinkan file tertanam format apa pun. Ketiganya memaksa header PDF 2.0, memerlukan output intent dan pemeriksaan metadata PDF/A yang biasa, dan melarang enkripsi — file arsip terenkripsi adalah kontradiksi yang tidak dihibur standar

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-archive.pdf';
    Pdf.PDFACompliance := '4F';   // PDF/A-4f: associated files of any format
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Invoice 2026-0731');
    Pdf.AddPDFAssociatedFile('invoice.xml', 'text/xml',
      'Structured invoice data', 'Data', LoadInvoiceBytes);
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

AddPDFAssociatedFile menanam file, membangun FileSpec-nya dengan /AFRelationship, dan mendaftarkannya baik di array /AF Catalog maupun di name tree EmbeddedFiles. Kedua pendaftaran diperlukan; file yang tercantum di hanya satu dari keduanya adalah alasan paling umum mengapa faktur hibrid lolos pemeriksaan visual cepat dan gagal pada validator nyata. String relationship menerima Source, Data, Alternative, Supplement atau Unspecified, dan profil aktif harus PDF/A-3, PDF/A-4e atau PDF/A-4f — profil bagian 4 dasar tidak mengizinkan associated file. Nama AddPDFA3AssociatedFile yang lebih lama masih berfungsi untuk kode yang ada

Apa yang diminta PDF/UA-2 yang tidak diminta PDF/UA-1

PDF/UA-2 memaksa PDF 2.0 dan memancarkan pdfuaid:part=2 dengan pdfuaid:rev=2024, dan memperkenalkan ruang nama ke dalam pohon struktur. Dokumen bagian 1 memiliki satu kosa kata peran standar yang flat. Dokumen bagian 2 dapat membawa peran kustom selama masing-masing milik ruang nama yang dideklarasikan, yang membuat penandaan khusus domain dapat dibaca oleh teknologi asistif alih-alih tebakan

Dua metode mengimplementasikan ini. RegisterStructureNamespace membuat atau menggunakan kembali dictionary /Type /Namespace indirect dan mendaftarkannya di StructTreeRoot /Namespaces, mengembalikan dictionary itu agar dapat digunakan kembali. AddStructureElementNS membuat elemen struktur yang entri /NS-nya menunjuk ke dictionary itu, yang melisensikan nama peran di luar himpunan standar. Panggilan berulang dengan URI yang sama menggunakan kembali satu dictionary alih-alih menumpuk duplikat

var
  Root: THPDFDictionaryObject;
begin
  Pdf.PDFUACompliance := True;
  Pdf.PDFUAPart := 2;             // part 2 forces PDF 2.0
  Pdf.Lang := 'en-US';
  Pdf.BeginDoc;
  Root := Pdf.AddStructureElement('Document', nil);
  Pdf.AddStructureElementNS('WidgetGroup',
    'https://example.com/ns/widgets', Root);
  Pdf.EndDoc;
end;

Lang bukan dekorasi di sini. Dokumen tagged tanpa bahasa natural yang dideklarasikan membuat screen reader menebak pengucapan, dan PDF/UA memperlakukan kelalaian itu sebagai cacat alih-alih preferensi

Kesalahan struktur apa yang ditangkap EndDoc?

Empat, dan masing-masing sesuai dengan dokumen yang sebaliknya akan mencapai validator rusak. Root struktur harus berisi tepat satu elemen Document tingkat atas. Setiap dictionary ruang nama harus indirect, bertipe Namespace, dan membawa URI unik tidak kosong. Setiap referensi /NS elemen struktur harus resolve ke dictionary yang benar-benar tercantum dalam array /Namespaces root. Dan peran tanpa ruang nama harus menjadi peran standar PDF 2.0 atau resolve melalui RoleMap

Ini muncul di EndDoc karena itu adalah momen terakhir seluruh pohon ada di memori dan momen pertama pohon itu lengkap. Menangkap lebih awal berarti menolak status intermediate yang valid; menangkap lebih lambat berarti tidak menangkap sama sekali. Konsekuensi praktis untuk kode Anda adalah bug struktur muncul di akhir generasi dengan pesan yang menamai masalahnya, alih-alih muncul berminggu-minggu kemudian sebagai laporan veraPDF yang diteruskan seseorang dari pelanggan

Peran PDF 2.0 yang patut diketahui

Enum peran bertipe menambah DocumentFragment, Aside, Title, FENote, Sub, Em, Strong dan Artifact. Tiga di antaranya mengubah cara Anda menandai dokumen bisnis biasa. Aside akhirnya memberi sidebar dan pull quote tempat yang bukan Sect yang disalahgunakan. FENote menandai footnote dan endnote sebagai apa adanya, sehingga pembaca dapat menawarkannya alih-alih menyelingkinya dengan teks isi. Em dan Strong menggantikan tebakan semantik yang datang dari menandai penekanan sebagai pemformatan level span

Overload string tambahan menerima bentuk Hn terbuka, termasuk H7 dan seterusnya. PDF 1.7 berhenti di H6, yang memaksa dokumen teknis dalam untuk meratakan outlinenya atau menggunakan kembali level. Jika Anda menghasilkan dokumen standar, kode hukum, atau katalog suku cadang, ini saja bisa menjadi alasan untuk memindahkan output ke PDF 2.0

Apa yang harus diperiksa sebelum mengganti output produksi

PDF 2.0 adalah perubahan header dengan ekor yang panjang. Alat ingest arsip yang lebih lama, beberapa RIP cetak, dan jumlah mengejutkan viewer line-of-business hanya menerima sampai PDF 1.7, dan gagal pada header alih-alih pada apa pun yang Anda lakukan salah. Sebelum beralih, konfirmasi sistem konsumen, dan ingat bahwa memilih profil PDF/A-4 memilih PDF 2.0 apakah Anda memintanya atau tidak

Urutan yang aman adalah mempertahankan PDF/A-3 untuk dokumen yang keluar ke pembaca tidak dikenal, menggunakan PDF/A-4f untuk arsip internal di mana Anda mengontrol ingest, dan mengadopsi PDF/UA-2 hanya di mana kebijakan aksesibilitas menamainya. Jika Anda mengerjakan sisi arsip lebih dulu, panduan untuk validasi PDF/A, PDF/X dan PDF/UA dan untuk faktur hibrid ZUGFeRD dan Factur-X pada PDF/A-3 membahas pilihan profil yang penting sebelum nomor versi, dan catatan tentang pelaporan preflight otomatis menunjukkan cara membuat vonis menjadi bagian build Anda alih-alih langkah manual

HotPDF mengirim seluruh permukaan authoring PDF 2.0 sebagai kode VCL native untuk Delphi dan C++Builder, jadi output PDF/A-4 dan PDF/UA-2 tidak memerlukan engine eksternal atau redistributable — halaman komponen HotPDF mencantumkan profil dan versi RAD Studio yang didukung