XFA-FormCalc und JavaScript mit endlichen Budgets
HotPDF wertet XFA-Calculate-Scripts beim Flatten eines Formulars aus, mit einem stets verfügbaren begrenzten FormCalc-Pfad und einem breiteren QuickJS-Pfad, der deaktiviert bleibt, bis die Anwendung ihn explizit aktiviert
Erweitertes FormCalc
FormCalc-Ausdrücke unterstützen Arithmetik, Strings, Booleans, Vergleichsoperatoren, kurzgeschlossenes And, Or und Not sowie den trägen If(condition, whenTrue, whenFalse)-Zweig
Sum, Avg, Min, Max und Count akzeptieren gemischte Skalar- und SOM-Nodeset-Argumente mit verankerten, direkten, indizierten, Wildcard- oder Descendant-Pfaden wie $record.rows[*].amount; nur der gewählte If-Zweig wird ausgewertet, sodass ein ungenutzter ungültiger Zweig die Berechnung nicht zu Fall bringt
Verschachtelte Aufrufe können numerische, String- und Nodeset-Ergebnisse kombinieren, mit deterministischer Unterstützung für At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within und Oneof
Benutzerdefinierte Funktionen, Schleifen, Zuweisungen, locale Picture Clauses und Netzwerkfunktionen liegen außerhalb der nativen Teilmenge und schlagen kontrolliert fehl
InstanceAdd(name, count) und InstanceRemove(name, index) werden erst nach Argument- und Operation-Budget-Prüfung über OnXFAInstanceAction dispatcht
Optionales JavaScript
Setzen Sie THotPDF.XFAJavaScriptEnabled vor ApplyXFAAsAcroForm oder FlattenLoadedXFA auf True, um Scripts auszuführen, deren contentType JavaScript wählt
Die Runtime unterstützt normalen JavaScript-Kontrollfluss und native typisierte Arrays wie Float64Array, erhält aber kein Datei-, Prozess-, Netzwerk-, Browser- oder Anwendungsobjekt; fetch, XMLHttpRequest, WebSocket, require, process und Deno sind nicht verfügbar
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;
Script-Kontext
JavaScript erhält ein veränderliches this.rawValue, ein event.value und eine eingefrorene xfa-Fassade
xfa.get(name, index)liest einen gesammelten Datenwertxfa.values(name)liefert eine eingefrorene Kopie jedes wiederholten Wertsxfa.resolveNode(name)undxfa.resolveNodes(name)stellen Read-only-Sichten auf Raw-Werte bereitxfa.addInstance(name, count)undxfa.removeInstance(name, index)reihen validierte Host-Callbacks ein
Budgets und Telemetrie
THPDFXFAFormScriptBudgets begrenzt Script-Bytes, FormCalc-Operationen, verstrichene Zeit, Ausdruckstiefe, Items wiederholter Arrays, Wert-Bytes, Instanzoperationen, JavaScript-Memory, JavaScript-Stack-Nutzung und Interrupt-Checks
Das Stack-Budget bildet die Rekursionsgrenze, Zeit- und Interrupt-Budgets stoppen nicht terminierende Schleifen; Scripts, die eine Grenze überschreiten, schlagen kontrolliert fehl und hängen eine Diagnostik an XFAFlattenWarnings an
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected und XFAFlattenInstanceOperations berichten über den letzten Flattening-Durchlauf
Direkte Runtime-Integration
Der erweiterte HPDFXFAFlatten-Overload nimmt TXFAFormScriptOptions und TXFAFormInstanceAction direkt entgegen; weisen Sie TXFAFormScriptOptions.JavaScriptEvaluator zu, um die statische QuickJS-Bindung oder einen anderen anwendungseigenen Evaluator anzupassen und denselben Wrapper und dieselben Budgets beizubehalten
Siehe TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets und THPDFXFAInstanceAction