Graf odvisnosti izračunov obrazca

HotPDF zgradi graf odvisnosti nad polji izračuna naloženega AcroForm, tako da sprememba vrednosti ponovno izračuna le tiste izračune, ki jo transitivno berejo, v vrstnem redu, kjer je vsaka ponovno izračunana vrednost že vidna izračunom, ki jo porabijo

Izgradnja grafa

THotPDF.BuildLoadedFormCalculationGraph vrne posnetek v lasti klicatelja. Vsako polje postane vozlišče; vsak skript Calculate, registriran z /CO, se statično analizira z HPDFExtractSafeJavaScriptFieldReferences, ki prebere imena polj, ki jih skript varno podmnožico dotakne: navedene argumente AFSimple_Calculate("OP", ["a","b"]) in navedena imena dostopov getField("x"), pri čemer se nizovni literali preskočijo, tako da besedilne omenitve niso obravnavane kot sklice

THPDFFormCalcGraph.ResolveLinks razreši ta imena v povezave izvor → odvisen in uredi cilje s topološkim razvrščanjem. Polja na ciklu odvisnosti ohranjajo vrstni red /CO dokumenta namesto tega, kar ustreza semantikam enopasovnega izračuna; sprememba polja nikoli ne ponovno izračuna lastne skripte, zato se cikli ne morejo ping-pongati in vrednost, napisana uporabnikom, vedno zmaga. Imena virov, ki ne ujemajo z nobenim poljem, se poročajo prek UnresolvedFieldNameCount in ne ustvarijo povezav, kar odražava izvajalni razreševalnik

Inkrementalno ponovno izračunavanje

RecalculateLoadedFormFieldsIncremental ocenjuje le vplivno zaprtje danih spremenjenih polj. Zapisovanja prek SetFormFieldValue in SetLoadedFormFieldValueByName zbirajo nečisto množico; preobtežena različica brez parametrov ponovno izračuna iz te množice, tako da uvoz FDF ali XFDF, sleden eno inkrementalno potjo, osveži vsak odvisen izračun brez dotikanja nepovezanih. Tako preobtežene različice kot polna pot RecalculateLoadedFormFields nato porabijo nečisto množico

PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Ponovno izračuna samo podskupino in skupno vsoto, zvezano v eni poti
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);

Pregled grafa

Graf izpostavlja stanje izračuna po polju (GetNode), celotno zaporedje ocenjevanja (AllTargets), vplivno zaprtje (AffectedTargets), število ciljev na ciklih (CyclicTargetCount) in nerazrešena imena virov, tako da orodja lahko predogledajo točno, katere izračune bo sprememba sprožila