Sınırlandırılmış XFA FormCalc ve JavaScript

HotPDF, bir formu flatten ederken XFA calculate script'lerini değerlendirir; her zaman kullanılabilir sınırlandırılmış bir FormCalc yolu ve uygulama açıkça etkinleştirene kadar devre dışı kalan daha kapsamlı bir QuickJS yolu sunar

Genişletilmiş FormCalc

FormCalc ifadeleri aritmetiği, string'leri, boolean'ları, karşılaştırma operator'lerini, short-circuit And, Or ve Not ile tembel değerlendirmeli If(condition, whenTrue, whenFalse) dalını destekler

Sum, Avg, Min, Max ve Count, $record.rows[*].amount gibi rooted, direct, indexed, wildcard veya descendant yollar kullanan karışık scalar ve SOM node-set argümanlarını kabul eder; yalnızca If seçilen dalı değerlendirilir, böylece kullanılmayan geçersiz bir dal hesaplamayı reddetmez

İç içe çağrılar numeric, string ve node-set sonuçlarını birleştirebilir; At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within ve Oneof deterministik olarak desteklenir

Kullanıcı tanımlı fonksiyonlar, döngüler, atama, locale picture clause'ları ve ağ fonksiyonları yerel alt kümenin dışında kalır ve güvenli biçimde başarısız olur (fail closed)

InstanceAdd(name, count) ve InstanceRemove(name, index), yalnızca argüman ve işlem bütçesi doğrulamasından sonra OnXFAInstanceAction üzerinden dağıtılır

İsteğe bağlı JavaScript

contentType değeri JavaScript seçen script'leri çalıştırmak için ApplyXFAAsAcroForm veya FlattenLoadedXFA çağrısından önce THotPDF.XFAJavaScriptEnabled değerini True yapın

Runtime, normal JavaScript kontrol akışını ve Float64Array gibi native typed array'leri destekler; ama dosya, process, ağ, tarayıcı veya uygulama nesnesi almaz — fetch, XMLHttpRequest, WebSocket, require, process ve Deno kullanılamaz

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 bağlamı

JavaScript, değiştirilebilir bir this.rawValue, bir event.value ve donmuş bir xfa facade'i alır

Bütçeler ve telemetry

THPDFXFAFormScriptBudgets; script byte, FormCalc işlem sayısı, geçen süre, ifade derinliği, tekrarlanan array ögeleri, value byte, instance işlemleri, JavaScript belleği, JavaScript stack kullanımı ve interrupt denetimlerine sınır çizer

Stack bütçesi recursion sınırını sağlar, süre ve interrupt bütçeleri ise sonlanmayan döngüleri durdurur; herhangi bir sınırı aşan script'ler güvenli biçimde başarısız olur ve XFAFlattenWarnings listesine bir tanı ekler

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected ve XFAFlattenInstanceOperations en son flattening geçişini raporlar

Doğrudan runtime entegrasyonu

Genişletilmiş HPDFXFAFlatten overload'u TXFAFormScriptOptions ve TXFAFormInstanceAction değerlerini doğrudan kabul eder; aynı wrapper ve bütçeleri korurken static QuickJS binding'ini ya da başka bir uygulamaya ait evaluator'ı uyarlamak için TXFAFormScriptOptions.JavaScriptEvaluator alanına atama yapın

Ayrıca bkz. TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets ve THPDFXFAInstanceAction