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

如何通过代码检测Adobe Illustrator中奥斯曼书法路径的阿拉伯字符宽度?

在Adobe Illustrator中切割奥斯曼书法阿拉伯字符路径

我有大量奥斯曼书法布局的阿拉伯文字原生路径(非转曲文本),已知路径对应的每个字符内容,但字符尺寸随单词布局变化,需要通过代码检测每个字符宽度,以「起始位置+当前字符宽度」为切割点,将路径分割为单个字符的独立路径。

核心思路

利用Adobe Illustrator的ExtendScript(JavaScript)API,获取路径的几何边界或锚点坐标,结合已知的字符序列计算每个字符的宽度,再执行路径切割操作:

  1. 获取目标路径的几何边界,计算单字符路径的宽度;
  2. 若为连笔的整体路径,根据字符宽度确定x轴切割位置,拆分锚点得到单字符子路径;
  3. 批量处理所有书法路径,实现自动切割分离。

代码实现(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:53:19