Найдите имена постскриптов всех установленных шрифтов - PullRequest
6 голосов
/ 07 апреля 2011

Мне нужно перечислить имена постскриптов всех установленных шрифтов.

например:

        foreach (FontFamily item in FontFamily.Families)
        {
            listBox1.Items.Add(item.Name);
        }

Это даст только фактические имена шрифтов.Но мне нужно найти имена постскриптов.

Например: для шрифта "Arial Black" - 1. Фактическое имя шрифта - "Arial Black" 2. Имя PostScript - "Arial-Black"

Заранее спасибо, Джеймс


РЕДАКТИРОВАТЬ:

  1. @ plinth На самом деле я читаю название шрифта из PDF и загружаю соответствующий системный шрифт,В этом случае PDF-файл имеет имя шрифта «Arial-Black» (имя сценария Post) .. как я могу загрузить шрифт из системы (Arial Black) соответственно .... ideas ??

Таким образом, идеальным методом должно быть чтение имен постскриптов из установленных шрифтов

  1. Замена '-' на '' не является подходящим решением, потому что существуют возможности других имен шрифтов, таких как "Arial-Bold »,« Time New Roman - PSMT »и др.

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

Вы можете сделать это прямо в PostScript. Выполните это:

%!PS
/FS { findfont exch scalefont setfont } bind def

% gets page boundaries
clippath pathbbox newpath
/var_TopOfPage exch def
/var_RightOfPage exch def
/var_BottomOfPage exch def
/var_LeftOfPage exch def

% helvetica is almost always there
12 /Helvetica FS
0 setgray

% set start position
var_LeftOfPage var_TopOfPage 30 sub moveto
/pos var_TopOfPage 20 sub def

GlobalFontDirectory {
    var_LeftOfPage pos moveto
    /FontName get 70 string cvs show
    /pos pos 20 sub def
    pos 0 le {
        showpage
        /pos var_TopOfPage 20 sub def
    } if
} forall

showpage
%%EOF

Мне удалось найти доступные шрифты принтера с этим кодом.

Надеюсь, я тебе помог.

0 голосов
/ 16 июня 2019

Этот код выводит CSV всех шрифтов, установленных в вашей системе, с именами файлов, именами Windows и Postscript.

Для запуска необходимо установить Photoshop и Python. Перед запуском также оставьте окно Photoshop открытым, чтобы оно могло оттуда получить список шрифтов.

Функция короткого имени была отсюда - https://gist.github.com/pklaus/dce37521579513c574d0

# This program lists all installed fonts on the computer with their font file name, Windows name and Postscript name.

import os
from fontTools import ttLib
from win32com.client import GetActiveObject
import pandas as pd

FONT_SPECIFIER_NAME_ID = 4
FONT_SPECIFIER_FAMILY_ID = 1
list = []
app = GetActiveObject("Photoshop.Application") # Get instance of open Photoshop window
df = pd.DataFrame(columns=['Font File Name', 'Windows Name', 'Postscript Name'])

def shortName(font):
    """Get the short name from the font's names table"""
    name = ""
    family = ""
    for record in font['name'].names:
        if b'\x00' in record.string:
            name_str = record.string.decode('utf-16-be')
        else:
            name_str = record.string.decode('utf-8')
        if record.nameID == FONT_SPECIFIER_NAME_ID and not name:
            name = name_str
        elif record.nameID == FONT_SPECIFIER_FAMILY_ID and not family:
            family = name_str
        if name and family: break
    return name, family

def getPostScriptName(winName):
    for i in range(0, len(app.fonts)):
        if(app.fonts[i].name == winName):
            return app.fonts[i].postScriptName

x = 0
for file in os.listdir(r'C:\Windows\Fonts'):
    if (file.endswith(".ttf") or file.endswith(".otf")):
        try:
            fontfile = file
            file = "C:\\Windows\\Fonts\\" + file
            tt = ttLib.TTFont(file)
            psName = getPostScriptName(shortName(tt)[0])
            print(fontfile, shortName(tt)[0], psName)
            df.at[x, 'Font File Name'] = fontfile
            df.at[x, 'Windows Name'] = shortName(tt)[0]
            df.at[x, 'Postscript Name'] = psName
            x = x + 1
            df.to_csv("installed-fonts.csv",index=False)
        except Exception as e:
            print (e)
            continue
0 голосов
/ 07 апреля 2011

Я сделал нечто очень похожее на это. Вы должны знать, что FontFamily.Families может не быть полным набором доступных шрифтов.

Почему бы просто не заменить '-' на ''?

В моем случае мне нужно было перейти к названию шрифта PDF, которое для Times New Roman, выделенное жирным шрифтом, должно было быть "TimesNewRoman, Bold".

    private static string ToPdfFontName(Font f)
    {
        StringBuilder sb = new StringBuilder();
        StripSpaces(sb, f.Name);
        if ((f.Style & FontStyle.Bold)!= 0 && (f.Style & FontStyle.Italic)!= 0)
        {
            sb.Append(",BoldItalic");
        }
        else if ((f.Style & FontStyle.Bold)!= 0) 
        {
            sb.Append(",Bold");
        }
        else if ((f.Style & FontStyle.Italic)!= 0) 
        {
            sb.Append(",Italic");
        }
        return sb.ToString();
    }
...