Photoshop脚本:查找并替换字体

很遗憾Photoshop没有Illustrator和InDesign里的“查找字体”功能,因此如想一次性替换Photoshop中的字体,需要先选择所有对应的文字图层,还是比较麻烦的。

因此本人制作了一个小脚本,可以显示当前文档中所有字体的Postscript名称(不是Photoshop里显示的名称,但可能接近),并允许你将其中一种字体替换为另一种字体。

使用方法

包含代码的文件(右键或打开后保存):ReplaceFonts.txt

  1. 下载上面的文件,或复制文章末尾的代码,将文件后缀名改为.jsx。
  2. 打开Photoshop,打开一个带文字图层的文件。
  3. 点击文件→脚本→浏览,找到刚才的文件打开。
  4. 在弹出的第1个对话框中,可以在中括号里看到所有当前字体的Postscript代码,在输入框里输入你想替换的那个;需要根据代码推断原字体名称,比如宋体是SimSun。输入完毕后点击按钮。
  5. 在弹出的第2个对话框中,输入另一个字体的Postscript代码。你可能无法知道另一个字体代码,因此建议先新建一个文字图层,改为你想要的字体,这样它的代码就能被显示出来了。
  6. 再次点击按钮,完成替换。

对应脚本

// 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',);
}

微信打赏支付宝打赏

感谢您的支持!

文章来源:卡米雷特的小站www.kamilet.cn)转载请注明出处。

卡米雷特

视觉控&技术控,不断学习中!

您可能还喜欢...

2 条回复

  1. June说道:

    运行后取消。。卡住不动。。。

发表回复

您的电子邮箱地址不会被公开。