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

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