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();
关键修改说明:
- 替换对话框实现:用InDesign原生的
app.dialogs.add()替代ScriptUI的Window,确保脚本在InDesign环境中能正确访问文档上下文,避免模态窗口导致的上下文隔离问题。 - 清理main函数逻辑:移除了main函数中对话框显示后自动执行的所有insert操作,让功能仅通过对话框按钮触发,符合你“逐个调用”的需求。
- 统一文档参数:所有功能函数都使用传入的
doc参数,不再混合app.activeDocument,避免文档切换导致的上下文错误。 - 修复查找替换的残留问题:在
findAndReplace函数中添加了查找替换偏好的重置,避免之前的设置影响后续操作。
内容的提问来源于stack exchange,提问作者M. D.
相关产品推荐
相关产品推荐

