Grafo delle Dipendenze del Calcolo dei Moduli

HotPDF costruisce un grafo delle dipendenze sui campi di calcolo di un AcroForm caricato così che una modifica del valore ricalcoli solo i calcoli che la leggono transitivamente, in un ordine in cui ogni valore ricalcolato è già visibile ai calcoli che lo consumano

Costruzione del grafo

THotPDF.BuildLoadedFormCalculationGraph restituisce uno snapshot di proprietà del chiamante. Ogni campo diventa un nodo; ogni script Calculate registrato in /CO viene analizzato staticamente con HPDFExtractSafeJavaScriptFieldReferences, che legge i nomi dei campi toccati da uno script del sottoinsieme sicuro: gli argomenti tra virgolette di AFSimple_Calculate("OP", ["a","b"]) e i nomi tra virgolette degli accessi getField("x"), con i valori letterali di stringa ignorati così che le menzioni testuali non siano trattate come riferimenti

THPDFFormCalcGraph.ResolveLinks risolve quei nomi in archi source → dependent e ordina le destinazioni con un ordinamento topologico. I campi su un ciclo di dipendenze mantengono invece l'ordine documentale /CO, in linea con la semantica a passaggio singolo di un ricalcolo completo; un campo modificato non ricalcola mai il proprio script, quindi i cicli non possono rimbalzare e un valore scritto dall'utente ha sempre la precedenza. I nomi sorgente che non corrispondono a nessun campo vengono riportati tramite UnresolvedFieldNameCount e non producono archi, rispecchiando il resolver di runtime

Ricalcolo incrementale

RecalculateLoadedFormFieldsIncremental valuta solo la chiudenza affetta dei campi modificati dati. Le scritture tramite SetFormFieldValue e SetLoadedFormFieldValueByName accumulano un set sporco; l'overload senza parametri ricalcola da quel set, così un'importazione FDF o XFDF seguita da un passaggio incrementale aggiorna ogni calcolo dipendente senza toccare quelli non correlati. Entrambi gli overload e il RecalculateLoadedFormFields completo consumano poi il set sporco

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

Ispezione del grafo

Il grafo espone lo stato di calcolo per campo (GetNode), la sequenza completa di valutazione (AllTargets), la chiudenza affetta (AffectedTargets), il numero di destinazioni sui cicli (CyclicTargetCount) e i nomi sorgente non risolti, così il tooling può anteporre esattamente quali calcoli un'editazione attiverà