
本文详解如何在 acrobat javascript 中,根据签名字段所在页码,精准地将当前页及之前所有页面上的指定字段(如 “kvial”、”mvial”)设为只读,避免误锁后续页面字段。
在 adobe Acrobat 表单自动化中,常需实现场景:当用户在某页完成电子签名后,自动锁定该页及所有此前页面(page ≤ 当前页)上的关键字段,防止回填篡改。但原代码存在两个典型问题:
- for (j=1; j编码循环会无条件锁定全部 15 个 “kvial”/”mvial” 字段,无论其实际所在页码;
- 对 radio button 类型的字段做全局判断(currentField.type == “radiobutton”)会导致所有页面同类字段被误锁,违背“仅限当前页及之前页”的业务逻辑。
✅ 正确思路是:以字段真实页码(currentField.page)为唯一判断依据,结合字段名特征进行精细化控制。
✅ 推荐解决方案(结构清晰、安全可靠)
// 获取触发事件的签名字段所在页码(0 起始索引) var currentPageNum = event.target.page; // 遍历文档中每一个表单字段 for (var i = 0; i < this.numFields; i++) { var currentField = this.getField(this.getNthFieldName(i)); // 确保字段存在且有有效页码信息 if (!currentField || currentField.page === null) continue; // 【核心逻辑】仅对当前页及之前页的字段启用只读 if (currentField.page <= currentPageNum) { // 所有目标页字段统一设为只读 currentField.readonly = true; // 特别处理:同步锁定全局字段 "office" if (currentField.name === "office") { currentField.readonly = true; } // 精准识别并锁定跨页特殊字段(如 "1kvial", "5mvial" 等) var fieldName = currentField.name; if (fieldName.endsWith("kvial") || fieldName.endsWith("mvial")) { // ✅ 仅当该字段实际位于当前页或之前页时才锁定(已由外层 if 保证) currentField.readonly = true; } } } // 【可选增强】显式补充常见编号字段(若命名不规范或需兜底) for (var j = 1; j <= 15; j++) { var kvialField = this.getField(j + "kvial"); var mvialField = this.getField(j + "mvial"); if (kvialField && kvialField.page <= currentPageNum) { kvialField.readonly = true; } if (mvialField && mvialField.page <= currentPageNum) { mvialField.readonly = true; } } // 最终显示控制区域(如提示区块) this.getField("block").display = display.visible;
⚠️ 关键注意事项
- 页码索引从 0 开始:Acrobat 的 field.page 返回的是 0-based 页码(第 1 页为 0,第 2 页为 1),确保 currentPageNum 比较逻辑一致;
- 字段名匹配要严谨:endsWith() 适用于后缀固定场景(如 "kvial"),若字段名含前缀/分隔符(如 "P3.kvial"),建议改用正则:/^(.*.)?kvial$/.test(fieldName);
- Radio Button 特性提醒:单个 Radio Button 组由多个同名字段构成,Acrobat 会自动同步其只读状态——只需对组内任一成员设 readonly = true 即可全局生效;
- 性能优化建议:若表单字段极多(>500),可先用 this.getPageNumwords() 或预存字段页码映射表,避免每次遍历全量字段;
- 调试技巧:临时添加 console.println("Locking: " + fieldName + " on page " + currentField.page); 辅助验证逻辑覆盖范围。
通过以上实现,即可严格满足「签名后,仅当前页及之前页的 kvial/mvial 字段变为只读」这一业务需求,兼顾健壮性与可维护性。