如何通过代码检测Adobe Illustrator中奥斯曼书法路径的阿拉伯字符宽度?
在Adobe Illustrator中切割奥斯曼书法阿拉伯字符路径
我有大量奥斯曼书法布局的阿拉伯文字原生路径(非转曲文本),已知路径对应的每个字符内容,但字符尺寸随单词布局变化,需要通过代码检测每个字符宽度,以「起始位置+当前字符宽度」为切割点,将路径分割为单个字符的独立路径。
核心思路
利用Adobe Illustrator的ExtendScript(JavaScript)API,获取路径的几何边界或锚点坐标,结合已知的字符序列计算每个字符的宽度,再执行路径切割操作:
- 获取目标路径的几何边界,计算单字符路径的宽度;
- 若为连笔的整体路径,根据字符宽度确定x轴切割位置,拆分锚点得到单字符子路径;
- 批量处理所有书法路径,实现自动切割分离。
代码实现(ExtendScript/JavaScript)
1. 计算字符宽度与切割位置
// Adobe Illustrator 脚本:计算字符宽度与切割位置 var doc = app.activeDocument; var selectedPaths = doc.selection; var charWidths = []; var cutPositions = []; // 初始化起始位置(取第一个选中路径的左边界) var startX = selectedPaths[0].geometricBounds[0]; // 遍历选中路径,计算每个字符宽度与切割位置 for (var i = 0; i < selectedPaths.length; i++) { var path = selectedPaths[i]; var bounds = path.geometricBounds; // 宽度 = 右边界坐标 - 左边界坐标 var charWidth = bounds[2] - bounds[0]; charWidths.push(charWidth); // 计算切割位置 var cutPos = startX + charWidth; cutPositions.push(cutPos); // 更新下一个字符的起始位置 startX = cutPos; } // 输出结果(可替换为写入文件等逻辑) $.writeln("字符宽度列表:" + charWidths.join(", ")); $.writeln("切割位置列表:" + cutPositions.join(", "));
2. 切割连笔整体路径
如果书法是单条连笔路径,可通过锚点位置判断实现切割:
// 按x坐标切割路径的工具函数 function splitPathByX(targetPath, splitX) { var anchors = targetPath.pathPoints; var splitIndex = -1; // 找到第一个x坐标大于等于切割位置的锚点 for (var j = 0; j < anchors.length; j++) { if (anchors[j].anchor[0] >= splitX) { splitIndex = j; break; } } if (splitIndex === -1) return null; // 复制原路径作为后半部分 var newPath = targetPath.duplicate(); // 删除原路径的后半段锚点 for (var k = anchors.length - 1; k >= splitIndex; k--) { targetPath.pathPoints[k].remove(); } // 删除新路径的前半段锚点 for (var m = splitIndex - 1; m >= 0; m--) { newPath.pathPoints[m].remove(); } return newPath; } // 批量切割单条连笔路径 if (selectedPaths.length === 1) { var mainPath = selectedPaths[0]; var currentStart = mainPath.geometricBounds[0]; // 假设charWidths是预先计算好的字符宽度数组 for (var n = 0; n < charWidths.length; n++) { var cutX = currentStart + charWidths[n]; splitPathByX(mainPath, cutX); currentStart = cutX; } }
注意事项
- 奥斯曼书法的连笔路径包含大量曲线锚点,上述切割函数为基础实现,需根据实际锚点分布优化曲线分割逻辑;
- 若字符路径被群组,需先执行
groupItem.ungroup()解组后再处理; - 可将已知字符序列与计算的宽度关联,存储为JSON文件,方便后续批量调用。
相关图示
- 图1:奥斯曼书法阿拉伯文字的整体路径布局
- 图2:单个字符路径的细节展示
- 图3:路径锚点的分布情况
- 图4:切割后单个字符的独立路径效果
内容的提问来源于stack exchange,提问作者Ali Tleiss
相关产品推荐
相关产品推荐

