フォーム計算依存グラフ
HotPDF は、ロードされた AcroForm の計算フィールド上に依存グラフを構築するため、値の変更は、それを推移的に読む計算のみを、再計算された各値がそれを消費する計算にすでに可視である順序で再計算します
グラフ構築
THotPDF.BuildLoadedFormCalculationGraph は、呼び出し側が所有するスナップショットを返します。各フィールドはノードになります。各 /CO 登録済み Calculate スクリプトは HPDFExtractSafeJavaScriptFieldReferences で静的に解析されます。これは安全サブセットのスクリプトが触れるフィールド名を読み取ります。すなわち AFSimple_Calculate("OP", ["a","b"]) の引用符付き引数と getField("x") アクセスの引用符付き名前です。文字列リテラルはスキップされるため、テキスト上の言及は参照として扱われません
THPDFFormCalcGraph.ResolveLinks は、それらの名前を source → dependent エッジに解決し、トポロジカルソートでターゲットを順序付けします。依存サイクル上のフィールドは、代わりに /CO ドキュメント順を保持し、完全な再計算のワンパス意味論に一致します。変更されたフィールドは自身のスクリプトを再計算しないため、サイクルがピンポンすることはなく、ユーザーが書いた値が常に優先されます。どのフィールドにも一致しないソース名は、UnresolvedFieldNameCount を通じて報告され、エッジを生成しません。これはランタイムリゾルバーを反映します
増分再計算
RecalculateLoadedFormFieldsIncremental は、指定された変更フィールドの影響を受けるクロージャのみを評価します。SetFormFieldValue と SetLoadedFormFieldValueByName を通じた書き込みはダーティセットを蓄積します。パラメータなしのオーバーロードはそのセットから再計算します。したがって、FDF または XFDF インポートの後に 1 回の増分パスを行うと、関連のないものを触らずにすべての依存計算が更新されます。両方のオーバーロードと完全な RecalculateLoadedFormFields パスは、その後にダーティセットを消費します
PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Recomputes subtotal and total only, chained in one pass
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);
グラフ検査
グラフは、フィールドごとの計算状態(GetNode)、完全な評価シーケンス(AllTargets)、影響を受けるクロージャ(AffectedTargets)、サイクル上のターゲット数(CyclicTargetCount)、解決されていないソース名を公開するため、ツールは編集がトリガーする計算を正確にプレビューできます