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

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