Form Hesaplama Bağımlılık Grafiği

HotPDF, yüklü bir AcroForm'un hesaplama alanları üzerinde bir bağımlılık grafiği kurar; böylece bir değer değişikliği yalnızca onu geçişli olarak okuyan hesaplamaları, her yeniden hesaplanan değerin onu tüketen hesaplamalara çoktan görünür olduğu bir sırayla yeniden hesaplar

Grafik kurulumu

THotPDF.BuildLoadedFormCalculationGraph, çağıranın sahipliğinde bir anlık görüntü döndürür. Her alan bir düğüm olur; /CO ile kaydedilmiş her Calculate script'i HPDFExtractSafeJavaScriptFieldReferences ile statik analiz edilir, bu fonksiyon safe-subset bir script'in dokunduğu alan adlarını okur: AFSimple_Calculate("OP", ["a","b"]) çağrısının tırnaklı argümanları ve getField("x") erişimlerinin tırnaklı adları; string literal'ler atlanır, böylece metinsel geçmeler referans sayılmaz

THPDFFormCalcGraph.ResolveLinks, bu adları source → dependent kenarlarına çözer ve hedefleri topolojik sıralamayla dizer. Bir bağımlılık döngüsündeki alanlar bunun yerine /CO belge sırasını korur; bu, tam yeniden hesaplamanın tek geçişli semantiğiyle örtüşür. Değişen bir alan kendi script'ini asla yeniden hesaplamaz, böylece döngüler ping-pong yapamaz ve kullanıcı yazımı bir değer her zaman kazanır. Hiçbir alanla eşleşmeyen kaynak adları UnresolvedFieldNameCount üzerinden bildirilir ve kenar üretmez; bu da runtime çözücüyü yansıtır

Artımlı yeniden hesaplama

RecalculateLoadedFormFieldsIncremental, verilen değişen alanların yalnızca etkilenen kapanışını değerlendirir. SetFormFieldValue ve SetLoadedFormFieldValueByName üzerinden yapılan yazmalar kirli bir küme biriktirir; parametresiz overload bu kümeden yeniden hesaplar, böylece bir FDF veya XFDF içe aktarmasını tek bir artımlı geçiş izlediğinde her bağımlı hesaplama, ilgisizlere dokunmadan tazelenir. Her iki overload ve tam RecalculateLoadedFormFields geçişi de ardından kirli kümeyi tüketir

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']);

Grafik incelemesi

Grafik; alan başına hesaplama durumunu (GetNode), eksiksiz değerlendirme sırasını (AllTargets), etkilenen kapanışı (AffectedTargets), döngüdeki hedef sayısını (CyclicTargetCount) ve çözülemeyen kaynak adlarını açığa çıkarır; böylece araçlar bir düzenlemenin tam olarak hangi hesaplamaları tetikleyeceğini önizleyebilir