Pro エディション
Form — 詳細リファレンス
このページは、Pro Form モジュールの詳細リファレンスです。AcroForm 値の抽出、XFDF の読み書き、データバインディング、XFA データ抽出を扱います。本モジュールは、Core フォームリーダーが生成する NextPDF\Form\FormField 値を受け取り、その上にシリアライズ、パース、バインディングを追加します。XFA のサポートはデータ指向です:パーサーは template パケットと datasets パケットを構造化します。XFA の計算スクリプトの実行や、動的な XFA レイアウトのレンダリングは行いません。
提供とライセンス
「提供とライセンス」という見出しのセクションこの機能は NextPDF Pro(nextpdf/pro)で提供され、Pro ティアのライセンスエンベロープで有効化されます。そのエンタイトルメントがないデプロイメントでは、この機能のクラスはロードされません。エディションを比較してライセンスを取得。
機能ごとのライセンスフラグはありません。これは Pro エディションの機能です。
パブリック API サーフェス
「パブリック API サーフェス」という見出しのセクション| 記号 | パラメータ | デフォルト挙動 | 戻り値 | スロー/失敗条件 | 備考 |
|---|---|---|---|---|---|
FormDataExtractor::extract | list<FormField> $fields | 各フィールドの名前と値を読み取り | XfdfData | — | 値が空のフィールドも含む。 |
FormDataExtractor::toArray | list<FormField> $fields | name → value の文字列マップを構築 | array<string, string> | — | 後方の重複した名前が前方を上書き。 |
FormDataExtractor::toXfdf | list<FormField> $fields, ?string $pdfHref = null | XfdfWriter::fromFields に委譲 | string(XFDF XML) | — | ワンコールでエクスポートする簡便パス。 |
FormDataExtractor::extractNonEmpty | list<FormField> $fields | 値が空文字列のフィールドをスキップ | XfdfData | — | — |
FormDataExtractor::getEmptyFieldNames | list<FormField> $fields | 値が設定されていないフィールドの名前を列挙 | list<string> | — | extractNonEmpty の補集合。 |
XfdfWriter::fromFields | list<FormField> $fields, ?string $pdfHref = null | name → value のペアを収集し、fromArray に委譲 | string(XFDF XML) | — | — |
XfdfWriter::fromArray | array<string, string> $data, ?string $pdfHref = null | マップを XfdfData にラップし委譲 | string(XFDF XML) | — | — |
XfdfWriter::fromXfdfData | XfdfData $data, ?string $pdfHref = null | XFDF にシリアライズ。ドット記法の名前は階層的な <field> 要素としてネスト | string(XFDF XML) | — | XML 1.0 で不正な制御文字を除去。挙動コントラクトを参照。 |
XfdfParser::parse | string $xfdfXml | XML を XXE セーフに読み込み、フィールドをドット記法へフラット化 | XfdfData | InvalidArgumentException | 入力上限は 10 MiB。名前空間付き/なしのルートを受け付け。 |
XfdfParser::parseFile | string $filePath | パスを解決し、ファイルを読み込み、parse に委譲 | XfdfData | InvalidArgumentException | 存在しない・ファイルでない・読み取れないパスは例外。 |
XfaParser::parse | string $pdfData | マーカー確認、XML 抽出、パケット解析 | XfaFormData | InvalidArgumentException, XfaParseException | /XFA マーカーがない場合はエラーではなく空の結果を返す。 |
XfaParser::hasXfa | string $pdfData | バイト列から /XFA マーカーをスキャン | bool | — | バイトマーカースキャン。トークンが出現すればマッチ。 |
XfaParser::extractXfaXml | string $pdfData | XFA マーカーをストリームスキャンし、続いて <xdp:xdp> を直接検索 | string(XFA XML または '') | RuntimeException(宣言) | 入力の先頭 50 MiB までをスキャン。 |
XfaParser::parseXml | string $xml | template パケットと datasets パケットを抽出し、<field> 要素を解析 | XfaFormData | XfaParseException | XML 上限は 10 MiB。DOM 読み込み前に強制。 |
FormDataBinder::bind | list<FormField> $fields, XfdfData $data | バインドされた値を持つ新しい FormField インスタンスを生成 | FormDataBindResult | — | 元のオブジェクトは変更されない。チェックボックスは Yes/Off に正規化。 |
FormDataBinder::fromXfdf | list<FormField> $fields, string $xfdfXml | XFDF を解析してからバインド | FormDataBindResult | InvalidArgumentException | 失敗モードは XfdfParser::parse と同じ。 |
FormDataBinder::fromArray | list<FormField> $fields, array<string, string> $data | マップを XfdfData にラップしてからバインド | FormDataBindResult | — | — |
FormDataBindResult | isFullyBound, hasNoUnmatchedKeys, boundCount, fieldCount; readonly fields, boundFieldNames, unmatchedDataKeys, unboundFieldNames | イミュータブルなバインド診断 | メソッドごと | — | isFullyBound は未マッチキー 0 かつ未バインドフィールド 0 を要求。 |
XfdfData | hasField, getValue, count, isEmpty, getFieldNames, withField, withoutField, merge; readonly fields | イミュータブルな name → value コンテナ | メソッドごと | — | with* と merge は新しいインスタンスを返す。merge は引数側の値を優先。 |
XfaFormData | getField, hasField, count, fieldNames; readonly fields, templateXml, datasetsXml | イミュータブルな XFA 解析結果 | メソッドごと | — | ラウンドトリップ用に生の template パケットと datasets パケットの XML を保持。 |
XfaFormField | readonly name, type, value, required, caption, options | イミュータブルな単一フィールドレコード | — | — | type は text, numeric, date, choice, button, signature のいずれか。 |
XfaPacket | enum ケース Template, Datasets, Config, LocaleSet, ConnectionSet, Form; xmlNamespace() | 文字列バック型のパケット列挙 | xmlNamespace() からの string | — | 名前空間 URI は XFA Specification 3.3 に従う。 |
public static function extract(array $fields): XfdfDatapublic static function toArray(array $fields): arraypublic static function toXfdf(array $fields, ?string $pdfHref = null): stringpublic static function extractNonEmpty(array $fields): XfdfDatapublic static function getEmptyFieldNames(array $fields): arraypublic static function fromFields(array $fields, ?string $pdfHref = null): stringpublic static function fromArray(array $data, ?string $pdfHref = null): stringpublic static function fromXfdfData(XfdfData $data, ?string $pdfHref = null): stringpublic static function parse(string $xfdfXml): XfdfDatapublic static function parseFile(string $filePath): XfdfDatapublic function parse(string $pdfData): XfaFormDatapublic function hasXfa(string $pdfData): boolpublic function extractXfaXml(string $pdfData): stringpublic function parseXml(string $xml): XfaFormDatapublic static function bind(array $fields, XfdfData $data): FormDataBindResultpublic static function fromXfdf(array $fields, string $xfdfXml): FormDataBindResultpublic static function fromArray(array $fields, array $data): FormDataBindResultNextPDF\Pro\Form\Exception\XfaParseExceptionはRuntimeExceptionを継承 — XFA ペイロードをXfaFormDataに解析できない場合。このサブクラス化は意図的です:既存のcatch (RuntimeException $e)を使う呼び出し箇所がそのまま動作し続けます。- SPL
InvalidArgumentException—XfdfParserへの空・過大・不正・非 XFDF の入力、XfaParser::parseへの空の PDF 入力、XfdfParser::parseFileでの読み取り不可なパス。
挙動コントラクト
「挙動コントラクト」という見出しのセクションAcroForm 抽出。 FormDataExtractor は、渡されたフィールドリストを走査し、各フィールドの名前と値を読み取ります。extract は XfdfData を返し、toArray はプレーンな name → value の文字列マップを返します。extractNonEmpty は値が空文字列のフィールドを除外し、getEmptyFieldNames はその補集合の名前リストを返します。抽出が入力フィールドを変更することはありません。
XFDF 書き込み。 XfdfWriter は、ISO 19444-1:2019 の構造に準拠するドキュメントを生成します。出力は XFDF XML 宣言と、Adobe の XFDF 名前空間(http://ns.adobe.com/xfdf/)にある xfdf ルート(xml:space="preserve" 付き)で始まります。pdfHref が非 null の場合、ソース PDF を指す <f href="..."/> 参照を出力します。ドット記法のフィールド名(例:address.city)は、階層的な <field> 要素ツリーへネストします。値と属性は、5 つの XML メタ文字をエスケープします。フィールド名、値、pdfHref は、整形式性のためにさらに正規化されます:XML 1.0 が禁止する C0 制御文字は除去され、TAB、LF、CR は保持されます。この正規化は設計上ロッシーであり、呼び出し側が渡したバイトに関わらず、ライターは常に整形式で再パース可能な XFDF を出力します。
XFDF 読み込み。 XfdfParser は、名前空間付き・なしの両方の xfdf ルートを受け付け、ルート名を大文字小文字を区別せずにマッチします。一部のプロデューサーが大文字のルート要素を出力するためです。階層的な <field> ツリーはドット記法の名前へ戻され、書き込みと読み込みがラウンドトリップします。すべての XML 読み込みは、ネットワークアクセスと外部エンティティ解決を無効化します。parseFile は、同じパースの前にパス解決と読み取り可能性チェックを追加します。
データバインディング。 FormDataBinder::bind は、データキーをフィールド名に対してマッチします。FormField はイミュータブルなため、バインディングは更新された値を持つ新しいインスタンスを生成し、元のオブジェクトは変更されません。結果は 3 つの診断セットを報告します:バインドされたフィールド名、マッチするフィールドがないデータキー、データを受け取らなかったフィールド。チェックボックスの値は、ISO 32000-2:2020, 12.7.5.2.3 のオン/オフ状態モデルに正規化されます:大文字小文字を区別しない yes、true、1、on は Yes にマッピングされ、その他のすべての値は Off にマッピングされます。
XFA データ抽出。 XfaParser::parse は生の PDF バイト列を受け取ります。まず /XFA マーカーをスキャンし、マーカーがなければ空の XfaFormData を返します。続いて抽出は 2 つの戦略を試みます:XFA XML インジケーターを求めて stream…endstream ブロックをスキャンし、次に <xdp:xdp> ドキュメントを直接検索します。単一の xdp:xdp フラグメントはそのまま返され、複数のフラグメントは合成された xdp:xdp エンベロープに連結されます。parseXml は template パケットと datasets パケットを抽出し、各 template の <field> 要素を XfaFormField へ解析します:name 属性は必須、type はフィールドの UI 子要素から導出、required フラグは nullTest が error に設定された validate 要素から導出、choice の選択肢は items 子要素から取得されます。
XFA のサポートはデータ指向です。パーサーは template パケットと datasets パケットを構造化します。XFA の計算スクリプトの実行、動的な XFA レイアウトのレンダリング、すべてのパケットタイプのラウンドトリップは行いません。これに依存する前に、対象とする特定のドキュメントセットに対してパーサーを検証してください。
エッジケースと失敗モード
「エッジケースと失敗モード」という見出しのセクションXfdfParser::parse('')はInvalidArgumentExceptionをスローします。10 MiB を超える入力は、上限を明示するInvalidArgumentExceptionをスローします。- 不正な XML は、収集された libxml メッセージを含む
InvalidArgumentExceptionをスローします。ルートがxfdfでない整形式ドキュメントは、実際のルート要素を明示してスローします。 <fields>要素を持たない XFDF ドキュメントは、空のXfdfDataに解析されます。これはエラーではありません。name属性を持たないフィールド要素は、XFDF と XFA の両方の解析でスキップされます。<value>子要素を持たない XFDF フィールドは、エントリを生成しません。XfaParser::parse('')はInvalidArgumentExceptionをスローします。/XFAマーカーを持たない PDF、または XFA XML を特定できない PDF は、スローするのではなく空のXfaFormDataを返します。hasXfaはバイトマーカースキャンです:未使用オブジェクト内のものも含め、ファイル内の任意の/XFAトークンがマッチします。使用可能な XML が存在するかどうかは、後続の抽出ステップが判断します。- XFA 抽出は、PDF バイト列の先頭 50 MiB までを検査します。その境界を超えるコンテンツはスキャンされません。
- 10 MiB を超える XFA XML は、DOM ツリーが具現化される前に
XfaParseExceptionをスローします。不正な XFA XML は、libxml メッセージを含むXfaParseExceptionをスローします。 - チェックボックスの正規化は、認識されない値をそのまま通すことはありません。受け付けられるオン形式以外はすべて
Offにマッピングされます。 - ライターの制御文字除去はロッシーです:名前、値、または
pdfHref内の XML 1.0 で不正な C0 バイトは、出力が整形式のままとなるよう除去されます。TAB、LF、CR は残ります。 - すべての XML 解析は、外部エンティティ解決とネットワークアクセスを無効化します(XXE セーフ)。
- 本モジュールは暗号操作を一切実行しません。FIPS モードでも挙動は変わりません。
| 挙動 | 参照 | ステータス |
|---|---|---|
| インタラクティブフォーム/フィールドディクショナリモデル | ISO 32000-2:2020, 12.7 | 準拠(製品ベース) |
チェックボックスのオン/オフ状態正規化(Yes/Off) | ISO 32000-2:2020, 12.7.5.2.3 | 準拠。本ページの引用記録で条項を引用 |
| XFDF データ交換構造 | ISO 19444-1:2019 | 準拠(製品ベース) |
| XFA パケット名と名前空間 URI | XFA Specification 3.3 | 準拠(製品ベース) |
オーサリング時点で利用可能な RAG コーパスには、ISO 19444-1:2019、XFA Specification、W3C XML 1.0 が含まれていないため、これらの整合性の記述は、条項引用ではなく、ソース注釈とテストに基づく製品ベースのものです。これらの記述は、参照ドキュメントに対する能力を説明するものです。NextPDF は適合性認証を保有しておらず、ある条項へのサポートは認証の表明ではありません。
開発上の注意
「開発上の注意」という見出しのセクションXfaParserを除くすべてのエントリポイントは静的です。XfaParserはインスタンス化可能でステートレスであり、1 つのインスタンスを複数のドキュメントで再利用しても安全です。- 意図されたラウンドトリップは次のとおりです:Core フォームリーダーが
FormField値を生成し、FormDataExtractorまたはXfdfWriterがそれをシリアライズし、XfdfParserがデータを読み戻し、FormDataBinderがそれをフィールドリストに適用します。階層的な名前は、ドット記法を通じてラウンドトリップを生き延びます。 FormDataBindResultの診断(isFullyBound、unmatchedDataKeys、unboundFieldNames)を使って、フィルを受け入れる前に、XFDF データファイルと改訂された PDF テンプレートの間のドリフトを検出してください。XfdfDataは値オブジェクトです:withField、withoutField、mergeは新しいインスタンスを返します。キーの衝突時には、mergeは引数側の値を優先します。XfaFormDataは、生の template パケットと datasets パケットの XML(templateXml、datasetsXml)を保持するため、フィールドモデルがカバーしないパケットを後処理できます。- 本モジュールは、PDF バイト列から AcroForm ディクショナリを自ら解析することはありません。Core フォームリーダーが生成するフィールドを受け取ります。生の PDF コンテンツを操作するのは
XfaParserのみです。
このページは、外部から観測可能な挙動と、サポートされるパブリック API サーフェスのみを文書化します。内部の名前空間パス、ヘルパークラス、メカニズムテーブル、ランブックのファイル名、チケットプレフィックスは対象外です。