XFA form tree 建立與編輯

TXFAWidgetRuntime 經 xfa.form 與節點集合支援對存活 form tree 的事務化 JavaScript 建立、複製與編輯

存活 form tree 擁有獨立的原生身分,可以儲存為 XDP form packet,而無需更動撰寫的 template

建立並插入欄位

var row = xfa.resolveNode("row[1]");
var field = xfa.form.createNode("field", "additional");
row.nodes.append(field);
field.w = "160pt";
field.h = "24pt";
field.ui.getElement("textEdit");
field.font.typeface = "DejaVu Sans";
field.rawValue = "Additional value";

createNode(className, name, namespaceURI) 回傳分離節點;選用引數省略時使用空名稱與模型命名空間

接受的類別包含 field、subform、draw、area、exclGroup 以及執行期屬性 schema 識別的屬性類別

建立節點並不會把它插入表單或產生可見 widget,除非用必要的 UI 與值屬性把它附著

集合操作與複製

操作行為
parent.nodes.append(node)把分離或附著的節點移到父節點存活子集合的結尾
parent.nodes.insert(node, before)把節點移到同一父節點某個既有子節點之前
parent.nodes.remove(node)分離子節點,保留其腳本身分供以後重用
node.clone(true)回傳帶獨立原生與腳本身分的分離深層副本
node.clone(false)回傳無子節點、不複製欄位值的分離淺層副本

集合順序、parent、屬性查找與受支援的 SOM 解析會在事件內立即反映成功的編輯

腳本物件保留的參照在提交編輯或事件 rollback 之後仍指向自己的節點,分離的深淺層副本也不例外

環、來自其他父節點的參照子節點,或把資料模型節點傳給表單操作,都會在該非法操作更動樹之前拋出例外

form 模型根可以包含新建的 subform 與欄位,但模型根本身不能被移動或複製

重複作用域與初始 instance

即使撰寫名稱相同、資料上下文不同或不存在 datasets packet,真實表單 instance 也保留各自的身分

空合併使用明確的 occur.initial 計數,initial 缺失時用 occur.min;max 缺失時預設為 min

空合併允許 initial 計數在最小與最大值之外,包含零個初始副本

巢狀與未命名的 subform 保留自己的 occurrence 路徑,物化這些 instance 不會合成 datasets packet

這些 occurrence 規則遵循 XML Forms Architecture 3.3 印刷頁 339–345

提交、rollback 與輸出

成功的事件套用其結構 journal、重建原生 widget,並讓編輯後的表單可供 SaveToBytes 與自動原生 PDF 建立使用

未捕捉的腳本例外、原生提交失敗或超出事件預算會還原原始文件、widget 身分與留存的腳本狀態,後續事件可以重試

既有的操作、節點、深度、位元組、widget 與耗時預算同樣適用於結構準備與提交

儲存的表單 instance 可以重新載入並交給 HPDFXFAWriteHeadlessPDF,用提供的字型位元組建立真實的 PDF 欄位與外觀串流

範圍

這些 API 編輯存活的 form 模型及其受支援的屬性 schema

通用 xfa.template 編輯、完整的 choice subform-set 處理、完整的 XFA 類別 schema 與任意綁定選擇器組合仍是獨立能力