FormCalc y JavaScript XFA acotados

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

FormCalc extendido

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

Sum, Avg, Min, Max y Count aceptan argumentos mezclados de escalares y node sets de SOM usando paths con raíz, directos, indexados, con wildcard o descendientes como $record.rows[*].amount; solo se evalúa la rama seleccionada de If, así 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 sets, 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 loops, la asignación, las picture clauses de locale y las funciones de red quedan fuera del subset nativo y fallan de forma cerrada

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

JavaScript opcional

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

El runtime soporta el flujo de control normal de JavaScript y arrays tipados nativos como Float64Array, pero no recibe ningún objeto de archivo, proceso, red, browser ni 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 scripts

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

Presupuestos y telemetría

THPDFXFAFormScriptBudgets acota los bytes de scripts, las operaciones FormCalc, el tiempo transcurrido, la profundidad de expresiones, los items de arrays repetidos, los bytes de valores, las instance operations, la memoria de JavaScript, el uso de stack de JavaScript y las verificaciones de interrupción

El presupuesto de stack marca la frontera de la recursión, mientras que los presupuestos de tiempo e interrupción detienen los loops que no terminan; los scripts que cruzan cualquier frontera fallan de forma cerrada y agregan un diagnóstico a XFAFlattenWarnings

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected y XFAFlattenInstanceOperations reportan la última pasada de flattening

Integración directa con el runtime

El overload extendido de HPDFXFAFlatten acepta TXFAFormScriptOptions y TXFAFormInstanceAction directamente; asigne TXFAFormScriptOptions.JavaScriptEvaluator para adaptar el binding estático de QuickJS u otro evaluator propiedad de la aplicación conservando el mismo wrapper y presupuestos

Vea TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets y THPDFXFAInstanceAction