FormCalc e JavaScript XFA limitados
O HotPDF avalia scripts calculate XFA ao achatar um formulário, com um caminho FormCalc limitado sempre disponível e um caminho QuickJS mais alargado que permanece desativado até a aplicação o ativar explicitamente
FormCalc extendido
As expressões FormCalc suportam aritmética, cadeias, booleanos, operadores de comparação, And, Or e Not de curto-circuito, mais o ramo preguiçoso If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max e Count aceitam argumentos mistos de escalares e de conjuntos de nós SOM, com caminhos enraizados, diretos, indexados, com wildcard ou descendentes, como $record.rows[*].amount; só o ramo selecionado de If é avaliado, pelo que um ramo inválido não usado não rejeita o cálculo
Chamadas aninhadas podem combinar resultados numéricos, de cadeia e de conjuntos de nós, com suporte determinístico para At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within e Oneof
Funções definidas pelo utilizador, loops, atribuição, cláusulas picture de locale e funções de rede ficam fora do subconjunto nativo e falham de forma fechada
InstanceAdd(name, count) e InstanceRemove(name, index) despacham através de OnXFAInstanceAction só depois da validação de argumentos e do orçamento de operações
JavaScript opcional
Defina THotPDF.XFAJavaScriptEnabled como True antes de ApplyXFAAsAcroForm ou FlattenLoadedXFA para executar scripts cujo contentType selecione JavaScript
O runtime suporta o fluxo de controlo normal de JavaScript e typed arrays nativos como Float64Array, mas não recebe nenhum objeto de ficheiro, processo, rede, navegador ou aplicação; fetch, XMLHttpRequest, WebSocket, require, process e Deno estão indisponíveis
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 dos scripts
O JavaScript recebe um this.rawValue mutável, um event.value e uma facade xfa congelada
xfa.get(name, index)lê um valor de dados recolhidoxfa.values(name)devolve uma cópia congelada de todos os valores repetidosxfa.resolveNode(name)exfa.resolveNodes(name)expõem vistas só de leitura de valores brutosxfa.addInstance(name, count)exfa.removeInstance(name, index)colocam em fila callbacks validados do anfitrião
Orçamentos e telemetria
THPDFXFAFormScriptBudgets limita bytes de script, operações FormCalc, tempo decorrido, profundidade de expressões, itens de arrays repetidos, bytes de valor, operações de instância, memória de JavaScript, uso de stack de JavaScript e verificações de interrupção
O orçamento de stack proporciona o limite de recursão, enquanto os orçamentos de tempo e de interrupção param loops não terminantes; scripts que ultrapassem qualquer limite falham de forma fechada e acrescentam um diagnóstico a XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected e XFAFlattenInstanceOperations informam a passada de achatamento mais recente
Integração direta de runtimes
A overload extendida de HPDFXFAFlatten aceita TXFAFormScriptOptions e TXFAFormInstanceAction diretamente; atribua TXFAFormScriptOptions.JavaScriptEvaluator para adaptar o binding estático de QuickJS ou outro avaliador da propriedade da aplicação, mantendo o mesmo wrapper e os mesmos orçamentos
Veja TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets e THPDFXFAInstanceAction