Обмежена мова 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

Бюджети та телеметрія

THPDFXFAFormScriptBudgets обмежує байти скрипта, операції FormCalc, витрачений час, глибину виразу, елементи повторюваних масивів, байти значення, операції з екземплярами, пам'ять JavaScript, використання стека JavaScript та перевірки переривання

Бюджет стека забезпечує межу рекурсії, а бюджети часу й переривань зупиняють цикли, що не завершуються; скрипти, що перетинають будь-яку межу, завершуються за замовчуванням із закриттям і додають діагностику до XFAFlattenWarnings

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected та XFAFlattenInstanceOperations звітують останній прохід спрощення

Пряма інтеграція з середовищем виконання

Розширене перевантаження HPDFXFAFlatten приймає TXFAFormScriptOptions та TXFAFormInstanceAction безпосередньо; призначте TXFAFormScriptOptions.JavaScriptEvaluator, щоб адаптувати статичне зв'язування QuickJS або інший обчислювач, що належить застосунку, зберігаючи той самий обгортник і бюджети

Дивіться TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets та THPDFXFAInstanceAction