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

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