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

Adobe InDesign字体枚举替换脚本故障排查求助

InDesign脚本:批量替换指定字体文本为唯一编号(解决多字体匹配失败问题)

问题分析

原脚本仅能匹配1种字体,其余24种匹配失败,核心原因包括:

  1. 初始未完全重置查找/替换偏好,残留设置干扰后续匹配
  2. document.fonts会包含文档中未实际使用的字体,导致遍历无效目标
  3. 缺失字体在InDesign中以[?]字体名形式存在,直接用appliedFont匹配会失败
  4. 未处理文本框内混合字体的场景

修正后脚本

var doc = app.activeDocument;
var usedFonts = {}; // 存储文档中实际使用的字体(去重)
var fontIndex = 0;
var fontList = "已处理字体列表:\n";

// 1. 遍历所有文本框,收集实际使用的字体
var allTextFrames = doc.textFrames.everyItem().getElements();
for (var i = 0; i < allTextFrames.length; i++) {
    var textFrame = allTextFrames[i];
    if (!textFrame.parentStory || textFrame.parentStory.contents.length === 0) continue;
    
    var paragraphs = textFrame.parentStory.paragraphs.everyItem().getElements();
    for (var p = 0; p < paragraphs.length; p++) {
        var chars = paragraphs[p].characters.everyItem().getElements();
        for (var c = 0; c < chars.length; c++) {
            var font = chars[c].appliedFont;
            if (!font) continue;
            
            var fontName = font.toString();
            // 处理缺失字体:去除[?]标识
            if (fontName.includes("[?]")) {
                fontName = fontName.replace(/\[?\]/g, "");
            }
            usedFonts[fontName] = font;
        }
    }
}

// 2. 重置查找/替换偏好,清除残留设置
app.findGrepPreferences = NothingEnum.NOTHING;
app.changeGrepPreferences = NothingEnum.NOTHING;

// 3. 遍历实际使用的字体,替换文本为唯一编号
for (var fontName in usedFonts) {
    fontIndex++;
    var targetFont = usedFonts[fontName];
    var replaceText = fontIndex.toString();

    // 设置查找规则
    if (targetFont.toString().includes("[?]")) {
        // 缺失字体:用字体名称模糊匹配所有文本
        app.findGrepPreferences.findWhat = ".+";
        app.findGrepPreferences.fontName = fontName;
    } else {
        // 正常字体:直接匹配应用该字体的文本
        app.findGrepPreferences.appliedFont = targetFont;
    }

    // 设置替换内容
    app.changeGrepPreferences.changeTo = replaceText;

    // 执行替换并记录结果
    var changeCount = doc.changeGrep().length;
    fontList += `${fontIndex} : ${fontName} : 替换数量 ${changeCount}\n`;

    // 重置偏好,避免影响下一次循环
    app.findGrepPreferences = NothingEnum.NOTHING;
    app.changeGrepPreferences = NothingEnum.NOTHING;
}

// 输出结果
alert(fontList);

关键修复说明

  • 收集实际使用的字体:遍历所有文本框的字符,只保留真正被应用的字体,避免无效遍历
  • 缺失字体处理:自动识别带[?]的缺失字体,去除标识后用fontName匹配,解决手动能替换但脚本失败的问题
  • 严格重置偏好:每次循环前后清空查找/替换设置,防止前一次的条件残留干扰
  • 混合字体兼容:逐字符检查字体,即使文本框内混合多种字体也能正确匹配替换

注意事项

  • 若存在全角/半角字体名称差异,可在字体名称处理环节添加fontName = fontName.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) - 65248); });统一为半角
  • 替换后的编号按字体首次出现顺序分配,可直接用于制作字体对照手册

内容的提问来源于stack exchange,提问作者user3794479

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:17:46