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

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