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 解析会在事件内立即反映成功的编辑

脚本对象保留的引用在提交编辑或事件回滚之后仍指向自己的节点,分离的深浅克隆也不例外

环、来自其他父节点的引用子节点,或把数据模型节点传给表单操作,都会在该非法操作改动树之前抛出异常

form 模型根可以包含新建的 subform 和字段,但模型根本身不能被移动或克隆

重复作用域与初始实例

即使编写名称相同、数据上下文不同或不存在 datasets packet,真实表单实例也保留各自的身份

空合并使用显式的 occur.initial 计数,initial 缺失时用 occur.min;max 缺失时默认为 min

空合并允许 initial 计数在最小与最大值之外,包括零个初始副本

嵌套与未命名的 subform 保留自己的 occurrence 路径,物化这些实例不会合成 datasets packet

这些 occurrence 规则遵循 XML Forms Architecture 3.3 印刷页 339–345

提交、回滚与输出

成功的事件应用其结构 journal、重建原生 widget,并让编辑后的表单可供 SaveToBytes 和自动原生 PDF 创建使用

未捕获的脚本异常、原生提交失败或超出事件预算会恢复原始文档、widget 身份和留存的脚本状态,后续事件可以重试

既有的操作、节点、深度、字节、widget 和耗时预算同样适用于结构准备与提交

保存的表单实例可以重新加载并交给 HPDFXFAWriteHeadlessPDF,用提供的字体字节创建真实的 PDF 字段和外观流

范围

这些 API 编辑存活的 form 模型及其受支持的属性 schema

通用 xfa.template 编辑、完整的 choice subform-set 处理、完整的 XFA 类 schema 和任意绑定选择器组合仍是独立能力