Skip to main content

基础使用

安装

python.exe -m pip install 

用例

获取字体的show_name信息

# -*- coding: utf-8 -*-
#
# @Author: CPS
# @email: 373704015@qq.com
# @Date:
# @Last Modified by: CPS
# @Last Modified time: 2022-07-27 17:42:42.055123
# @file_path "W:\CPS\MyProject\test"
# @Filename "ps_test.py"
# @Description: 功能描述
#


import os, sys

sys.path.append("..")
from os import path

from fontTools.ttLib import TTFont
import xml.etree.ElementTree as ET


class FoundError(Exception):
pass


def find_show_name_from_xml(xml_data: ET.Element) -> str:
"""
解析通过`TTFont(font_path).saveXML()`导出的字体xml文件,
匹配第一次:`<namerecord nameID="1" platformID="1">`
匹配第二次:`<namerecord nameID="1">`

- param xml_data :{ElementTree} 通过:`xml.etree.ElementTree.parse(font_xml_path)`获取到的xml对象

"""
font_name = ""
try:
for name_item in xml_data.findall("name"):
namerecords = name_item.findall("namerecord")
check_text = ""
for each_t in namerecords:
if (
each_t.attrib["nameID"] == "1"
and each_t.attrib["platformID"] == "1"
):
check_text = str(each_t.text).strip()

elif each_t.attrib["nameID"] == "1":
check_text = str(each_t.text).strip()

# 检查获取到的内容是否合法
if check_text != "":
font_name = check_text
raise FoundError()

except FoundError:
return font_name
else:
return ""


def read_xml(xml_file_path: str) -> ET.Element:
"""
解析xml文件,返回tree形式的可遍历对象

@returns `{ ET.Element}`

"""
try:
# 读取xml
font_xml_obj = ET.parse(xml_file_path)
root_element = font_xml_obj.getroot()
return root_element
except Exception as e:
print("read_xml: fail", e)
return None


# 默认支持的后缀名
DEFAULT_EXCLUDE_EXT = [".otf", ".ttf"]


def get_font_show_name(font_path: str, exclude_ext: list[str] = list()) -> str:
"""
获取字体文件的show_name

- param font_path :{str} 字体文件绝对路径
- param exclude_ext=list() :{list[str]} 字体的后缀,默认:`[".otf", ".ttf"]`

@returns `{str}` 查找失败返回空字符串`""`
@example
```python
font_dir = r"D:/CPS/MyProject/Project_Outside/PSD文件解析/psd-tool/data/fonts"
for font_name in os.listdir(font_dir):
res = get_font_show_name(os.path.join(font_dir, font_name))
if res:
print(f"font: {font_name} => show_name: {res}")
```
"""
# 过滤不支持的字体文件
global DEFAULT_EXCLUDE_EXT
exclude_ext += DEFAULT_EXCLUDE_EXT
name, ext = os.path.splitext(font_path)
if not ext in exclude_ext:
return ""

font_dir = path.dirname(font_path)
font_xml_path = path.join(font_dir, f"{path.splitext(font_path)[0]}.xml")
# 判断xml文件是否存在,不存在则创建
if not path.exists(font_xml_path):
t = TTFont(font_path)
t.saveXML(font_xml_path)

# 读取xml文件
get_xml_data = read_xml(font_xml_path)
if get_xml_data:
# 解析xml文件,获取show_name
font_show_name = find_show_name_from_xml(get_xml_data)
return font_show_name


if __name__ == "__main__":
font_dir = r"D:/CPS/MyProject/Project_Outside/PSD文件解析/psd-tool/data/fonts"
for font_name in os.listdir(font_dir):
res = get_font_show_name(os.path.join(font_dir, font_name))
if res:
print(f"font: {font_name} => show_name: {res}")