表單計算相依圖
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 匯入會在不必觸及無關計算的情況下重新整理每個相依計算。兩個多載與完整的 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)與未解析的來源名稱,讓工具可以預覽編輯確切會觸發哪些計算