FormCalc et JavaScript XFA bornés
HotPDF évalue les scripts calculate XFA pendant l’aplanissement d’un formulaire, avec une voie FormCalc bornée toujours disponible et une voie QuickJS plus large qui reste désactivée tant que l’application ne l’active pas explicitement
FormCalc étendu
Les expressions FormCalc prennent en charge l’arithmétique, les chaînes, les booléens, les opérateurs de comparaison, les And, Or et Not à court-circuit, plus la branche paresseuse If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max et Count acceptent des arguments mixtes scalaires et ensembles de nœuds SOM avec des chemins enracinés, directs, indexés, à jokers ou descendants tels que $record.rows[*].amount ; seule la branche sélectionnée de If est évaluée, donc une branche invalide non utilisée ne rejette pas le calcul
Les appels imbriqués peuvent combiner des résultats numériques, chaînes et ensembles de nœuds, avec une prise en charge déterministe de At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within et Oneof
Les fonctions définies par l’utilisateur, les boucles, l’affectation, les clauses picture de locale et les fonctions réseau restent en dehors du sous-ensemble natif et déclenchent un échec sûr
InstanceAdd(name, count) et InstanceRemove(name, index) sont dispatchés via OnXFAInstanceAction seulement après validation des arguments et du budget d’opérations
JavaScript facultatif
Définissez THotPDF.XFAJavaScriptEnabled à True avant ApplyXFAAsAcroForm ou FlattenLoadedXFA pour exécuter les scripts dont le contentType sélectionne JavaScript
Le runtime prend en charge le flux de contrôle JavaScript normal et les tableaux typés natifs tels que Float64Array, mais ne reçoit aucun objet fichier, process, réseau, navigateur ni application ; fetch, XMLHttpRequest, WebSocket, require, process et Deno sont indisponibles
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;
Contexte de script
JavaScript reçoit un this.rawValue mutable, un event.value et une façade xfa figée
xfa.get(name, index)lit une valeur de données collectéexfa.values(name)renvoie une copie figée de chaque valeur répétéexfa.resolveNode(name)etxfa.resolveNodes(name)exposent des vues en lecture seule des valeurs brutesxfa.addInstance(name, count)etxfa.removeInstance(name, index)mettent en file des callbacks hôtes validés
Budgets et télémétrie
THPDFXFAFormScriptBudgets borne les octets de script, les opérations FormCalc, le temps écoulé, la profondeur d’expression, les éléments de tableaux répétés, les octets de valeurs, les opérations d’instance, la mémoire JavaScript, l’usage de pile JavaScript et les vérifications d’interruption
Le budget de pile fournit la frontière de récursion, tandis que les budgets de temps et d’interruption arrêtent les boucles non terminales ; les scripts qui franchissent une frontière déclenchent un échec sûr et ajoutent un diagnostic à XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected et XFAFlattenInstanceOperations rapportent la dernière passe d’aplanissement
Intégration directe du runtime
La surcharge étendue de HPDFXFAFlatten accepte directement TXFAFormScriptOptions et TXFAFormInstanceAction ; affectez TXFAFormScriptOptions.JavaScriptEvaluator pour adapter la liaison QuickJS statique ou un autre évaluateur appartenu à l’application, en conservant le même wrapper et les mêmes budgets
Voir TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets et THPDFXFAInstanceAction