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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:44:55