Adobe InDesign字体枚举替换脚本故障排查求助
InDesign脚本:批量替换指定字体文本为唯一编号(解决多字体匹配失败问题)
问题分析
原脚本仅能匹配1种字体,其余24种匹配失败,核心原因包括:
- 初始未完全重置查找/替换偏好,残留设置干扰后续匹配
document.fonts会包含文档中未实际使用的字体,导致遍历无效目标- 缺失字体在InDesign中以
[?]字体名形式存在,直接用appliedFont匹配会失败 - 未处理文本框内混合字体的场景
修正后脚本
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
相关产品推荐
相关产品推荐

