Bounded XFA FormCalc and JavaScript

HotPDF는 form을 flattening하면서 XFA calculate script를 평가합니다. 항상 쓸 수 있는 bounded FormCalc 경로와, 애플리케이션이 명시적으로 켜기 전까지는 비활성인 더 넓은 QuickJS 경로가 함께 제공됩니다

확장된 FormCalc

FormCalc 식은 산술, string, boolean, 비교 연산자, short-circuit And, Or, Not과 lazy한 If(condition, whenTrue, whenFalse) 분기를 지원합니다

Sum, Avg, Min, Max, Count는 $record.rows[*].amount 같은 rooted, direct, indexed, wildcard, descendant 경로의 scalar와 SOM node-set 인수를 섞어 받습니다. If의 선택된 branch만 평가하므로 쓰이지 않는 invalid branch가 계산을 거부하지 않습니다

중첩 호출은 numeric, string, node-set 결과를 조합할 수 있고, At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within, Oneof를 결정적으로 지원합니다

사용자 정의 함수, loop, assignment, locale picture clause, network 함수는 native 부분집합 밖이며 fail closed 합니다

InstanceAdd(name, count)와 InstanceRemove(name, index)는 인수와 operation-budget 검증을 통과한 뒤에만 OnXFAInstanceAction으로 dispatch됩니다

선택적 JavaScript

contentType이 JavaScript를 고르는 script를 실행하려면 ApplyXFAAsAcroForm이나 FlattenLoadedXFA 전에 THotPDF.XFAJavaScriptEnabled를 True로 설정하세요

runtime은 일반적인 JavaScript 제어 흐름과 Float64Array 같은 native typed array를 지원하지만, file, process, network, browser, 애플리케이션 객체는 받지 않습니다. fetch, XMLHttpRequest, WebSocket, require, process, Deno는 쓸 수 없습니다

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;

Script 컨텍스트

JavaScript는 변경 가능한 this.rawValue, event.value, frozen xfa facade를 받습니다

Budget과 원격 측정

THPDFXFAFormScriptBudgets는 script 바이트, FormCalc 연산 수, 경과 시간, 식 깊이, 반복 array 항목, 값 바이트, instance 연산, JavaScript 메모리, JavaScript stack 사용량, interrupt 검사를 제한합니다

stack budget이 재귀 경계를 담당하고, 시간과 interrupt budget이 끝나지 않는 loop를 멈춥니다. 어떤 경계든 넘은 script는 fail closed 하고 XFAFlattenWarnings에 진단을 추가합니다

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected, XFAFlattenInstanceOperations가 가장 최근 flattening 패스를 보고합니다

runtime 직접 통합

확장된 HPDFXFAFlatten overload는 TXFAFormScriptOptions와 TXFAFormInstanceAction을 직접 받습니다. TXFAFormScriptOptions.JavaScriptEvaluator에 static QuickJS binding이나 다른 애플리케이션 소유 evaluator를 연결해도 같은 wrapper와 budget이 유지됩니다

TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets, THPDFXFAInstanceAction 참고