動的 XFA インスタンスプレゼンテーション
ユニット:HPDFXFAPresentation
TXFAInstancePresentation は独立した TXFAWidgetRuntime を所有し、1 つの datasets レコードを持つ XDP パケットドキュメント向けの上限付きインスタンスプレゼンテーションプロファイルを追加します
SetPresence('row[1]', 'hidden') で 1 つの出現をフローから除去し、invisible でスペースを保持したままウィジェットを隠し、visible で復元します。インデックスは、隠された出現を含むデータ出現間の 0 始まり位置です
レイアウトリゾルバーは出現ごとに別々に計測し、残存する縦方向オフセットを詰め、後続コンテンツを配置する前に繰り返し全体の範囲を予約します。固定高さ、コンテンツ由来の高さ、テーブル行はリフローに参加します
安定した ID と永続化
ウィジェット ID は不透明なテンプレート / datasets ID を組み合わせたもので、先行行が隠されたり削除されたりしても、保存 / 再読み込み後も、残存フィールドがフォーカスや保留編集を保持しているあいだも安定しています
ヘルパーは名前空間修飾の ID 属性とインスタンス上書きを、フォームパケット内の外部名前空間拡張に urn:hotpdf:xfa:instance-presentation:1 として保存します。新しく追加された行は新しい ID とテンプレートデフォルトを受け取り、削除された行は保留編集を置換行へ引き継げません
SaveToBytes は更新された datasets、ID、プレゼンテーション状態を含む完全な XDP を返します。PDF に永続化するには THotPDF.SetXFADocument を使い、動的フォームを書くときは XFANeedsRendering := True を設定してください
PDF 再読み込み後は THotPDF.CreateLoadedXFAWidgetRuntime.SaveToBytes で完全な XDP を取得し、そのバイトから TXFAInstancePresentation を構築すればこのプロファイルを復元できます
この名前空間拡張を解釈するのはこのヘルパーです。ネイティブの HPDFXFAFlatten、デフォルトのロード済みランタイムファクトリー、外部 XFA ビュアーはインスタンス別の上書きを自動適用しないため、プロファイルを永続化しても他のリーダーでの同一レンダリングは主張しません
明示的なバインディングとインスタンス操作
繰り返しサブフォームは <bind match="dataRef" ref="$record.lines.entry[*]"/> で、別名の dataset グループにバインドできます。絶対の $record / $data ルートと相対パスが、インデックスなしの親グループと最後の繰り返しグループに対応します
出現内のフィールドは ref="label" のような明示的な相対フィールドバインディングを含め、ネイティブのバインド値リゾルバーを使います
AddInstance と RemoveInstance は選択されたデータグループを更新し、occur の最小 / 最大を強制し、生成上限を適用し、公開前にリフローします。新しい行は前の行から入力値をコピーするのではなく、テンプレートからフィールド値を受け取ります
セレクターは省略可能な出現インデックスつきの一意なテンプレート名(row[1] など)を使います。重複テンプレート名、欠落グループ、不正なインデックス、曖昧な繰り返し親の下での変更はトランザクションを拒否します
SetAccess は open、readOnly、protected、nonInteractive に対応します。インスタンス制限は子孫に継承され、所有ランタイム経由の編集を防ぎます
条件イベント
DispatchConditionalEvent は JavaScript コンテンツタイプの一致するフィールドイベントを探し、上限付きプロファイルを直接パースします。Execute は既存のウィジェット ID に対して明示的なスクリプトを実行します
if(this.rawValue=="hide"){
row[1].presence="hidden";
}else{
row[1].presence="visible";
}
row.instanceManager.addInstance();
row.instanceManager.removeInstance(0);
条件は this.rawValue とエスケープされていない引用符リテラルの間の等価 / 非等価を受け付けます。ネストした波括弧 if と省略可能な else ブロックは MaxDepth で制限されます
代入は presence と access に対応します。実行されない分岐を含め全分岐が構文チェックされ、未対応の操作はバッチ全体を拒否します
this.rawValue はコミット済みウィジェット値を読みます。それを観察すべきイベントをディスパッチする前に Runtime.CommitEdit で保留編集をコミットしてください
元の Runtime.DispatchEvent は制限付きリテラル操作の挙動を維持し、条件 / インデックス付きインスタンス構文を拒否します。このヘルパーは汎用の JavaScript / FormCalc インタープリター、ブラウザー API、ネットワークアクセス、自動 XFA ライフサイクルディスパッチを提供しません
トランザクションと予算
変更は TXFAWidgetRuntime.UpdateDocument を通じて、ネイティブ計算と上限付き安定リフローとともに実行されます。失敗時はシリアライズ済み XDP、フォーカス、保留編集、検証状態、計算 / リフローカウンター、警告数が復元されます
フォーカス・レイアウト・ウィジェット無効化コールバックは成功後にのみ公開されます。ロールバック解決は、復元をキャンセルが妨げないよう、ネイティブレイアウト / ウィジェット境界を保持しつつ、枯渇したヘルパー作業とキャンセルチェックを抑制します
TXFAPresentationOptions は Default で初期化します。デフォルトは操作 200,000、プレゼンテーション状態 4,096、グループあたり生成インスタンス 10,000、入力 / ドキュメントエンベロープ 32 MiB、スクリプトバイト 65,536、条件ネスト 32 レベル、5,000 ミリ秒です
MaxInputBytes は、ID 属性、名前空間宣言、テキスト、datasets 変更を含む保守的なエスケープ XML エンベロープにも、レイアウト / 公開パスごとに上限をかけます。有効な XML はシリアライズ済みバイト数が同じ値に達する前にこの保守的な上限に達しえます
Cancelled は上限付き作業中にチェックされるオプションのオブジェクトメソッドコールバックです。埋め込まれた Runtime オプションは引き続きウィジェット、値、計算、レイアウト、リフロー、ネイティブスクリプト作業を制限します
ホストペイントとアクセシビリティー
Accessibility は、安定した ID、ロール、キャプション / フィールド名、ツールチップ説明、コミット済み値、ページと境界、フォーカス、有効性、読み取り専用 / 必須状態、選択肢ラベルを持つ可視ウィジェットレコードを返します。パスワード値は省略されます
PaintPage は可視ウィジェットのスナップショットと対応するアクセシビリティーレコードを TXFAHostWidgetPainter へ渡します。カスタムホストは独自のコントロールやレンダリングサーフェスを実装できます
TXFACanvasWidgetPainter は、ウィジェットボーダー、テキスト、パスワードマスク、チェックボックス / ラジオマーク、選択インジケーター、ボタン、フォーカスに対し、正のスケールと省略可能なオフセットつきで実際の VCL / LCL キャンバスペイントを提供します。各ウィジェットをクリップし、キャンバススタイルを復元します
キャンバスアダプターはウィジェットをペイントするものであり、静的 XFA グラフィックスツリー全体はペイントしません。ページ背景、静的グラフィックス、イベントルーティング、選択プレゼンテーション、プラットフォームへのアクセシビリティーブリッジはホストが供給します
ランタイムとヘルパーはシングルスレッドオブジェクトです。コールバックはホストのスレッド所有権に従い、アクティブなトランザクション中の再帰的な変更を避けてください
C++Builder 呼び出し側は new TXFACanvasWidgetPainter(canvas, 1, 0, 0) のように、キャンバスペインターのコンストラクター引数をすべて渡す必要があります。生成ヘッダーはこれらの浮動小数点デフォルト引数を保持しません
検証
受け入れは、アーキテクチャーごとに 106 の Delphi ケースと、両 Windows アーキテクチャーでの新規 FPC コンパイル、Win32 / Win64x での C++Builder 公開ヘッダーコンパイル、実際の PDF / XDP 出力の独立検証をカバーします
Tests/Fixtures/XFAInstancePresentation/explicit-invoice.xdp は独立したデータ名、3 行の繰り返し請求行、条件イベント、アクセシビリティー用メタデータ、後続のフッターを含みます
Run-XFAInstancePresentationTests.ps1 は、ヘルパーチェックと既存の XFA イベント・ランタイム・スクリプティング・SOM・DOM・解決リグレッションフィクスチャーを、GUI も外部 PDF リーダーもなしで実行します
独立した verify_saved_invoice.py は生成 PDF を pypdf で読み、実際の XDP データ行、一意の永続 ID、隠された出現状態、初期化されたデフォルト、再読み込み ID をチェックします
powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win32 -CheckCppHeaders
powershell -File Tests/Delphi/Run-XFAInstancePresentationTests.ps1 -Platform Win64 -CheckCppHeaders
python Tests/Fixtures/XFAInstancePresentation/verify_saved_invoice.py
互換性のあるベースランタイムとネイティブ編集コントラクトは Interactive XFA Widget Runtime を参照してください