import os
import sys
import json
from fontTools.ttLib import TTFont
from tkinter import messagebox
# python E:\psdfontDir\testFont.py
# 定义包含可执行文件或脚本的目录
Json_config_directory = os.path.dirname(os.path.abspath(sys.executable if getattr(sys, 'frozen', False) else __file__))
# 字体信息字典,用于存储每个字体的详细信息
font_info_dict = {}
def load_fonts_from_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.lower().endswith('.ttf'):
try:
font_path = os.path.join(root, file)
font = TTFont(font_path)
postscript_names = set() # 使用集合避免重复
chinese_names = set()
for record in font['name'].names:
name_id = record.nameID
name_value = record.toUnicode().strip()
if name_id == 1: # Font Family name
if record.langID in (0x0804, 20527, 0x0807, 0x0809, 0x080A, 0x080C, 0x080D): # IDs for Chinese languages
chinese_names.add(name_value)
elif name_id == 6: # Postscript name
postscript_names.add(name_value.replace(" ", "")) # 去掉空格并转换为大写
# 如果没有找到中文名,则使用目录名
if not chinese_names:
chinese_names.add(os.path.basename(os.path.dirname(font_path)) or next(iter(postscript_names), ""))
# 将所有组合添加到字典中
for postscript_name in postscript_names:
for chinese_name in chinese_names:
font_info_dict[postscript_name] = chinese_name
print(f"Loaded font: Postscript Name - {postscript_name}, Chinese Name - {chinese_name}")
except Exception as e:
print(f"Failed to load font from {file}: {e}")
# 定义字体目录路径
fonts_directory = os.path.join(Json_config_directory, "字体")
if os.path.exists(fonts_directory):
load_fonts_from_directory(fonts_directory)
else:
print(f"Fonts directory {fonts_directory} does not exist.")
# 如果没有加载任何字体,则显示错误信息
if not font_info_dict:
messagebox.showerror("错误", f"字体映射配置文件有误或为空:{fonts_directory}")
sys.exit(1)
# 将字体信息保存到JSON文件
font_info_json_path = os.path.join(Json_config_directory, "font_info.json")
with open(font_info_json_path, 'w', encoding='utf-8') as f:
json.dump(font_info_dict, f, ensure_ascii=False, indent=4)
print(f"Font information saved to {font_info_json_path}")