You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

关键说明

  1. 路径处理:使用filePath.toURI()将Illustrator的File对象转换为URI格式,避免路径中特殊字符导致的识别错误。
  2. Acrobat API规范:通过pdDoc.getJSObject()获取文档的JavaScript上下文,再调用addField方法添加签名域,这是Acrobat脚本添加表单域的标准方式。
  3. 执行顺序保障:添加saveName.exists判断,确保PDF文件完全保存后再触发Acrobat操作。
  4. 避免破坏性操作:移除flattenPages和强制退出Acrobat的代码,保证签名域可正常使用。

内容的提问来源于stack exchange,提问作者Harkirat Bansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:37:53