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

Adobe InDesign脚本:对话框调用insertTextFrame函数失效问题

Adobe InDesign脚本:对话框调用insertTextFrame失效的解决方法

问题出在你使用了ScriptUI的Window对象创建对话框,在InDesign脚本环境中,这种方式会导致文档上下文访问异常;同时main函数中对话框显示后自动执行所有功能的逻辑,也会干扰你测试对话框的单独调用效果。

以下是修正后的完整代码:

function insertTextFrame(doc) {
  alert("function Insert Text Frame is ON.");
  var textFrame = doc.pages[0].textFrames.add();
  alert("textFrame added.");
  textFrame.geometricBounds = [0, 0, 100, 100];
  textFrame.contents = "Hello World";
  textFrame.contents += "\r\r";
  textFrame.contents += "#waza";
}

function insertTable(doc) {
  var numRows = 3;
  var numColumns = 4;
  var cellWidth = 50;
  var cellHeight = 20;

  var tableFrame = doc.pages[0].textFrames.add();
  tableFrame.geometricBounds = [50, 50, 50 + numRows * cellHeight, 50 + numColumns * cellWidth];

  var table = tableFrame.insertionPoints[0].tables.add({
    numRows: numRows,
    numColumns: numColumns
  });

  for (var row = 0; row < numRows; row++) {
    for (var col = 0; col < numColumns; col++) {
      var cell = table.rows[row].cells[col];
      cell.contents = "Ligne " + (row + 1) + ", Colonne " + (col + 1);
    }
  }
}

function insertSmiley(doc) {
  var docWidth = doc.documentPreferences.pageWidth;
  var docHeight = doc.documentPreferences.pageHeight;

  var head = doc.ovals.add({
    geometricBounds: [docHeight / 2 - 50, docWidth / 2 - 50, docHeight / 2 + 50, docWidth / 2 + 50],
    fillColor: "Yellow",
    strokeColor: "Black",
    strokeWeight: 1
  });

  var leftEye = doc.ovals.add({
    geometricBounds: [docHeight / 2 - 20, docWidth / 2 - 20, docHeight / 2 + 20, docWidth / 2],
    fillColor: "Black",
    strokeColor: "Black",
    strokeWeight: 1
  });

  var rightEye = doc.ovals.add({
    geometricBounds: [docHeight / 2 - 20, docWidth / 2, docHeight / 2 + 20, docWidth / 2 + 20],
    fillColor: "Black",
    strokeColor: "Black",
    strokeWeight: 1
  });

  var mouth = doc.graphicLines.add();
  mouth.paths[0].entirePath = [
    [docWidth / 2 - 20, docHeight / 2 + 40],
    [docWidth / 2, docHeight / 2 + 50],
    [docWidth / 2 + 20, docHeight / 2 + 40]
  ];
  mouth.strokeColor = "Black";
  mouth.strokeWeight = 1;

  var smileyGroup = doc.groups.add([head, leftEye, rightEye, mouth]);
  smileyGroup.name = "Smiley";
}

function findAndReplace(doc, findText, replaceText) {
  // 重置查找替换偏好,避免残留设置干扰
  app.findTextPreferences = NothingEnum.NOTHING;
  app.changeTextPreferences = NothingEnum.NOTHING;

  // 遍历文档中所有文本流
  for (var i = 0; i < doc.stories.length; i++) {
    var story = doc.stories[i];
    
    if (story.contents.indexOf(findText) !== -1) {
      app.findTextPreferences.findWhat = findText;
      app.changeTextPreferences.changeTo = replaceText;
      story.changeText();
      alert("Text replaced successfully.");
    }
  }

  // 再次重置偏好,清理环境
  app.findTextPreferences = NothingEnum.NOTHING;
  app.changeTextPreferences = NothingEnum.NOTHING;
}

function exportToPdf(doc) {
  var pdfPath = "~/Desktop/HelloWorld.pdf";
  var pdfFile = new File(pdfPath);
  doc.exportFile(ExportFormat.pdfType, pdfFile);
}

function dialogBox(doc) {
  // 使用InDesign原生对话框替代ScriptUI窗口
  var dialog = app.dialogs.add({name: "Script Menu"});

  // 创建对话框面板
  var panel = dialog.dialogColumns.add().dialogRows.add();

  // 添加按钮
  var btnInsertTextFrame = panel.add("button", undefined, "Insert Text Frame");
  var btnInsertTable = panel.add("button", undefined, "Insert Table");
  var btnInsertSmiley = panel.add("button", undefined, "Insert Smiley");
  var btnFindAndReplace = panel.add("button", undefined, "Find and Replace");
  var btnExportToPdf = panel.add("button", undefined, "Export to PDF");
  var btnExit = panel.add("button", undefined, "Exit");

  // 处理对话框确认事件
  if (dialog.show() == true) {
    // 根据点击的按钮执行对应功能
    switch (dialog.activeButton) {
      case btnInsertTextFrame:
        insertTextFrame(doc);
        break;
      case btnInsertTable:
        insertTable(doc);
        break;
      case btnInsertSmiley:
        insertSmiley(doc);
        break;
      case btnFindAndReplace:
        var findText = "#waza";
        var replaceText = "Hello World";
        findAndReplace(doc, findText, replaceText);
        break;
      case btnExportToPdf:
        exportToPdf(doc);
        break;
      case btnExit:
        // 无需操作,直接关闭
        break;
    }
  }

  // 销毁对话框,释放资源
  dialog.destroy();
}

function main() {
  if (app.documents.length > 0) {
    var doc = app.activeDocument;
    // 仅显示对话框,不再自动执行所有功能
    dialogBox(doc);
  } else {
    alert("No open document. Please open a document first.");
  }
}

// 执行主函数
main();

关键修改说明:

  1. 替换对话框实现:用InDesign原生的app.dialogs.add()替代ScriptUI的Window,确保脚本在InDesign环境中能正确访问文档上下文,避免模态窗口导致的上下文隔离问题。
  2. 清理main函数逻辑:移除了main函数中对话框显示后自动执行的所有insert操作,让功能仅通过对话框按钮触发,符合你“逐个调用”的需求。
  3. 统一文档参数:所有功能函数都使用传入的doc参数,不再混合app.activeDocument,避免文档切换导致的上下文错误。
  4. 修复查找替换的残留问题:在findAndReplace函数中添加了查找替换偏好的重置,避免之前的设置影响后续操作。

内容的提问来源于stack exchange,提问作者M. D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:29:52