Dua form bisa membawa field yang sama namun berperilaku sama sekali berbeda. Sebuah AcroForm menyimpan field-nya sebagai objek PDF biasa yang duduk di atas konten halaman yang sesungguhnya, sehingga reader mana pun yang patuh bisa menggambarnya. Sebuah form XFA dinamis hampir tidak menyimpan apa pun sebagai PDF: field, layout, bahkan geometri halamannya berada dalam sebuah paket XML, dan halaman yang terlihat dihasilkan pada saat dibuka oleh sebuah layout engine yang hanya pernah dikirimkan secara luas oleh Adobe. Berikan file itu ke sebuah web viewer, sebuah renderer arsip, atau sebuah text extractor dan Anda tidak akan mendapatkan form-nya. Anda mendapatkan satu halaman abu-abu tunggal bertuliskan "Please wait... If this message is not eventually replaced by the proper contents of the document, your PDF viewer may not be able to display this type of document." Siapa pun yang pernah menangani dokumen pemerintah atau asuransi mengenali halaman itu sekali lihat
Placeholder itu bukan kerusakan. Itu persis apa yang ditentukan format untuk terjadi ketika tidak ada XFA processor yang tersedia, dan pada 2026 itu menggambarkan hampir setiap viewer di luar Acrobat desktop. Jadi langkah praktisnya adalah mengonversi form dinamis itu menjadi AcroForm biasa sebelum sampai ke mana pun di hilir. HotPDF, library PDF losLab untuk Delphi dan C++Builder, melakukan konversi itu dalam kode, membangun ulang form XML sebagai field native pada halaman native
Mengapa kedua model tidak bisa berdampingan
AcroForm didefinisikan dalam ISO 32000-1 §12.7. Setiap field adalah objek PDF dengan sebuah widget annotation dan sebuah appearance stream, halamannya adalah konten PDF sungguhan, dan datanya menumpang di atasnya. XFA membalikkan itu: form-nya adalah sebuah dokumen XML, sebuah paket XDP yang disimpan dalam entry /XFA milik dictionary AcroForm, dan halaman PDF milik form dinamis hanya berisi placeholder "Please wait" dan tidak ada yang lain, karena konten sesungguhnya tidak pernah diserialisasikan sebagai PDF. Sebuah reader memproses sebuah file sebagai salah satu dari kedua model itu. Abaikan entry /XFA dan Anda melihat cangkang kosong; hormati tanpa sebuah XFA engine dan Anda melihat peringatan itu. ISO 32000-2 mengakhiri perdebatan itu dengan menghapus XFA dari PDF 2.0, yang menjadi alasan utama mengapa "konversi selagi masih bisa" berubah dari kasus tepi menjadi kebijakan intake rutin
Sebelum mengonversi apa pun, klasifikasikan dulu, karena tidak semua file XFA menampilkan placeholder tersebut. Form XFA statis mengirimkan halaman PDF yang sudah di-render sebelumnya bersama XML-nya, sehingga form itu tampil di mana saja dan hanya berperilaku salah ketika diisi. Form dinamis hanya mengirimkan placeholder saja dan tidak bisa dipakai sampai dikonversi. Yang perlu dipercaya adalah dokumennya sendiri, jangan pernah ekstensi atau pengirimnya. Sebuah file yang me-render konten sungguhan di viewer non-Adobe namun masih membawa sebuah entry /XFA adalah statis atau hybrid; sebuah file yang menampilkan halaman peringatan adalah dinamis. Catat setiap file intake masuk ke kelompok mana. Kedua jenis itu rusak dengan cara berbeda belakangan, dan sebuah tiket tentang form arsip yang kosong ditutup dalam hitungan detik ketika intake log sudah bertuliskan "dynamic XFA, converted, 47 fields mapped, 2 warnings"
Mengonversi dokumen XFA yang dimuat menjadi field native
Konversi ini berjalan terhadap sebuah dokumen yang sudah berada di memori. FlattenLoadedXFA mem-parsing template XFA dan paket datanya, menata form-nya, lalu membangunnya kembali sebagai field AcroForm pada halaman PDF sungguhan:
var
Pdf: THotPDF;
MappedCount, I: Integer;
Warnings: TStrings;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.LoadFromFile('dynamic_xfa.pdf');
MappedCount := Pdf.FlattenLoadedXFA(True); // True = field tetap bisa diedit
Warnings := Pdf.XFAFlattenWarnings;
for I := 0 to Warnings.Count - 1 do
Log('XFA flatten warning: ' + Warnings[I]); // elemen yang tidak terpetakan
Pdf.SaveLoadedDocument('native_acroform.pdf');
Log(Format('Mapped %d fields', [MappedCount]));
finally
Pdf.Free;
end;
end;
Nilai return dan daftar peringatan itu adalah output, bukan noise debug, jadi simpan keduanya. Konversi kehilangan informasi karena sifatnya: scripting XFA, field terkalkulasi, dan perilaku subform dinamis tidak punya padanan di AcroForm, dan XFAFlattenWarnings menyebutkan setiap elemen template yang tidak terpetakan. Arsipkan file hasil konversi tanpa daftar peringatannya dan suatu hari Anda akan menatap kotak total yang kosong dalam sebuah salinan arsip tanpa catatan mengapa itu terjadi. Flag Editable mengendalikan apakah field baru tetap bisa diisi. Berikan True ketika orang akan terus mengerjakan form itu belakangan, dan kunci nilainya ketika tujuannya adalah sebuah catatan yang dibekukan
Memeriksa sebuah konversi sebagian bersifat visual, sebagian struktural, dan Anda membutuhkan keduanya. Bagian struktural itu mudah: pastikan jumlah field cocok dengan MappedCount. Bagian visuallah yang menangkap kerusakan sesungguhnya. Buka form sumbernya di Acrobat desktop, yang masih menjadi satu-satunya viewer yang menjalankan XFA engine, berdampingan dengan file hasil konversi di sebuah reader biasa, lalu bandingkan nilai dan layout pada setidaknya satu sampel terisi per template. Sebuah tanggal yang ditampilkan XFA engine sebagai 2026-06-11 bisa mendarat di salinan AcroForm sebagai nilai mentah yang tidak terformat, dan hanya mata Anda yang bisa menangkap itu
Ketika input berupa paket XDP
Tidak setiap pekerjaan dimulai dari sebuah PDF yang sudah terisi. Kadang Anda menerima paket XDP sendirian, diekspor dari sebuah tool desain form atau diserahkan oleh sistem mitra. ApplyXFAAsAcroForm menghilangkan langkah load dan menerapkan paket itu langsung ke dokumen saat ini:
XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
Kelompok pemanggilan yang sama juga berjalan ke arah sebaliknya, untuk kasus yang lebih jarang di mana Anda harus menghasilkan XFA alih-alih mengonsumsinya. AddXFAPacket melekatkan paket bernama satu per satu seperti 'xdp' atau 'config'. SetXFADocument memasang sebuah payload single-stream lengkap dalam satu pemanggilan. ClearXFAPackets menghapus registrasinya sehingga Anda bisa memulai dari awal, dan AddXFASignaturePacket menanamkan materi XAdES untuk workflow yang menandatangani data form XML secara langsung. Menghasilkan XFA pada 2026 adalah kebutuhan niche, hampir selalu dipaksakan oleh satu konsumen legacy yang menolak apa pun selainnya, namun ketika sebuah kontrak menyebutkannya, pemanggilan-pemanggilan ini membuatnya sekadar menjadi pilihan konfigurasi alih-alih sebuah tool terpisah
Makna lain dari "flatten"
Kata "flatten" menyandung banyak percakapan, karena kata itu menyebut sebuah operasi kedua yang sepenuhnya berbeda: membakar appearance field AcroForm ke dalam content stream halaman sampai tidak ada objek interaktif yang tersisa. HotPDF tidak punya API untuk itu saat ini, dan Anda ingin mengetahuinya sekarang, bukan di tengah-tengah sebuah proyek. Yang diberikan library ini sebagai gantinya adalah penguncian pada level field saat field itu dibuat, didukung oleh izin dokumen:
// Mengunci nilai saat field dibuat: text field read-only
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
Rect(50, 700, 220, 720), 0, [ffReadOnly]);
// Jaring pengaman ganda: membatasi pengisian form di seluruh dokumen
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// izin pengisian ditahan: prFillAnnotations tidak ada dalam set ini
Pahami dengan jelas apa yang didapatkan dari itu dan apa yang tidak. Sebuah field read-only tetaplah objek form. Ia tetap muncul di panel field milik viewer, nilainya bisa dibaca lewat form API, dan sebuah tool yang menulis ulang file bisa menghapus flag read-only itu lagi. Flag izin menaikkan standarnya namun bergantung pada viewer yang memilih untuk menghormatinya, sebuah batasan yang dinyatakan secara jelas oleh ISO 32000-1. Ketika sebuah regulator bersikeras bahwa sebuah catatan arsip sama sekali tidak boleh memuat objek form apa pun, jawaban jujur dengan HotPDF saat ini adalah membangun ulang dokumennya: baca keluar nilai-nilainya, lalu gambarkan sebagai konten TextOut biasa pada sebuah halaman baru, alih-alih mendandani flag read-only seolah-olah itu flattening. Satu hal yang perlu diingat pada jalur izin ini adalah CryptKeyLength harus diatur sebelum BeginDoc; selebihnya ada di artikel enkripsi AES-256 dan izin kami
Apa arti XFA bagi kepatuhan arsip
PDF/A dan PDF/X keduanya langsung menolak XFA. Sebuah pipeline yang memberi makan arsip ISO 19005 karena itu harus mengonversi lebih dulu, dan urutannya tidak bisa ditawar: load, FlattenLoadedXFA, save, lalu jalankan generasi atau validasi arsip pada hasil AcroForm-nya. Jangan perlakukan konversi sebagai bukti kepatuhan. Ia memperbaiki model form-nya dan membiarkan font, warna, dan metadata persis seperti semula, jadi validasi outputnya dengan veraPDF sebelum Anda mempercayainya. Begitu form itu berada di sisi AcroForm, perilakunya mendapat set kontrolnya sendiri. Trigger JavaScript, submit action, dan script validasi dibahas di artikel field dan action AcroForm HotPDF
Registrasi XFA, konversi, dan form API yang ditunjukkan di sini tersedia dalam HotPDF Delphi Component untuk Delphi dan C++Builder, yang dokumentasinya melacak set fitur XFA seiring pertumbuhannya melalui rilis-rilis terkini