バウンド付き XFA FormCalc と JavaScript

HotPDF はフォームをフラット化するときに XFA 計算スクリプトを評価します。常に利用可能なバウンド付き FormCalc パスと、アプリケーションが明示的に有効にするまで無効のままのより広範な QuickJS パスを備えています

拡張 FormCalc

FormCalc 式は算術・文字列・ブール値・比較演算子・短絡評価の And・Or・Not に対応し、遅延評価の If(condition, whenTrue, whenFalse) 分岐もサポートします

Sum・Avg・Min・Max・Count は、$record.rows[*].amount のようなルート付き・直接・インデックス付き・ワイルドカード・子孫の各パスを使って、スカラーと SOM ノードセットを混在させた引数を受け入れます。If の選択された枝だけが評価されるため、未使用の無効な枝が計算を拒否することはありません

ネストした呼び出しでは、数値・文字列・ノードセットの結果を組み合わせられます。At、Choose、Concat、LTrim、RTrim、Str、Stuff、Null、Sign、Exp、Log、Sin、Cos、Tan、Deg2Rad、Rad2Deg、Within、Oneof を決定論的にサポートします

ユーザー定義関数・ループ・代入・ロケールの picture 句・ネットワーク関数は、ネイティブサブセットの対象外で、fail closed します

InstanceAdd(name, count) と InstanceRemove(name, index) は、引数と操作予算の検証を通過した後でのみ、OnXFAInstanceAction を通じてディスパッチされます

オプションの JavaScript

ApplyXFAAsAcroForm または FlattenLoadedXFA の前に THotPDF.XFAJavaScriptEnabled を True に設定すると、contentType が JavaScript を選択するスクリプトを実行できます

ランタイムは通常の JavaScript 制御フローと Float64Array などのネイティブ型付き配列をサポートしますが、ファイル、プロセス、ネットワーク、ブラウザ、アプリケーションオブジェクトは受け取りません。fetch、XMLHttpRequest、WebSocket、require、process、Deno は利用できません

var
  Budgets: THPDFXFAFormScriptBudgets;
begin
  Budgets := THPDFXFAFormScriptBudgets.Default;
  Budgets.MaxElapsedMilliseconds := 100;
  Budgets.JavaScriptMemoryBytes := 8 * 1024 * 1024;
  PDF.XFAFormScriptBudgets := Budgets;
  PDF.XFAJavaScriptEnabled := True;
  PDF.OnXFAInstanceAction := HandleXFAInstanceAction;
  PDF.ApplyXFAAsAcroForm(XDPBytes, False);
end;

スクリプトコンテキスト

JavaScript は可変の this.rawValue、event.value、およびフリーズされた xfa ファサードを受け取ります

予算とテレメトリ

THPDFXFAFormScriptBudgets はスクリプトバイト数、FormCalc 操作数、経過時間、式の深さ、繰り返し配列項目数、値バイト数、インスタンス操作数、JavaScript メモリ、JavaScript スタック使用量、および割り込みチェックを制限します

スタック予算は再帰境界を提供し、時間と割り込みの予算は非終了ループを停止します。いずれかの境界を超えたスクリプトはフェイルクローズし、XFAFlattenWarnings に診断を追加します

XFAFlattenScriptsEvaluated、XFAFlattenScriptsRejected、XFAFlattenInstanceOperations は最新のフラットニングパスを報告します

直接ランタイム統合

拡張 HPDFXFAFlatten オーバーロードは TXFAFormScriptOptions と TXFAFormInstanceAction を直接受け入れます。TXFAFormScriptOptions.JavaScriptEvaluator を割り当てて、同じラッパーと予算を保持しつつ、静的 QuickJS バインディングまたは別のアプリケーション所有の評価器を適応させます

TXFAFormScriptOptions、TXFAFormScriptLimits、THPDFXFAFormScriptBudgets、THPDFXFAInstanceAction を参照してください