Обмежена мова FormCalc і JavaScript XFA
HotPDF обчислює скрипти обчислення XFA під час спрощення форми, зі завжди доступним обмеженим шляхом FormCalc та ширшим шляхом QuickJS, який залишається вимкненим, доки застосунок явно його не ввімкне
Розширена FormCalc
Вирази FormCalc підтримують арифметику, рядки, булеві значення, оператори порівняння, швидкодійні And, Or і Not, а також ліниве розгалуження If(condition, whenTrue, whenFalse)
Sum, Avg, Min, Max та Count приймають повторювані числові дані, як-от rows[*].amount; обчислюється лише вибране розгалуження If, тому невикористана недійсна гілка не відхиляє обчислення
Вкладені виклики можуть поєднувати числові результати, рядкові результати та результати наборів вузлів, з детермінованою підтримкою At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within і Oneof
Визначені користувачем функції, цикли, призначення, локальні picture clauses та мережеві функції залишаються поза нативною підмножиною і зазнають безпечної невдачі
InstanceAdd(name, count) та InstanceRemove(name, index) викликаються через OnXFAInstanceAction лише після перевірки аргументів і бюджету операцій
Необов'язковий JavaScript
Встановіть THotPDF.XFAJavaScriptEnabled у True перед ApplyXFAAsAcroForm або FlattenLoadedXFA, щоб запускати скрипти, чий contentType обирає JavaScript
Середовище виконання підтримує звичайний контроль виконання JavaScript і рідні типізовані масиви, як-от Float64Array, але не отримує жодного об'єкта файлу, процесу, мережі, браузера чи застосунку; 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;
Контекст скрипта
JavaScript отримує змінне this.rawValue, значення event.value та заморожений фасад xfa
xfa.get(name, index)читає одне зібране значення данихxfa.values(name)повертає заморожену копію кожного повторюваного значенняxfa.resolveNode(name)таxfa.resolveNodes(name)надають перегляди сирого значення лише для читанняxfa.addInstance(name, count)таxfa.removeInstance(name, index)ставлять у чергу перевірені зворотні виклики хоста
Бюджети та телеметрія
THPDFXFAFormScriptBudgets обмежує байти скрипта, операції FormCalc, витрачений час, глибину виразу, елементи повторюваних масивів, байти значення, операції з екземплярами, пам'ять JavaScript, використання стека JavaScript та перевірки переривання
Бюджет стека забезпечує межу рекурсії, а бюджети часу й переривань зупиняють цикли, що не завершуються; скрипти, що перетинають будь-яку межу, завершуються за замовчуванням із закриттям і додають діагностику до XFAFlattenWarnings
XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected та XFAFlattenInstanceOperations звітують останній прохід спрощення
Пряма інтеграція з середовищем виконання
Розширене перевантаження HPDFXFAFlatten приймає TXFAFormScriptOptions та TXFAFormInstanceAction безпосередньо; призначте TXFAFormScriptOptions.JavaScriptEvaluator, щоб адаптувати статичне зв'язування QuickJS або інший обчислювач, що належить застосунку, зберігаючи той самий обгортник і бюджети
Дивіться TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets та THPDFXFAInstanceAction