バウンド付き 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 ファサードを受け取ります
xfa.get(name, index)は収集された 1 つのデータ値を読み取りますxfa.values(name)は繰り返されるすべての値のフリーズコピーを返しますxfa.resolveNode(name)とxfa.resolveNodes(name)は読み取り専用の生の値ビューを公開しますxfa.addInstance(name, count)とxfa.removeInstance(name, index)は検証済みのホストコールバックをキューに入れます
予算とテレメトリ
THPDFXFAFormScriptBudgets はスクリプトバイト数、FormCalc 操作数、経過時間、式の深さ、繰り返し配列項目数、値バイト数、インスタンス操作数、JavaScript メモリ、JavaScript スタック使用量、および割り込みチェックを制限します
スタック予算は再帰境界を提供し、時間と割り込みの予算は非終了ループを停止します。いずれかの境界を超えたスクリプトはフェイルクローズし、XFAFlattenWarnings に診断を追加します
XFAFlattenScriptsEvaluated、XFAFlattenScriptsRejected、XFAFlattenInstanceOperations は最新のフラットニングパスを報告します
直接ランタイム統合
拡張 HPDFXFAFlatten オーバーロードは TXFAFormScriptOptions と TXFAFormInstanceAction を直接受け入れます。TXFAFormScriptOptions.JavaScriptEvaluator を割り当てて、同じラッパーと予算を保持しつつ、静的 QuickJS バインディングまたは別のアプリケーション所有の評価器を適応させます
TXFAFormScriptOptions、TXFAFormScriptLimits、THPDFXFAFormScriptBudgets、THPDFXFAInstanceAction を参照してください