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를 받습니다
xfa.get(name, index)는 수집된 data 값 하나를 읽습니다xfa.values(name)은 반복된 모든 값의 frozen copy를 돌려줍니다xfa.resolveNode(name)과xfa.resolveNodes(name)은 읽기 전용 raw-value view를 노출합니다xfa.addInstance(name, count)와xfa.removeInstance(name, index)는 검증된 host callback을 queue에 넣습니다
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 참고