Modify the Logic for "Export as PDF"

This commit is contained in:
马一丁
2025-11-18 20:10:11 +08:00
parent acfe77a326
commit 5e82185bee
7 changed files with 1087 additions and 62 deletions
+137
View File
@@ -1008,3 +1008,140 @@ def clear_log():
'success': False,
'error': f'清空日志失败: {str(e)}'
}), 500
@report_bp.route('/export/pdf/<task_id>', methods=['GET'])
def export_pdf(task_id: str):
"""
导出报告为PDF格式。
从IR JSON文件生成优化的PDF,支持自动布局调整。
参数:
task_id: 任务ID
查询参数:
optimize: 是否启用布局优化(默认true)
返回:
Response: PDF文件流或错误信息
"""
try:
# 获取任务信息
task = tasks_registry.get(task_id)
if not task:
return jsonify({
'success': False,
'error': '任务不存在'
}), 404
# 检查任务是否完成
if task.status != 'completed':
return jsonify({
'success': False,
'error': f'任务未完成,当前状态: {task.status}'
}), 400
# 获取IR文件路径
if not task.ir_file_path or not os.path.exists(task.ir_file_path):
return jsonify({
'success': False,
'error': 'IR文件不存在'
}), 404
# 读取IR数据
with open(task.ir_file_path, 'r', encoding='utf-8') as f:
document_ir = json.load(f)
# 检查是否启用布局优化
optimize = request.args.get('optimize', 'true').lower() == 'true'
# 创建PDF渲染器并生成PDF
from .renderers import PDFRenderer
renderer = PDFRenderer()
logger.info(f"开始导出PDF,任务ID: {task_id},布局优化: {optimize}")
# 生成PDF字节流
pdf_bytes = renderer.render_to_bytes(document_ir, optimize_layout=optimize)
# 确定下载文件名
topic = document_ir.get('metadata', {}).get('topic', 'report')
pdf_filename = f"report_{topic}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
# 返回PDF文件
return Response(
pdf_bytes,
mimetype='application/pdf',
headers={
'Content-Disposition': f'attachment; filename="{pdf_filename}"',
'Content-Type': 'application/pdf'
}
)
except Exception as e:
logger.exception(f"导出PDF失败: {str(e)}")
return jsonify({
'success': False,
'error': f'导出PDF失败: {str(e)}'
}), 500
@report_bp.route('/export/pdf-from-ir', methods=['POST'])
def export_pdf_from_ir():
"""
从IR JSON直接导出PDF(不需要任务ID)。
适用于前端直接传递IR数据的场景。
请求体:
{
"document_ir": {...}, // Document IR JSON
"optimize": true // 是否启用布局优化(可选)
}
返回:
Response: PDF文件流或错误信息
"""
try:
data = request.get_json()
if not data or 'document_ir' not in data:
return jsonify({
'success': False,
'error': '缺少document_ir参数'
}), 400
document_ir = data['document_ir']
optimize = data.get('optimize', True)
# 创建PDF渲染器并生成PDF
from .renderers import PDFRenderer
renderer = PDFRenderer()
logger.info(f"从IR直接导出PDF,布局优化: {optimize}")
# 生成PDF字节流
pdf_bytes = renderer.render_to_bytes(document_ir, optimize_layout=optimize)
# 确定下载文件名
topic = document_ir.get('metadata', {}).get('topic', 'report')
pdf_filename = f"report_{topic}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
# 返回PDF文件
return Response(
pdf_bytes,
mimetype='application/pdf',
headers={
'Content-Disposition': f'attachment; filename="{pdf_filename}"',
'Content-Type': 'application/pdf'
}
)
except Exception as e:
logger.exception(f"从IR导出PDF失败: {str(e)}")
return jsonify({
'success': False,
'error': f'导出PDF失败: {str(e)}'
}), 500