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
xfa.get(name, index)lee un valor de datos recopiladoxfa.values(name)devuelve una copia congelada de cada valor repetidoxfa.resolveNode(name)yxfa.resolveNodes(name)exponen vistas de valor sin procesar de solo lecturaxfa.addInstance(name, count)yxfa.removeInstance(name, index)ponen en cola devoluciones de llamada de anfitrión validadas
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