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
xfa.get(name, index)lee un valor de datos recolectadoxfa.values(name)devuelve una copia congelada de cada valor repetidoxfa.resolveNode(name)yxfa.resolveNodes(name)exponen vistas de solo lectura de raw valuesxfa.addInstance(name, count)yxfa.removeInstance(name, index)ponen en cola callbacks de host validados
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