Bounded XFA FormCalc and JavaScript
O HotPDF avalia scripts de cálculo XFA ao achatar um formulário, com um caminho FormCalc limitado sempre disponível e um caminho QuickJS mais amplo que permanece desativado até que o aplicativo o habilite explicitamente
Extended FormCalc
Expressões FormCalc suportam aritmética, strings, booleanos, operadores de comparação, And, Or e Not de curto-circuito, mais a branch preguiçosa de If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max e Count aceitam argumentos mistos de escalares e node sets SOM usando paths enraizados, diretos, indexados, curinga ou descendentes, como $record.rows[*].amount; apenas a branch selecionada de If é avaliada, então uma branch inválida não usada não rejeita o cálculo
Chamadas aninhadas podem combinar resultados numéricos, de string e de node sets, com suporte determinístico a At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within e Oneof
Funções definidas pelo usuário, loops, atribuição, picture clauses de locale e funções de rede ficam fora do subconjunto nativo e falham fechados
InstanceAdd(name, count) e InstanceRemove(name, index) despacham por meio de OnXFAInstanceAction apenas depois da validação de argumentos e de orçamento de operações
Optional JavaScript
Defina THotPDF.XFAJavaScriptEnabled como True antes de ApplyXFAAsAcroForm ou FlattenLoadedXFA para rodar scripts cujo contentType seleciona JavaScript
O runtime suporta fluxo de controle JavaScript normal e typed arrays nativos como Float64Array, mas não recebe objeto algum de arquivo, processo, rede, browser ou aplicação; fetch, XMLHttpRequest, WebSocket, require, process e Deno ficam 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 de script
O JavaScript recebe um this.rawValue mutável, um event.value e uma facade xfa congelada
xfa.get(name, index)lê um valor de dado coletadoxfa.values(name)retorna uma cópia congelada de cada valor repetidoxfa.resolveNode(name)exfa.resolveNodes(name)expõem visões somente leitura de raw valuesxfa.addInstance(name, count)exfa.removeInstance(name, index)enfileiram callbacks validados do host
Orçamentos e telemetria
THPDFXFAFormScriptBudgets limita bytes de script, operações FormCalc, tempo decorrido, profundidade de expressão, itens repetidos de arrays, bytes de valor, operações de instância, memória JavaScript, uso de stack JavaScript e checagens de interrupção
O orçamento de stack fornece a fronteira de recursão, enquanto os orçamentos de tempo e de interrupção param loops que não terminam; scripts que cruzarem qualquer fronteira falham fechados e anexam um diagnóstico a XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected e XFAFlattenInstanceOperations reportam a última passada de achatamento
Integração direta com o runtime
A sobrecarga estendida de HPDFXFAFlatten aceita TXFAFormScriptOptions e TXFAFormInstanceAction diretamente; atribua TXFAFormScriptOptions.JavaScriptEvaluator para adaptar o binding estático do QuickJS ou outro avaliador de posse da aplicação, mantendo o mesmo wrapper e os mesmos orçamentos
Veja TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets e THPDFXFAInstanceAction