跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

JavaScript 中实现 PDF 表单字段按页面顺序设为只读的完整教程

本文详解如何在 acrobat java script 中,根据签名字段所在页码,精准地将当前页及之前所有页面上的指定字段(如 "kvial"、"mvial")设为只读,避免误锁后续页面字段。 在 Adobe Acrobat 表单自动化中,常需实现“签名即锁定”的交互逻辑:当用户在某页完成电子签名后,自动将该页及之前所有页面的表单字段设为只读,防止后续修改。但原代码存在两个关键问题: 全局遍历 this.numFields 时未区分字段所属页面,导致 "kvial"/"mvial" 类字段被无条件全部锁定(无论页码); 对放射按钮(radiobutton)的判断逻辑错误——仅凭 field.type === "radiobutton" 就设为只读,会跨页误锁。 ✅ 正确思路是: 先按页码筛选(field.page <= currentPageNum),再对特定命名模式的字段做精细化控制 。 以下是推荐的健壮实现方案:
// 获取触发事件的签名字段所在页码(注意: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) { // 统一设为只读(含 office 字段) field.readonly = true; this.getField("office")?.readonly = true; // 针对跨页的 kvial/mvial 字段:仅当其位于「之前页面」(非当前页)时额外确认 // (当前页字段已在上面通用逻辑中处理,此处强化语义) if (field.page < currentPageNum) { var name = field.name; if (name.endsWith("kvial") || name.endsWith("mvial")) { field.readonly = true; // 显式确保 } } } } // 【可选】补充批量设置(适用于命名规则严格、页码前缀明确的场景) // 注意:此循环仅在字段名形如 "1kvial", "2mvial" 等时有效;若字段已按页组织,优先使用上方动态遍历逻辑 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;
? 关键注意事项 : Adobe Firefly Adobe最新推出的AI图像生成和编辑工具 下载 立即学习 “ Java免费学习笔记(深入) ”; field.page 返回的是 0-based 页面索引 (第1页为 0,第2页为 1),请确保签名字段的 event.target.page 值符合预期; 使用 ?. 可选链操作符(Acrobat DC 支持)避免 getField() 返回 null 时抛错; 若 "kvial"/"mvial" 字段为单选按钮组(radiobutton),需注意: 整个按钮组共享一个名称 ,锁定一个即锁定全部,无需逐个设置; 强烈建议在 documentWillSave 或签名字段的 Mouse Up 事件中执行该脚本,而非 Calculate 或 Format,以保证执行时机准确; 测试时务必用多页 PDF 验证:签名在 P3 时,P1–P3 的 kvial 应只读,P4+ 的应保持可编辑。 通过以上结构化逻辑,即可精准实现「签名页及之前页面字段只读」的业务需求,兼顾健壮性与可维护性。

相关文章