Files
aiagents-stock/test_pdf_fonts.py
T
2025-10-10 17:07:21 +08:00

166 lines
4.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PDF中文字体测试脚本
用于验证Docker环境中字体是否正确安装
"""
import os
import sys
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
def check_system_fonts():
"""检查系统中可用的中文字体"""
print("=" * 60)
print("检查系统中的中文字体")
print("=" * 60)
# Windows字体路径
windows_paths = [
'C:/Windows/Fonts/simsun.ttc',
'C:/Windows/Fonts/simhei.ttf',
'C:/Windows/Fonts/msyh.ttc',
'C:/Windows/Fonts/msyh.ttf',
]
# Linux字体路径
linux_paths = [
'/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',
'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc',
'/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
'/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc',
]
all_paths = windows_paths + linux_paths
found_fonts = []
for font_path in all_paths:
if os.path.exists(font_path):
print(f"✅ 找到字体: {font_path}")
found_fonts.append(font_path)
else:
print(f"❌ 未找到: {font_path}")
print(f"\n总计找到 {len(found_fonts)} 个中文字体文件")
return found_fonts
def test_font_registration():
"""测试字体注册"""
print("\n" + "=" * 60)
print("测试字体注册")
print("=" * 60)
fonts = check_system_fonts()
if not fonts:
print("\n❌ 错误:未找到任何中文字体")
print("建议:")
print(" - Windows: 确保系统已安装中文字体")
print(" - Linux/Docker: 运行 'apt-get install fonts-noto-cjk fonts-wqy-zenhei'")
return False
# 尝试注册第一个找到的字体
test_font = fonts[0]
try:
pdfmetrics.registerFont(TTFont('TestChineseFont', test_font))
print(f"\n✅ 成功注册字体: {test_font}")
print(f" 注册名称: TestChineseFont")
return True
except Exception as e:
print(f"\n❌ 字体注册失败: {e}")
return False
def test_pdf_generation():
"""测试PDF生成"""
print("\n" + "=" * 60)
print("测试PDF生成")
print("=" * 60)
try:
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import ParagraphStyle
import io
# 导入字体注册函数
from pdf_generator import register_chinese_fonts
# 注册字体
font_name = register_chinese_fonts()
print(f"\n使用字体: {font_name}")
# 创建测试PDF
buffer = io.BytesIO()
doc = SimpleDocTemplate(buffer, pagesize=A4)
# 创建样式
style = ParagraphStyle(
'TestStyle',
fontName=font_name,
fontSize=12
)
# 创建内容
test_text = "这是一个中文PDF测试 - AI股票分析系统"
paragraph = Paragraph(test_text, style)
# 生成PDF
doc.build([paragraph])
# 检查生成的PDF大小
pdf_size = len(buffer.getvalue())
print(f"✅ PDF生成成功,大小: {pdf_size} 字节")
# 保存测试PDF
with open('test_chinese_pdf.pdf', 'wb') as f:
f.write(buffer.getvalue())
print(f"✅ 测试PDF已保存到: test_chinese_pdf.pdf")
print(f" 请打开文件检查中文是否正常显示")
return True
except Exception as e:
print(f"❌ PDF生成失败: {e}")
import traceback
traceback.print_exc()
return False
def main():
"""主函数"""
print("\n")
print("╔" + "=" * 58 + "╗")
print("║" + " " * 15 + "PDF中文字体测试" + " " * 15 + "║")
print("╚" + "=" * 58 + "╝")
print()
# 检测操作系统
import platform
print(f"操作系统: {platform.system()} {platform.release()}")
print(f"Python版本: {sys.version}")
print()
# 运行测试
font_check = check_system_fonts()
font_reg = test_font_registration()
pdf_gen = test_pdf_generation()
# 总结
print("\n" + "=" * 60)
print("测试总结")
print("=" * 60)
print(f"字体检查: {'✅ 通过' if font_check else '❌ 失败'}")
print(f"字体注册: {'✅ 通过' if font_reg else '❌ 失败'}")
print(f"PDF生成: {'✅ 通过' if pdf_gen else '❌ 失败'}")
if font_check and font_reg and pdf_gen:
print("\n🎉 所有测试通过!PDF中文字体配置正确。")
else:
print("\n⚠️ 部分测试失败,请查看上方详细信息进行排查。")
print()
if __name__ == "__main__":
main()