THotPDF.AddXFAPacket / ClearXFAPackets / XFAPacketCount

THotPDF XFA forms container (v2.119.51)

 

RegisterAcroFormFont  AcroForm サポート

ドキュメントの AcroForm /XFA エントリ内で出力するための名前付き XFA (XML Forms Architecture) パケットを登録します。PDF 1.7 §12.7.6 + §12.7.8 では、AcroForm に静的な /Fields 配列と並行して(またはその代わりに)/XFA 配列を持たせることができ、ハイブリッドの AcroForm + XFA ワークフローまたは純粋な動的 XFA フォームを可能にします。

 

Delphi 構文:

procedure AddXFAPacket(const Packet名前: AnsiString; const XMLBytes: TBytes);

procedure ClearXFAPackets;

function XFAPacketCount: Integer;

 

説明

AddXFAPacket を呼び出すたびに、1 つの名前付きパケットが登録されます。一般的な名前(XFA 3.3 仕様および PDF 1.7 §12.7.8 テーブル 234 に準拠)は次のとおりです。

 

template - フォームのレイアウト + スクリプト(ほとんどの XFA ドキュメントで最大のパケット)。

datasets - データバインディング(テンプレートがレンダリング対象とする XML ペイロード)。

config - ビューアー構成。

connectionSet - 外部データ接続。

localeSet - ロケール固有のフォーマットルール。

stylesheet - XSLT または CSS のスタイル設定。

xfdf - XFDF フォームデータオーバーレイ。

xmpmeta - XMP メタデータ。

signature - 署名関連の XFA データ。

sourceSet - ソース側のデータ定義。

 

EndDoc 時に、登録された各パケットは1つの間接的な FlateDecode 圧縮ストリームオブジェクトになり、AcroForm /XFA 配列はパケット名の PDF 文字列とストリーム参照を登録順に交互に配置するため、レイアウトはバイト単位で決定論的(byte-deterministic)になります。ClearXFAPackets は、登録されているすべてのパケットを削除します(複数のドキュメントで THotPDF インスタンスを再利用する場合に役立ちます)。XFAPacketCount は現在のカウントを返します。

 

コンテナーレベルのサポートのみ

HotPDF は XFA XML を解析しません。XFA 動的レイアウトエンジンを実装しません。XFA テンプレート内で FormCalc または JavaScript を実行しません。テンプレート構造を検証しません。呼び出し元が(通常は Adobe LiveCycle Designer を使用するか、XFA 3.3 仕様に対して手書きで)XFA XML を自ら作成し、HotPDF はそのバイトをそのまま出力します。

 

XFA エンジンを搭載したコンシューマーリーダー(古い Acrobat / Reader、FormsCentral、一部のキオスク製品)はフォームをレンダリングします。XFA エンジンを持たないリーダー(2017 年以降の Adobe Reader DC、ほとんどのオープンソースリーダー)は、ドキュメントがハイブリッドの AcroForm + XFA ワークフローである場合、フォールバックの AcroForm フィールドを表示します。

 

PDF/A および PDF/X 適合性ゲート

ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 はすべて、XFA フォームを明示的に許可していません(動的レイアウトエンジンは決定論的にアーカイブ可能ではありません)。ISO 15930 プリプレスワークフローは、インタラクティブフォームを完全に拒否します。AddXFAPacket は、空ではない PDFACompliance または PDFXCompliance の下では、関連する仕様への参照とともに直ちに例外を発生させます。重複するパケット名は例外を発生させます。空の Packet名前 または空の XMLBytes は例外を発生させます。RequirePDFVersion(pdf15) はドキュメントバージョンを自動的に繰り上げます。

 

AcroForm ディクショナリの出力

AcroForm ディクショナリは、/Fields に少なくとも 1 つのエントリがあるか、または 少なくとも 1 つの XFA パケットが登録されている場合に出力されます。パケットを登録しない v2.119.51 より前の呼び出し元は、バイト単位で同一の /AcroForm 出力を維持します。

 

典型的なワークフロー(純粋な XFA 動的フォーム)

 

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 ラッパー、単一ストリーム、動的、および署名付き XFA

例が示すように、配列 /XFA フォームは xdp:xdp ラッパーパケットで開閉する必要があります(ISO 32000-1 §12.7.8)。関連する XFA API: SetXFADocument は、XFA/XDP ドキュメント全体を単一の /XFA ストリームとして書き込みます。これは AddXFAPacket とは相互排他的です。XFANeedsRendering はカタログの /NeedsRendering フラグ(ISO 32000-1 §7.7.2)を設定するため、ビューアーは最初の起動時に動的 XFA フォームを再生成します。AddXFASignaturePacket は、呼び出し元が生成した XAdES / XML-DSig 署名を signature パケットとして埋め込みます。HotPDF は署名の生成や解析を行うことはありません。呼び出し元が XFA データセットに対して XML 暗号化ライブラリを使用して生成します。

 

XFA から AcroForm へのフラット化

ApplyXFAAsAcroForm は、呼び出し元が指定した XDP/XFA バイトを、ネイティブの AcroForm ウィジェットおよび単純なページグラフィックとして現在のページにマッピングします。FlattenLoadedXFA は、埋め込みの /XFA パケットをすでに保持しているロードされた PDF に対して同じ変換を実行します。生成されたウィジェットを読み取り専用にするには Editable=False を渡し、マッピングできなかった要素については XFAFlattenWarnings を検査します。

 

See also: AcroForm サポート, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField