JavaScript 中实现 PDF 表单字段按页面顺序动态设为只读的完整方案

本文详解如何在 acrobat javascript 中,根据签名字段所在页码,精准地将当前页及之前所有页面上的指定字段(如 "kvial"、"mvial")设为只读,避免误锁后续页面字段。

在 Adobe Acrobat 表单自动化中,常需实现“签名即锁定”的逻辑:当用户在某页完成数字签名后,自动将该页及所有此前页面上的关键字段设为只读,防止回填篡改。但原代码存在两个典型问题:一是对 "kvial"/"mvial" 字段采用硬编码循环(j=1 to 15),无法感知其实际所在页码;二是错误地将所有同名字段全局设为只读,导致后续页面字段也被误锁。

正确的做法是统一通过字段的 page 属性进行上下文判断,而非依赖命名规则盲目遍历。以下是优化后的完整脚本:

// 获取触发事件的签名字段所在页码(0 起始索引)
var currentPageNum = event.target.page;

// 遍历文档中所有字段
for (var i = 0; i < this.numFields; i++) {
    var field = this.getField(this.getNthFieldName(i));
    if (!field) continue;

    // 仅处理位于当前页或之前页面的字段
    if (field.page <= currentPageNum) {
        // 基础锁定:所有前置页字段均设为只读
        field.readonly = true;

        // 特别处理:若为 "office" 字段,也同步锁定(跨页生效)
        if (field.name === "office") {
            field.readonly = true;
        }

        // 精准锁定:仅当字段位于「严格之前的页面」且名称以 "kvial" 或 "mvial" 结尾时才启用(避免重复设置当前页)
        if (field.page < currentPageNum) {
            var name = field.name;
            if (name.endsWith("kvial") || name.endsWith("mvial")) {
                field.readonly = true;
            }
        }
    }
}

// 【可选增强】显式补充常见编号模式字段(如 1kvial, 2mvial...),但需确保其 page 属性有效
// 注意:此循环仅作兜底,实际应优先依赖 page 判断,避免覆盖逻辑
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;

关键要点说明:

  • field.page 返回字段实际所在的页面索引(从 0 开始),是判断页面位置的唯一可靠依据;
  • 使用 endsWith() 比字符串匹配更健壮,兼容带前缀的命名(如 "P3.1kvial");
  • 避免在循环内重复执行 this.getField("office")——直接复用已获取的 field 对象判断 name;
  • 后续的 for(j=1..15) 循环仅为兼容历史命名习惯,必须增加 field.page ,否则将破坏页面边界逻辑;
  • 所有操作应在签名字段的 Mouse Up 或 Blur 事件中执行,确保事件上下文正确。

⚠️ 注意事项:

  • 若 "kvial"/"mvial" 是单选按钮组(radiobutton),Acrobat 会为每个选项生成独立字段(如 "group1::1", "group1::2"),此时需检查 field.parentName 或使用 getGroup() 方法批量处理;
  • 测试时务必验证多页 PDF 中跨页字段的 page 属性值,部分导入表单可能因渲染差异导致页码识别异常;
  • 生产环境建议添加 try/catch 并记录 console.println() 日志,便于调试字段未命中问题。

通过上述结构化逻辑,即可实现真正符合业务语义的“签名页及之前页面字段只读”效果,兼顾准确性、可维护性与向后兼容性。