从AppleScript转ExtendScript的新手求助:InDesign脚本圆角实现及代码优化
问题描述
本人熟练使用AppleScript编写InDesign脚本,刚接触ExtendScript与IDJS脚本,属于纯新手。目前拼凑的脚本可运行,但圆角矩形功能失效;已知单独实现圆角的ExtendScript代码,却不知如何整合到现有脚本中,同时希望优化混杂风格的代码,请求指导正确写法。
单独实现圆角的ExtendScript代码示例
var myDoc = app.documents.add(); var rect = myDoc.rectangles.add({ geometricBounds: [0, 0, 45, 90] }); rect.convertShape(ConvertShapeOptions.CONVERT_TO_ROUNDED_RECTANGLE, 8);
现有待整合优化的脚本
let myInDesign = require("indesign"); let app = myInDesign.app; //let myLayer = myDoc.layers.item("Layer 1"); //************* Create Page Size ************* var myDoc = app.documents.add(); with (myDoc.documentPreferences) { pageHeight = "120 mm"; pageWidth = "235 mm"; pagesPerDocument = 1; winHeight = "45 mm"; winWidth = "90 mm"; winInLeft = "20 mm"; winUpBottom = "55 mm"; // up from bottom 20mm // var marginPreferences = app.marginPreferences marginPreferences.bottom = "17mm"; marginPreferences.left = "10mm"; marginPreferences.right = "10mm"; marginPreferences.top = "10mm"; app.activeDocument.zeroPoint = [0, 0]; //************* WINDOW SIZE & POSITION ************* LAYER INDEX 1 windowLayer = "Window"; targetLayer=myDoc.layers.itemByName(windowLayer); myDoc.layers.add ({name:windowLayer}); targetLayer=myDoc.layers.itemByName(windowLayer); var rect =myDoc.rectangles.add({geometricBounds : [0,0,winHeight,winWidth] , strokeColor : myDoc.colors.itemByName("Keyline") , strokeWeight : "0.25" , overprintStroke : true ,}); rect.move([winInLeft, winUpBottom]); rect.convertShape(ConvertShapeOptions.CONVERT_TO_ROUNDED_RECTANGLE, "8"); //************* script stops here. ; //************* ENV SIZE ************* LAYER INDEX 2 keylineLayer = "Keyline"; targetLayer=myDoc.layers.itemByName(keylineLayer); myDoc.layers.add ({name:keylineLayer}); targetLayer=myDoc.layers.itemByName(keylineLayer); var rect =myDoc.rectangles.add({geometricBounds : [0,0,pageHeight,pageWidth] , strokeColor : myDoc.colors.itemByName("Keyline") , strokeWeight : "0.25" , overprintStroke : true ,}); ; //}); }
解决方案
1. 圆角功能失效的核心原因
- 在IDJS(Node.js环境的InDesign脚本)中,
ConvertShapeOptions枚举不是全局变量,需要通过导入的myInDesign对象访问,即myInDesign.ConvertShapeOptions。 - 圆角半径传了字符串
"8",该方法需要数字类型的参数,应改为8。
2. 代码风格优化要点
- 统一变量声明:用
const定义不会修改的变量,let定义需要修改的变量,避免var和let混用。 - 移除
with语句:with会导致作用域混乱,直接通过myDoc.documentPreferences访问属性。 - 优化层创建逻辑:先检查层是否存在,避免重复创建;创建矩形时直接指定
layer属性,无需事后调整。 - 统一缩进:保持一致的缩进(建议2或4空格),提升代码可读性。
- 清理冗余代码:移除多余分号、无效注释和重复的层获取操作。
优化后的完整脚本
const myInDesign = require("indesign"); const app = myInDesign.app; // 文档基础设置 const myDoc = app.documents.add(); const docPrefs = myDoc.documentPreferences; docPrefs.pageHeight = "120 mm"; docPrefs.pageWidth = "235 mm"; docPrefs.pagesPerDocument = 1; // 窗口尺寸与位置参数 const winHeight = "45 mm"; const winWidth = "90 mm"; const winInLeft = "20 mm"; const winUpBottom = "55 mm"; // 边距设置 const marginPrefs = myDoc.marginPreferences; marginPrefs.bottom = "17mm"; marginPrefs.left = "10mm"; marginPrefs.right = "10mm"; marginPrefs.top = "10mm"; // 设置零点 myDoc.zeroPoint = [0, 0]; // 创建或获取Window层 let windowLayer = myDoc.layers.itemByName("Window"); if (windowLayer.isValid === false) { windowLayer = myDoc.layers.add({ name: "Window" }); } // 创建带圆角的窗口矩形 const windowRect = myDoc.rectangles.add({ geometricBounds: [0, 0, winHeight, winWidth], strokeColor: myDoc.colors.itemByName("Keyline"), strokeWeight: "0.25", overprintStroke: true, layer: windowLayer }); windowRect.move([winInLeft, winUpBottom]); // 转换为圆角矩形(修复枚举引用和参数类型) windowRect.convertShape( myInDesign.ConvertShapeOptions.CONVERT_TO_ROUNDED_RECTANGLE, 8 ); // 创建或获取Keyline层 let keylineLayer = myDoc.layers.itemByName("Keyline"); if (keylineLayer.isValid === false) { keylineLayer = myDoc.layers.add({ name: "Keyline" }); } // 创建文档边界矩形 myDoc.rectangles.add({ geometricBounds: [0, 0, docPrefs.pageHeight, docPrefs.pageWidth], strokeColor: myDoc.colors.itemByName("Keyline"), strokeWeight: "0.25", overprintStroke: true, layer: keylineLayer });
关键修改说明
- 用
myInDesign.ConvertShapeOptions替代全局的ConvertShapeOptions,适配IDJS模块环境。 - 圆角半径改为数字
8,符合方法参数要求。 - 新增层存在性检查,避免重复创建同名层。
- 创建矩形时直接指定
layer属性,简化逻辑。 - 拆分
with语句中的属性设置,让代码更清晰。
内容的提问来源于stack exchange,提问作者Budgie
相关产品推荐
相关产品推荐

