166 lines
4.8 KiB
Python
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()
|
|
|