前后端基本架构和完全excel表的解析及统计图表的生成以及excel表的到出
This commit is contained in:
105
backend/app/services/font_helper.py
Normal file
105
backend/app/services/font_helper.py
Normal file
@@ -0,0 +1,105 @@
|
||||
"""
|
||||
字体辅助模块 - 处理中文字体检测和配置
|
||||
"""
|
||||
import matplotlib
|
||||
import matplotlib.font_manager as fm
|
||||
import platform
|
||||
import os
|
||||
from pathlib import Path
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def get_chinese_font() -> str:
|
||||
"""
|
||||
获取可用的中文字体
|
||||
|
||||
Returns:
|
||||
str: 可用的中文字体名称
|
||||
"""
|
||||
# 获取系统中所有可用字体
|
||||
available_fonts = set([f.name for f in fm.fontManager.ttflist])
|
||||
|
||||
# 定义字体优先级列表
|
||||
# Windows 优先
|
||||
if platform.system() == 'Windows':
|
||||
font_list = [
|
||||
'Microsoft YaHei', # 微软雅黑
|
||||
'SimHei', # 黑体
|
||||
'SimSun', # 宋体
|
||||
'KaiTi', # 楷体
|
||||
'FangSong', # 仿宋
|
||||
'STXihei', # 华文细黑
|
||||
'STKaiti', # 华文楷体
|
||||
'STSong', # 华文宋体
|
||||
'STFangsong', # 华文仿宋
|
||||
]
|
||||
# macOS 优先
|
||||
elif platform.system() == 'Darwin':
|
||||
font_list = [
|
||||
'PingFang SC', # 苹方-简
|
||||
'PingFang TC', # 苹方-繁
|
||||
'Heiti SC', # 黑体-简
|
||||
'Heiti TC', # 黑体-繁
|
||||
'STHeiti', # 华文黑体
|
||||
'STSong', # 华文宋体
|
||||
'STKaiti', # 华文楷体
|
||||
'Arial Unicode MS', # Arial Unicode MS
|
||||
]
|
||||
# Linux 优先
|
||||
else:
|
||||
font_list = [
|
||||
'Noto Sans CJK SC', # Noto Sans CJK 简体中文
|
||||
'WenQuanYi Micro Hei', # 文泉驿微米黑
|
||||
'AR PL UMing CN', # AR PL UMing
|
||||
'AR PL UKai CN', # AR PL UKai
|
||||
'ZCOOL XiaoWei', # ZCOOL 小薇
|
||||
]
|
||||
|
||||
# 通用备选字体
|
||||
font_list.extend([
|
||||
'SimHei',
|
||||
'Microsoft YaHei',
|
||||
'Arial Unicode MS',
|
||||
'Droid Sans Fallback',
|
||||
])
|
||||
|
||||
# 查找第一个可用的字体
|
||||
for font_name in font_list:
|
||||
if font_name in available_fonts:
|
||||
logger.info(f"找到中文字体: {font_name}")
|
||||
return font_name
|
||||
|
||||
# 如果没找到,尝试获取第一个中文字体
|
||||
for font in fm.fontManager.ttflist:
|
||||
if 'CJK' in font.name or 'SC' in font.name or 'TC' in font.name:
|
||||
logger.info(f"使用找到的中文字体: {font.name}")
|
||||
return font.name
|
||||
|
||||
# 最终备选:使用系统默认字体
|
||||
logger.warning("未找到合适的中文字体,使用默认字体")
|
||||
return 'sans-serif'
|
||||
|
||||
|
||||
def configure_matplotlib_fonts():
|
||||
"""
|
||||
配置 matplotlib 的字体设置
|
||||
"""
|
||||
chinese_font = get_chinese_font()
|
||||
|
||||
# 配置字体
|
||||
matplotlib.rcParams['font.sans-serif'] = [chinese_font]
|
||||
matplotlib.rcParams['axes.unicode_minus'] = False
|
||||
matplotlib.rcParams['figure.dpi'] = 100
|
||||
matplotlib.rcParams['savefig.dpi'] = 120
|
||||
|
||||
# 字体大小设置
|
||||
matplotlib.rcParams['font.size'] = 10
|
||||
matplotlib.rcParams['axes.labelsize'] = 10
|
||||
matplotlib.rcParams['axes.titlesize'] = 11
|
||||
matplotlib.rcParams['xtick.labelsize'] = 9
|
||||
matplotlib.rcParams['ytick.labelsize'] = 9
|
||||
matplotlib.rcParams['legend.fontsize'] = 9
|
||||
|
||||
logger.info(f"配置完成,使用字体: {chinese_font}")
|
||||
return chinese_font
|
||||
Reference in New Issue
Block a user