Illustrator与Acrobat脚本联动:PDF生成并添加签名域故障排查
解决Illustrator导出PDF后自动添加Acrobat签名域的脚本合并问题
问题背景
需要实现一个自动化脚本:先将Illustrator当前文档导出为PDF,再自动在该PDF中添加签名域。目前两个功能的独立脚本可正常运行,但合并后仅能生成PDF,无法完成签名域添加操作。
独立功能脚本
Illustrator保存PDF脚本
saveFileToPDF(); function saveFileToPDF() { var doc = app.activeDocument; if (app.documents.length > 0) { var docName = doc.name; var extensionIndex = docName.lastIndexOf("."); var fileName = (extensionIndex > -1) ? docName.slice(0, extensionIndex) : docName; var saveName = new File(doc.path + "/" + fileName + ".pdf"); var saveOpts = new PDFSaveOptions(); saveOpts.compatibility = PDFCompatibility.ACROBAT5; saveOpts.preserveEditability = true; doc.saveAs(saveName, saveOpts); } }
Acrobat添加签名域脚本
var name = "sigField"; var type = "signature"; var page = 0; var mySigRect = [3016,247,3138,189]; var sf = this.addField(name, type, page, mySigRect); this.saveAs(this.path); this.closeDoc();
尝试的合并脚本(仅生成PDF,签名域添加失败)
saveFileToPDF(); function saveFileToPDF() { var doc = app.activeDocument; if (app.documents.length > 0) { var docName = doc.name; var extensionIndex = docName.lastIndexOf("."); var fileName = (extensionIndex > -1) ? docName.slice(0, extensionIndex) : docName; var saveName = new File(doc.path + "/" + fileName + ".pdf"); var saveOptions = new PDFSaveOptions(); saveOptions.preserveEditability = true; doc.saveAs(saveName, saveOptions); // Call the function to run code in Adobe Acrobat runCodeInAcrobat(saveName); } } // Code for Adobe Acrobat function runCodeInAcrobat(filePath) { var bt = new BridgeTalk(); bt.target = "acrobat"; bt.body = 'var avDoc = app.openDoc("' + filePath + '");' + 'var pdDoc = avDoc.getNthPDDoc(0);' + 'var page = pdDoc.getPageNumWords(0);' + 'var rect = [100, 100, 200, 200];' + // Adjust signature field position and size 'var annot = pdDoc.addAnnot({ type: "Widget", subtype: "Sig", rect: rect });' + 'annot.userName = "John Doe";' + 'annot.pageNum = 0;' + 'annot.AP = annot.getAppearance();' + 'annot.AP.setRect(rect);' + 'pdDoc.flattenPages(0, 0);' + 'pdDoc.save(0, "");' + 'pdDoc.closeDoc();' + 'app.execMenuItem("Quit");'; // Quit Adobe Acrobat Pro after performing actions bt.onResult = function(result) { if (result === "executed") { alert("Actions completed in Adobe Acrobat Pro."); } else { alert("Failed to execute actions in Adobe Acrobat Pro."); } }; bt.send(); }
问题分析
合并脚本失败的核心原因在于BridgeTalk调用Acrobat的代码存在多处API使用错误:
- 使用
pdDoc.addAnnot添加签名域是错误的,Acrobat中添加签名域的正确方法是通过文档JS上下文调用addField。 - 文件路径未正确转义:直接拼接File对象为字符串会导致路径格式错误,Acrobat无法识别。
- 多余的
flattenPages操作会扁平化签名域,导致字段丢失。 - 强制退出Acrobat的操作可能中断脚本执行流程。
修正后的完整脚本
saveFileToPDF(); function saveFileToPDF() { var doc = app.activeDocument; if (app.documents.length > 0) { var docName = doc.name; var extensionIndex = docName.lastIndexOf("."); var fileName = (extensionIndex > -1) ? docName.slice(0, extensionIndex) : docName; var saveName = new File(doc.path + "/" + fileName + ".pdf"); var saveOptions = new PDFSaveOptions(); saveOptions.compatibility = PDFCompatibility.ACROBAT5; saveOptions.preserveEditability = true; doc.saveAs(saveName, saveOptions); // 确保PDF保存完成后再执行Acrobat操作 if (saveName.exists) { runCodeInAcrobat(saveName); } else { alert("PDF文件保存失败,无法执行后续操作"); } } } function runCodeInAcrobat(filePath) { var bt = new BridgeTalk(); bt.target = "acrobat"; // 将File对象转换为Acrobat可识别的URI格式 var fileURI = filePath.toURI(); // Acrobat脚本逻辑:使用正确API添加签名域 bt.body = ` var avDoc = app.openDoc("${fileURI}"); var pdDoc = avDoc.getPDDoc(); var jsDoc = pdDoc.getJSObject(); // 签名域参数(可按需调整) var fieldName = "sigField"; var fieldType = "signature"; var targetPage = 0; // 矩形坐标:[左, 下, 右, 上],单位为点(1英寸=72点) var sigRect = [3016,247,3138,189]; // 添加签名域 var sigField = jsDoc.addField(fieldName, fieldType, targetPage, sigRect); if (sigField) { // 可选:设置签名域提示文本 sigField.userName = "请在此处签名"; // 保存文档 jsDoc.saveAs(jsDoc.path); // 关闭文档(true表示保存更改) avDoc.closeDoc(true); // 返回执行成功标记 "executed"; } else { "failed"; } `; bt.onResult = function(result) { if (result.body === "executed") { alert("PDF导出及签名域添加完成"); } else { alert("签名域添加失败"); } }; bt.send(); }
关键说明
- 路径处理:使用
filePath.toURI()将Illustrator的File对象转换为URI格式,避免路径中特殊字符导致的识别错误。 - Acrobat API规范:通过
pdDoc.getJSObject()获取文档的JavaScript上下文,再调用addField方法添加签名域,这是Acrobat脚本添加表单域的标准方式。 - 执行顺序保障:添加
saveName.exists判断,确保PDF文件完全保存后再触发Acrobat操作。 - 避免破坏性操作:移除
flattenPages和强制退出Acrobat的代码,保证签名域可正常使用。
内容的提问来源于stack exchange,提问作者Harkirat Bansal
相关产品推荐
相关产品推荐

