diff --git a/ReportEngine/renderers/pdf_renderer.py b/ReportEngine/renderers/pdf_renderer.py index 8944f7e..75079e0 100644 --- a/ReportEngine/renderers/pdf_renderer.py +++ b/ReportEngine/renderers/pdf_renderer.py @@ -422,8 +422,8 @@ class PDFRenderer: # 格式: canvas_pattern = rf']+data-config-id="{re.escape(config_id)}"[^>]*>' - # 替换canvas为SVG - html = re.sub(canvas_pattern, svg_html, html) + # 【修复】替换canvas为SVG,使用lambda避免反斜杠转义问题 + html = re.sub(canvas_pattern, lambda m: svg_html, html) logger.debug(f"已替换图表 {widget_id} 的canvas为SVG") else: logger.warning(f"未找到图表 {widget_id} 对应的配置脚本") @@ -468,7 +468,10 @@ class PDFRenderer: # 暂时使用简单的替换方案 # 找到第一个math-block div并替换 math_block_pattern = r'
\$\$[^$]*\$\$
' - html = re.sub(math_block_pattern, svg_html, html, count=1) + # 【修复】转义svg_html中的反斜杠,避免re.sub将其解释为转义序列 + # 使用re.escape处理替换字符串中的特殊字符 + escaped_svg_html = svg_html.replace('\\', r'\\') + html = re.sub(math_block_pattern, lambda m: svg_html, html, count=1) logger.debug(f"已替换公式 {math_id} 为SVG") return html diff --git a/export_pdf.py b/export_pdf.py new file mode 100644 index 0000000..756d2dd --- /dev/null +++ b/export_pdf.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +""" +PDF导出脚本 +""" +import json +import os +import sys +from datetime import datetime +from pathlib import Path + +# 添加项目路径到sys.path +sys.path.insert(0, '/Users/mayiding/Desktop/GitMy/BettaFish') + +def export_pdf(ir_file_path): + """导出PDF""" + try: + # 读取IR文件 + print(f"正在读取报告文件: {ir_file_path}") + with open(ir_file_path, 'r', encoding='utf-8') as f: + document_ir = json.load(f) + + # 导入PDF渲染器 + from ReportEngine.renderers.pdf_renderer import PDFRenderer + + # 创建PDF渲染器 + print("正在初始化PDF渲染器...") + renderer = PDFRenderer() + + # 生成PDF + print("正在生成PDF...") + pdf_bytes = renderer.render_to_bytes(document_ir, optimize_layout=True) + + # 确定输出文件名 + topic = document_ir.get('metadata', {}).get('topic', 'report') + output_dir = Path('/Users/mayiding/Desktop/GitMy/BettaFish/final_reports/pdf') + output_dir.mkdir(parents=True, exist_ok=True) + + pdf_filename = f"report_{topic}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf" + output_path = output_dir / pdf_filename + + # 保存PDF文件 + print(f"正在保存PDF到: {output_path}") + with open(output_path, 'wb') as f: + f.write(pdf_bytes) + + print(f"✅ PDF导出成功!") + print(f"文件位置: {output_path}") + print(f"文件大小: {len(pdf_bytes) / 1024 / 1024:.2f} MB") + + return str(output_path) + + except Exception as e: + print(f"❌ PDF导出失败: {str(e)}") + import traceback + traceback.print_exc() + return None + +if __name__ == "__main__": + # 使用最新的报告文件 + latest_report = "/Users/mayiding/Desktop/GitMy/BettaFish/final_reports/ir/report_ir_人工智能行情发展走势_20251119_235407.json" + + if os.path.exists(latest_report): + print("="*50) + print("开始导出PDF") + print("="*50) + result = export_pdf(latest_report) + if result: + print(f"\n📄 PDF文件已生成: {result}") + else: + print(f"❌ 报告文件不存在: {latest_report}") \ No newline at end of file