FormCalc e JavaScript XFA con limiti
HotPDF valuta gli script calculate XFA durante il flattening di un form, con un percorso FormCalc con limiti sempre disponibile e un percorso QuickJS più ampio che resta disabilitato finché l'applicazione non lo abilita esplicitamente
FormCalc esteso
Le espressioni FormCalc supportano aritmetica, stringhe, booleani, operatori di confronto, And, Or e Not short-circuit, più il branch lazy If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max e Count accettano argomenti misti scalari e node-set SOM usando path rooted, diretti, indicizzati, wildcard o discendenti come $record.rows[*].amount; viene valutato solo il branch selezionato di If, così un branch non usato e non valido non rifiuta il calcolo
Le chiamate annidate possono combinare risultati numerici, di stringa e node-set, con supporto deterministico per At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within e Oneof
Funzioni definite dall'utente, loop, assegnamento, picture clause di locale e funzioni di rete restano fuori dal sottoinsieme nativo e falliscono in modo sicuro
InstanceAdd(name, count) e InstanceRemove(name, index) dispatchano attraverso OnXFAInstanceAction solo dopo la validazione di argomenti e budget di operazioni
JavaScript opzionale
Imposta THotPDF.XFAJavaScriptEnabled a True prima di ApplyXFAAsAcroForm o FlattenLoadedXFA per eseguire gli script il cui contentType seleziona JavaScript
Il runtime supporta il normale flusso di controllo JavaScript e gli array tipizzati nativi come Float64Array, ma non riceve alcun oggetto file, process, network, browser o applicazione; fetch, XMLHttpRequest, WebSocket, require, process e Deno non sono disponibili
var
Budgets: THPDFXFAFormScriptBudgets;
begin
Budgets := THPDFXFAFormScriptBudgets.Default;
Budgets.MaxElapsedMilliseconds := 100;
Budgets.JavaScriptMemoryBytes := 8 * 1024 * 1024;
PDF.XFAFormScriptBudgets := Budgets;
PDF.XFAJavaScriptEnabled := True;
PDF.OnXFAInstanceAction := HandleXFAInstanceAction;
PDF.ApplyXFAAsAcroForm(XDPBytes, False);
end;
Contesto degli script
JavaScript riceve un this.rawValue mutabile, un event.value e una facade xfa frozen
xfa.get(name, index)legge un valore di dati raccoltoxfa.values(name)restituisce una copia frozen di ogni valore ripetutoxfa.resolveNode(name)exfa.resolveNodes(name)espongono viste read-only dei raw valuexfa.addInstance(name, count)exfa.removeInstance(name, index)accodano callback host validati
Budget e telemetria
THPDFXFAFormScriptBudgets limita byte degli script, operazioni FormCalc, tempo trascorso, profondità delle espressioni, item degli array ripetuti, byte dei valori, operazioni su istanze, memoria JavaScript, stack JavaScript e interrupt checks
Il budget di stack fornisce il confine di ricorsione, mentre i budget di tempo e interrupt fermano i loop non terminanti; gli script che superano un qualunque confine falliscono in modo sicuro e accodano una diagnostica a XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected e XFAFlattenInstanceOperations riportano l'ultimo passaggio di flattening
Integrazione diretta del runtime
L'overload esteso di HPDFXFAFlatten accetta TXFAFormScriptOptions e TXFAFormInstanceAction direttamente; assegna TXFAFormScriptOptions.JavaScriptEvaluator per adattare il binding statico QuickJS o un altro evaluator di proprietà dell'applicazione, mantenendo lo stesso wrapper e gli stessi budget
Vedi TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets e THPDFXFAInstanceAction