InDesign脚本优化:实现独立窗口与widows检测结果内嵌显示
InDesign 孤行检测脚本优化方案
原脚本存在两个核心问题:
- 模态弹窗阻塞操作:运行时无法切换到InDesign文档修改问题
- 结果弹窗无法留存:alert弹窗关闭后无法随时参考检测结果
以下是修改后的完整优化脚本:
// 创建非模态面板窗口,可悬浮操作文档 var Widows_Report = new Window("palette", "Widow Detector", undefined, {borderless: false, resizeable: true}); Widows_Report.orientation = "column"; Widows_Report.alignChildren = ["center", "top"]; Widows_Report.spacing = 10; Widows_Report.margins = 16; // 页面选择面板 var panel1 = Widows_Report.add("panel", undefined, "选择搜索范围"); panel1.orientation = "column"; panel1.alignChildren = ["center", "center"]; panel1.spacing = 10; panel1.margins = [10, 10, 9, 10]; var Page_Input = panel1.add("group"); Page_Input.orientation = "row"; Page_Input.alignChildren = ["center", "center"]; Page_Input.spacing = 10; Page_Input.margins = 6; var edittext1 = Page_Input.add('edittext', undefined, "1", {name: "edittext1"}); edittext1.helpTip = "输入起始页码"; edittext1.preferredSize.width = 45; edittext1.preferredSize.height = 23; var statictext1 = Page_Input.add("statictext", undefined, "至"); statictext1.preferredSize.width = 30; statictext1.preferredSize.height = 17; statictext1.justify = "center"; var edittext2 = Page_Input.add('edittext', undefined, app.activeDocument.pages.length.toString(), {name: "edittext2"}); edittext2.helpTip = "输入结束页码"; edittext2.preferredSize.width = 45; edittext2.preferredSize.height = 23; // 按钮组 var group3 = Widows_Report.add("group"); group3.orientation = "row"; group3.alignChildren = ["center", "top"]; group3.spacing = 10; group3.margins = 0; var button1 = group3.add("button", undefined, "开始检测"); button1.preferredSize.width = 80; var button2 = group3.add("button", undefined, "关闭窗口"); button2.preferredSize.width = 80; // 结果展示面板(可滚动) var resultPanel = Widows_Report.add("panel", undefined, "检测结果"); resultPanel.orientation = "column"; resultPanel.alignChildren = ["fill", "top"]; resultPanel.spacing = 5; resultPanel.margins = 10; resultPanel.preferredSize.width = 300; resultPanel.preferredSize.height = 200; // 滚动文本框,用于显示结果(只读) var resultText = resultPanel.add("edittext", undefined, "点击「开始检测」查看结果", {multiline: true, readonly: true}); resultText.preferredSize.width = 280; resultText.preferredSize.height = 180; resultText.scrolling = true; // 开始检测按钮事件 button1.onClick = function() { var startPage = parseInt(edittext1.text); var endPage = parseInt(edittext2.text); var doc = app.activeDocument; // 页码有效性验证 if (isNaN(startPage) || isNaN(endPage) || startPage < 1 || startPage > doc.pages.length || endPage < 1 || endPage > doc.pages.length || startPage > endPage) { resultText.text = "⚠️ 页码无效,请输入1到" + doc.pages.length + "之间的有效范围,且起始页码≤结束页码"; return; } var reportWidow = "检测结果:\n存在孤行的段落如下\n\n------------------------\n\n"; var foundWidows = false; for (var i = startPage - 1; i < endPage; i++) { var page = doc.pages[i]; var textFrames = page.textFrames; for (var j = 0; j < textFrames.length; j++) { var textFrame = textFrames[j]; var paragraphs = textFrame.paragraphs; for (var k = 0; k < paragraphs.length; k++) { var paragraph = paragraphs[k]; var fontSize = paragraph.pointSize; // 仅检测9.5-11号字体的段落 if (fontSize >= 9.5 && fontSize <= 11) { var lastLine = paragraph.lines[-1]; if (lastLine && lastLine.words.length === 1) { foundWidows = true; reportWidow += "页面 " + (i + 1) + ",段落 " + (k + 1) + "\n"; reportWidow += "孤行内容:" + lastLine.words[0].contents + "\n\n"; } } } } } if (foundWidows) { resultText.text = reportWidow; } else { resultText.text = "✅ 恭喜,未检测到孤行!"; } }; // 关闭窗口按钮事件 button2.onClick = function() { Widows_Report.close(); }; // 显示窗口 Widows_Report.show();
关键修改说明
- 窗口类型切换:将
dialog改为palette,这是InDesign支持的非模态窗口类型,可悬浮在软件上方,完全不阻塞文档操作 - 新增结果展示区:添加可滚动的只读文本框,替代alert弹窗,检测结果可随时查看、滚动
- 优化用户体验:给页码输入框设置默认值(起始1,结束为文档总页数),减少手动输入操作
- 统一提示逻辑:错误提示和检测结果都显示在结果框内,避免频繁弹窗干扰
- 支持窗口缩放:开启
resizeable: true,可根据需要调整窗口大小,查看更多结果
内容的提问来源于stack exchange,提问作者Bryan Pinkey
相关产品推荐
相关产品推荐

