Photoshop脚本:查找并替换字体
很遗憾Photoshop没有Illustrator和InDesign里的“查找字体”功能,因此如想一次性替换Photoshop中的字体,需要先选择所有对应的文字图层,还是比较麻烦的。
因此本人制作了一个小脚本,可以显示当前文档中所有字体的Postscript名称(不是Photoshop里显示的名称,但可能接近),并允许你将其中一种字体替换为另一种字体。
使用方法
包含代码的文件(右键或打开后保存):ReplaceFonts.txt
- 下载上面的文件,或复制文章末尾的代码,将文件后缀名改为.jsx。
- 打开Photoshop,打开一个带文字图层的文件。
- 点击文件→脚本→浏览,找到刚才的文件打开。
- 在弹出的第1个对话框中,可以在中括号里看到所有当前字体的Postscript代码,在输入框里输入你想替换的那个;需要根据代码推断原字体名称,比如宋体是SimSun。输入完毕后点击按钮。
- 在弹出的第2个对话框中,输入另一个字体的Postscript代码。你可能无法知道另一个字体代码,因此建议先新建一个文字图层,改为你想要的字体,这样它的代码就能被显示出来了。
- 再次点击按钮,完成替换。
对应脚本
// Enhanced by Kamilet From Kamilet.cn
// List and Replace Fonts in Photoshop
// Original Script by frontendbeast:
// https://github.com/frontendbeast/list-fonts/
var refPSD = new ActionReference();
function arrayUnique(a){
var temp = []
i = a.length;
// ExtendScript has no indexOf function
while(i--) {
var found = false,
n = temp.length;
while (n--) {
if(a[i] === temp[n]) {
found = true;
}
}
if(!found) {
temp.push(a[i]);
}
}
return temp;
}
function findFonts() {
refPSD.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
// Get layers from PSD
var countLayers = executeActionGet(refPSD).getInteger(charIDToTypeID('NmbL'))+1,
fonts = [];
// Loop through each layer
while(countLayers--) {
var refLayer = new ActionReference(),
descLayer,
layerStyles,
countStyles;
refLayer.putIndex( charIDToTypeID( 'Lyr ' ), countLayers );
// Catch error when no backgroundLayer is present
try {
descLayer = executeActionGet(refLayer);
} catch (e) {
continue;
}
// Only proceed if text layer
if(!descLayer.hasKey(stringIDToTypeID( 'textKey' ))) continue;
// Get list of styles (in case of multiple fonts in a text layer)
layerStyles = descLayer.getObjectValue(stringIDToTypeID('textKey')).getList(stringIDToTypeID('textStyleRange'));
countStyles = layerStyles.count;
// Loop through each style and get the font name
while(countStyles--) {
try {
var fontName = layerStyles.getObjectValue(countStyles).getObjectValue(stringIDToTypeID('textStyle')).getString(stringIDToTypeID('fontPostScriptName'));
fonts.push(fontName);
} catch (e) {
continue;
}
}
}
// Return a unique and sorted array of font names
return arrayUnique(fonts).sort();
}
function replaceFont(target,fontToReplace,replacementFont)
{
var layers = target.layers;
for (var i = 0; i < layers.length; i++) {
if (layers[i].typename == "LayerSet") {
replaceFont(layers[i]);
} else if (layers[i].kind == LayerKind.TEXT) {
if (layers[i].textItem.font == fontToReplace) {
layers[i].textItem.font = replacementFont;
}
};
};
};
if (documents.length) {
var fontsFound = findFonts();
//alert(fontsFound.length +' fonts found \n'+fontsFound.join('\n'));
var fontToReplace = prompt(fontsFound.length+" Fonts Fond: \[ "+fontsFound.join(' | ')+" \ :","\(One Font Code Above\)","Next");
var replacementFont = prompt("\[ "+fontsFound.join(' | ')+" \] Replace with:","\(One Font Code Above\)","Do it!");
//show font names and replace by Kamilet from Kamilet.cn
var doc = app.activeDocument;
replaceFont(doc,fontToReplace,replacementFont);
} else {
alert('No fonts found \nOpen a PSD before running this script',);
}
运行后取消。。卡住不动。。。
请问下软件版本?我是在cs6下编写测试的,没试过其他版本。