Beroendegraf för formulärberäkning

HotPDF bygger en beroendegraf över beräkningsfälten i ett inläst AcroForm så att en värdeändring bara beräknar om de beräkningar som transitivt läser det, i en ordning där varje omräknat värde redan är synligt för de beräkningar som förbrukar det

Grafkonstruktion

THotPDF.BuildLoadedFormCalculationGraph returnerar en snapshot som ägs av anroparen. Varje fält blir en nod; varje /CO-registrerat Calculate-skript analyseras statiskt med HPDFExtractSafeJavaScriptFieldReferences, som läser de fältnamn ett säkert subdomän-skript rör: de citerade argumenten till AFSimple_Calculate("OP", ["a","b"]) och de omringade namnen till getField("x")-åtkomster, med stränglitteraler som hoppas över så att textuella omnämnanden inte behandlas som referenser

THPDFFormCalcGraph.ResolveLinks löser dessa namn till source → dependent-kanter och ordnar målen med en topologisk sortering. Fält i en beroendecykel behåller istället /CO-dokumentordningen, vilket matchar engångssemantiken hos en fullständig omberäkning; ett ändrat fält beräknar aldrig om sitt eget skript, så cykler kan inte ping-ponga och ett användarskrivet värde vinner alltid. Källnamn som inte matchar något fält rapporteras genom UnresolvedFieldNameCount och producerar inga kanter, vilket speglar runtime-lösaren

Inkrementell omberäkning

RecalculateLoadedFormFieldsIncremental utvärderar bara den påverkade slutningen av de givna ändrade fälten. Skriv genom SetFormFieldValue och SetLoadedFormFieldValueByName ackumulerar en smutsig mängd; den parametlösa överlagringen beräknar om från den mängden, så en FDF- eller XFDF-import följd av en inkrementell passning uppdaterar varje beroende beräkning utan att röra orelaterade. Båda överlagringarna och hela RecalculateLoadedFormFields-passningen förbrukar den smutsiga mängden efteråt

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 exponerar beräkningstillstånd per fält (GetNode), den fullständiga utvärderingssekvensen (AllTargets), den påverkade slutningen (AffectedTargets), antalet mål i cykler (CyclicTargetCount) och olösta källnamn, så att verktyg kan förhandsgranska exakt vilka beräkningar en redigering utlöser