Граф залежностей обчислень форм
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');
// Рекомпонує лише subtotal і total, зв'язано за один прохід
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);
Інспекція графа
Граф надає стан обчислення на поле (GetNode), повну послідовність оцінки (AllTargets), уражений замкнутий набір (AffectedTargets), кількість цілей на циклах (CyclicTargetCount) та невизначені імена джерел, тому інструменти можуть заздалегідь переглянути, які саме обчислення запустить правка