Bounded XFA FormCalc and JavaScript

HotPDF evalúa los scripts de cálculo XFA mientras aplana un formulario, con una ruta FormCalc acotada siempre disponible y una ruta QuickJS más amplia que permanece deshabilitada hasta que la aplicación la habilita explícitamente

FormCalc extendido

Las expresiones FormCalc soportan aritmética, cadenas, booleanos, operadores de comparación, And, Or y Not de cortocircuito, más la rama perezosa If(condition, whenTrue, whenFalse)

Sum, Avg, Min, Max y Count aceptan argumentos mixtos de escalares y node-sets SOM usando rutas con raíz, directas, indexadas, con comodines o descendientes, como $record.rows[*].amount; solo se evalúa la rama seleccionada de If, de modo que una rama inválida sin uso no rechaza el cálculo

Las llamadas anidadas pueden combinar resultados numéricos, de cadena y de node-set, con soporte determinista para At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within y Oneof

Las funciones definidas por el usuario, los bucles, la asignación, las cláusulas picture de locale y las funciones de red quedan fuera del subconjunto nativo y fallan de forma cerrada

InstanceAdd(name, count) y InstanceRemove(name, index) se despachan a través de OnXFAInstanceAction solo después de validar argumentos y presupuesto de operaciones

JavaScript opcional

Establece THotPDF.XFAJavaScriptEnabled en True antes de ApplyXFAAsAcroForm o FlattenLoadedXFA para ejecutar scripts cuyo contentType selecciona JavaScript

El runtime admite el flujo de control normal de JavaScript y matrices tipadas nativas como Float64Array, pero no recibe ningún objeto de archivo, proceso, red, navegador o aplicación; fetch, XMLHttpRequest, WebSocket, require, process y Deno no están disponibles

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;

Contexto de script

JavaScript recibe un this.rawValue mutable, un event.value y una fachada xfa congelada

Presupuestos y telemetría

THPDFXFAFormScriptBudgets acota los bytes de script, las operaciones FormCalc, el tiempo transcurrido, la profundidad de expresión, los elementos de matriz repetida, los bytes de valor, las operaciones de instancia, la memoria JavaScript, el uso de pila JavaScript y las comprobaciones de interrupción

El presupuesto de pila proporciona el límite de recursión, mientras que los presupuestos de tiempo e interrupción detienen los bucles que no terminan; los scripts que cruzan cualquier límite fallan de forma segura y agregan un diagnóstico a XFAFlattenWarnings

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected y XFAFlattenInstanceOperations informan de la última pasada de aplanado

Integración directa en runtime

La sobrecarga extendida de HPDFXFAFlatten acepta TXFAFormScriptOptions y TXFAFormInstanceAction directamente; asigne TXFAFormScriptOptions.JavaScriptEvaluator para adaptar el enlace estático de QuickJS u otro evaluador propiedad de la aplicación conservando el mismo wrapper y presupuestos

Véase TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets y THPDFXFAInstanceAction