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

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