Afhængighedsgraf for formularberegning

HotPDF opbygger en afhængighedsgraf over beregningsfelterne i en indlæst AcroForm, så en værdiændring kun genberegner de beregninger, der transitivt læser den, i en rækkefølge hvor hver genberegnet værdi allerede er synlig for de beregninger, der bruger den

Grafkonstruktion

THotPDF.BuildLoadedFormCalculationGraph returnerer et snapshot ejet af kalderen. Hvert felt bliver en node; hvert /CO-registreret Calculate-script analyseres statisk med HPDFExtractSafeJavaScriptFieldReferences, som læser de feltnavne et safe-subset-script berører: de citerede argumenter i AFSimple_Calculate("OP", ["a","b"]) og de citerede navne i getField("x")-adgange, med overspring af strengliteraler, så tekstlige omtaler ikke behandles som referencer

THPDFFormCalcGraph.ResolveLinks opløser disse navne til kanter fra source → dependent og sorterer målene topologisk. Felter i en afhængighedscyklus beholder i stedet /CO-dokumentrækkefølgen, som svarer til én-passagesemantikken i en fuld genberegning; et ændret felt genberegner aldrig sit eget script, så cyklusser ikke kan ping-ponge, og en brugerskrevet værdi vinder altid. Kildenavne uden matchende felt rapporteres via UnresolvedFieldNameCount og giver ingen kanter, svarende til runtime-resolveren

Inkrementel genberegning

RecalculateLoadedFormFieldsIncremental evaluerer kun den berørte lukning af de angivne ændrede felter. Skrivninger gennem SetFormFieldValue og SetLoadedFormFieldValueByName akkumulerer et dirty-sæt; overloaden uden parametre genberegner fra dette sæt, så en FDF- eller XFDF-import efterfulgt af én inkrementel passage opdaterer hver afhængig beregning uden at berøre urelaterede. Begge overloads og den fulde RecalculateLoadedFormFields-passage forbruger bagefter dirty-sættet

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

Grafinspektion

Grafen eksponerer beregningstilstand pr. felt (GetNode), den fulde evalueringssekvens (AllTargets), den berørte lukning (AffectedTargets), antallet af mål i cyklusser (CyclicTargetCount) og uopløste kildenavne, så værktøjer kan forhåndsvise præcis hvilke beregninger en redigering udløser