Graf Ketergantungan Perhitungan Formulir
HotPDF membangun graf ketergantungan di atas field perhitungan AcroForm yang dimuat sehingga perubahan nilai hanya menghitung ulang perhitungan yang membacanya secara transitif, dalam urutan di mana setiap nilai yang dihitung ulang sudah terlihat oleh perhitungan yang mengonsumsinya
Pembangunan graf
THotPDF.BuildLoadedFormCalculationGraph mengembalikan snapshot yang dimiliki pemanggil. Setiap field menjadi simpul; setiap skrip Calculate yang terdaftar /CO dianalisis secara statis dengan HPDFExtractSafeJavaScriptFieldReferences, yang membaca nama field yang disentuh skrip subset-aman: argumen yang dikutip dari AFSimple_Calculate("OP", ["a","b"]) dan nama yang dikutip dari akses getField("x"), dengan literal string dilewati sehingga penyebutan tekstual tidak diperlakukan sebagai referensi
THPDFFormCalcGraph.ResolveLinks menyelesaikan nama-nama itu menjadi tepi sumber → dependen dan mengurutkan target dengan pengurutan topologis. Field pada siklus ketergantungan tetap mempertahankan urutan dokumen /CO, mencocokkan semantik satu-lintasan dari penghitungan ulang penuh; field yang berubah tidak pernah menghitung ulang skripnya sendiri, sehingga siklus tidak dapat memantul dan nilai yang ditulis pengguna selalu menang. Nama sumber yang tidak cocok dengan field apa pun dilaporkan melalui UnresolvedFieldNameCount dan tidak menghasilkan tepi, mencerminkan resolver runtime
Penghitungan ulang inkremental
RecalculateLoadedFormFieldsIncremental hanya mengevaluasi penutupan yang terpengaruh dari field berubah yang diberikan. Penulisan melalui SetFormFieldValue dan SetLoadedFormFieldValueByName mengakumulasi kumpulan kotor; kelebihan muatan tanpa parameter menghitung ulang dari kumpulan itu, sehingga impor FDF atau XFDF yang diikuti satu lintasan inkremental menyegarkan setiap perhitungan dependen tanpa menyentuh yang tidak terkait. Kedua kelebihan muatan dan lintasan RecalculateLoadedFormFields penuh mengonsumsi kumpulan kotor setelahnya
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']);
Pemeriksaan graf
Graf mengekspos status perhitungan per field (GetNode), urutan evaluasi penuh (AllTargets), penutupan yang terpengaruh (AffectedTargets), jumlah target pada siklus (CyclicTargetCount), dan nama sumber yang tidak terselesaikan, sehingga perkakas dapat melihat pratinjau persis perhitungan mana yang akan dipicu oleh sebuah penyuntingan