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
xfa.get(name, index)tek bir toplanmış data değerini okurxfa.values(name)tekrarlanan her değerin donmuş bir kopyasını döndürürxfa.resolveNode(name)vexfa.resolveNodes(name)salt okunur raw-value görünümleri sunarxfa.addInstance(name, count)vexfa.removeInstance(name, index)doğrulanmış host callback'lerini kuyruğa 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