Ograniczone FormCalc i JavaScript w XFA
HotPDF ewaluuje skrypty obliczeń XFA podczas spłaszczania formularza, z zawsze dostępną ograniczoną ścieżką FormCalc i szerszą ścieżką QuickJS, która pozostaje wyłączona, dopóki aplikacja jawnie jej nie włączy
Rozszerzony FormCalc
Wyrażenia FormCalc wspierają arytmetykę, łańcuchy, wartości boolowskie, operatory porównań, zwarcowe And, Or i Not oraz leniwy warunek If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max i Count przyjmują mieszane argumenty skalarne i zbiory węzłów SOM przy użyciu ścieżek ukorzenionych, bezpośrednich, indeksowanych, wieloznacznych i potomnych, takich jak $record.rows[*].amount; ewaluowana jest tylko wybrana gałąź If, więc nieużywana nieprawidłowa gałąź nie odrzuca obliczenia
Zagnieżdżone wywołania mogą łączyć wyniki liczbowe, łańcuchowe i zbiory węzłów, z deterministycznym wsparciem dla At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within i Oneof
Funkcje definiowane przez użytkownika, pętle, przypisania, klauzule obrazów locale oraz funkcje sieciowe pozostają poza natywnym podzbiorem i zachowują strategię fail closed
InstanceAdd(name, count) i InstanceRemove(name, index) są wywoływane przez OnXFAInstanceAction dopiero po walidacji argumentów i budżetu operacji
Opcjonalny JavaScript
Ustaw THotPDF.XFAJavaScriptEnabled na True przed ApplyXFAAsAcroForm lub FlattenLoadedXFA, aby uruchamiać skrypty, których contentType wybiera JavaScript
Runtime wspiera normalny przepływ sterowania JavaScript i natywne tablice typowane, takie jak Float64Array, ale nie otrzymuje żadnego obiektu plikowego, procesowego, sieciowego, przeglądarkowego ani aplikacyjnego; fetch, XMLHttpRequest, WebSocket, require, process i Deno są niedostępne
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;
Kontekst skryptu
JavaScript otrzymuje mutowalne this.rawValue, event.value oraz zamrożoną fasadę xfa
xfa.get(name, index)odczytuje jedną zebraną wartość danychxfa.values(name)zwraca zamrożoną kopię każdej powtórzonej wartościxfa.resolveNode(name)ixfa.resolveNodes(name)wystawiają widoki surowych wartości tylko do odczytuxfa.addInstance(name, count)ixfa.removeInstance(name, index)kolejkują walidowane wywołania zwrotne hosta
Budżety i telemetria
THPDFXFAFormScriptBudgets ogranicza bajty skryptu, operacje FormCalc, upływający czas, głębokość wyrażeń, elementy powtarzanych tablic, bajty wartości, operacje na instancjach, pamięć JavaScript, użycie stosu JavaScript i sprawdzenia przerwań
Budżet stosu zapewnia granicę rekurencji, a budżety czasu i przerwań zatrzymują pętle, które się nie kończą; skrypty przekraczające jakąkolwiek granicę kończą się bezpieczną porażką i dopisują diagnostykę do XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected i XFAFlattenInstanceOperations raportują ostatni przebieg spłaszczania
Bezpośrednia integracja runtime
Rozszerzone przeciążenie HPDFXFAFlatten przyjmuje bezpośrednio TXFAFormScriptOptions i TXFAFormInstanceAction; przypisz TXFAFormScriptOptions.JavaScriptEvaluator, aby zaadaptować statyczne bindowanie QuickJS albo inny ewaluator należący do aplikacji, zachowując ten sam wrapper i budżety
Zobacz TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets i THPDFXFAInstanceAction