|
THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount THotPDF XFA forms container (v2.119.51)
|
RegisterAcroFormFont AcroForm 支援 |
|
註冊 named XFA(XML Forms Architecture)packet,以便輸出到檔案的 AcroForm /XFA entry 中。PDF 1.7 §12.7.6 + §12.7.8 允許 AcroForm 在 static /Fields array 旁邊(或取代它)攜帶 /XFA array,進而支援 hybrid AcroForm + XFA workflows 或純 dynamic XFA forms Delphi 語法: procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes); procedure ClearXFAPackets; function XFAPacketCount: Integer;
說明 每次呼叫 AddXFAPacket 會註冊一個 named packet。典型名稱(依 XFA 3.3 specification 與 PDF 1.7 §12.7.8 Table 234): Each call to
在 EndDoc 時,每個已註冊 packet 會變成一個 indirect FlateDecode-compressed stream object,而 AcroForm /XFA array 會依註冊順序交錯 packet-name PDF strings 與 stream references,因此 layout 是 byte-deterministic。ClearXFAPackets 會移除所有已註冊 packets(適合跨多份檔案重用 THotPDF instance)。XFAPacketCount 回傳目前數量 Container-level support only HotPDF 不解析 XFA XML、不實作 XFA dynamic-layout engine、不執行 XFA template 內的 FormCalc 或 JavaScript,也不驗證 template structure。呼叫端自行撰寫 XFA XML(通常透過 Adobe LiveCycle Designer,或依 XFA 3.3 specification 手寫),HotPDF 會逐位元輸出這些 bytes
具備 XFA engine 的 consumer readers(舊版 Acrobat / Reader、FormsCentral、部分 kiosk products)會 render 表單;沒有 XFA engine 的 readers(2017 年後的 Adobe Reader DC、多數 open-source readers)若檔案是 hybrid AcroForm + XFA workflow,則會顯示 fallback AcroForm fields
PDF/A and PDF/X compliance gates ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 都明確禁止 XFA forms(dynamic-layout engine 無法確定性封存)。ISO 15930 prepress workflows 完全拒絕互動式表單。在任何非空 PDFACompliance 或 PDFXCompliance 下,AddXFAPacket 會立即以相關 spec reference raise。重複 packet names 會 raise。空 PacketName 或空 XMLBytes 會 raise。RequirePDFVersion(pdf15) 會自動提高檔案版本 ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 all explicitly disallow XFA forms (the dynamic-layout engine is not deterministically archivable). ISO 15930 prepress workflows reject interactive forms entirely. AcroForm dictionary emission 只要 /Fields 至少有一個 entry,或至少註冊一個 XFA packet,就會輸出 AcroForm dict。未註冊 packets 的 pre-v2.119.51 呼叫端會維持 byte-identical /AcroForm output The AcroForm dict is emitted when either
Typical workflow (pure XFA dynamic form)
PDF.BeginDoc; TemplateBytes := TFile.ReadAllBytes('form-template.xml'); DataBytes := TFile.ReadAllBytes('form-data.xml'); PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">')); PDF.AddXFAPacket('template', TemplateBytes); PDF.AddXFAPacket('datasets', DataBytes); PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES } PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>')); PDF.EndDoc;
XDP wrapper, single-stream, dynamic, and signed XFA The array
XFA-to-AcroForm flattening ApplyXFAAsAcroForm 會將呼叫端提供的 XDP/XFA bytes 對應到目前頁面,成為 native AcroForm widgets 與簡單 page graphics。FlattenLoadedXFA 會對已載入且已攜帶 embedded /XFA packet 的 PDF 執行相同轉換。傳入 Editable=False 可讓產生的 widgets 變成 read-only,並檢查 XFAFlattenWarnings 了解無法對應的 elements
請參閱: AcroForm 支援, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField |