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:
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")
if not path.exists(font_xml_path):
t = TTFont(font_path)
t.saveXML(font_xml_path)
get_xml_data = read_xml(font_xml_path)
if get_xml_data:
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}")