|
ドキュメントの 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
|