Files
bettafish-company/ReportEngine/docs/PDF_EXPORT_GUIDE.md
T
2025-11-18 20:11:03 +08:00

310 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PDF导出优化系统使用指南
## 概述
全新的PDF导出系统现已集成到ReportEngine中,提供了智能布局优化功能,确保PDF文档美观且无溢出问题。
## 核心特性
### 1. 智能布局优化
系统会自动分析文档内容并优化布局参数:
- **KPI卡片优化**
- 自动调整每行列数(1-3列)
- 根据数值长度动态调整字号
- 防止数值溢出
- **表格优化**
- 根据列数自动缩小字号
- 智能调整单元格内边距
- 支持长内容自动换行
- **文本优化**
- 检测长文本自动增加行高
- 防止标题孤行
- 优化段落间距
### 2. 配置持久化
所有优化决策都会保存到日志文件中:
- 位置:`logs/pdf_layouts/layout_YYYYMMDD_HHMMSS.json`
- 内容:文档统计信息、优化策略、最终配置
### 3. 前端集成
用户只需点击"下载PDF"按钮,系统将:
1. 自动分析报告内容
2. 应用最佳布局优化
3. 生成高质量PDF
4. 自动下载到本地
## 使用方法
### 方式一:通过Web界面(推荐)
1. 启动系统:`python app.py`
2. 生成报告:在Report Engine中生成最终报告
3. 点击"下载PDF"按钮
4. 系统自动优化并下载PDF
### 方式二:通过API
#### 根据任务ID导出
```bash
curl -X GET \
"http://localhost:5000/api/report/export/pdf/YOUR_TASK_ID?optimize=true" \
-o report.pdf
```
#### 从IR JSON直接导出
```bash
curl -X POST \
"http://localhost:5000/api/report/export/pdf-from-ir" \
-H "Content-Type: application/json" \
-d '{
"document_ir": {...},
"optimize": true
}' \
-o report.pdf
```
### 方式三:通过Python脚本
```python
from pathlib import Path
import json
from ReportEngine.renderers import PDFRenderer
# 读取IR数据
with open('report_ir.json', 'r', encoding='utf-8') as f:
document_ir = json.load(f)
# 创建渲染器并导出PDF
renderer = PDFRenderer()
renderer.render_to_pdf(
document_ir,
'output.pdf',
optimize_layout=True # 启用布局优化
)
```
## 配置选项
### 全局配置
```python
from ReportEngine.renderers import PDFLayoutOptimizer, PDFLayoutConfig
# 自定义配置
config = PDFLayoutConfig(
page=PageLayout(
font_size_base=14,
line_height=1.6
),
kpi_card=KPICardLayout(
font_size_value=32,
min_height=120
),
# ... 更多配置
)
# 使用自定义配置
optimizer = PDFLayoutOptimizer(config)
renderer = PDFRenderer(layout_optimizer=optimizer)
```
### 优化策略
| 场景 | 触发条件 | 优化措施 |
|------|---------|---------|
| KPI数量多 | > 6个 | 调整为3列布局 |
| KPI数量少 | ≤ 2个 | 调整为1列布局 |
| KPI数值长 | > 10字符 | 字号从32px调整为28px |
| KPI数值很长 | > 15字符 | 字号从32px调整为24px |
| 表格列多 | > 6列 | 字号从13/12px调整为11/10px |
| 文本很长 | > 200字符 | 行高从1.6增加到1.8 |
## 测试
运行测试脚本验证所有功能:
```bash
# 设置环境变量
export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH
# 运行测试
python test_pdf_optimized.py
```
测试将生成:
- `test_pdf_optimized.pdf` - 启用优化的PDF
- `test_pdf_default.pdf` - 默认设置的PDF(对比)
- `test_layout_config.json` - 布局配置
- `logs/pdf_layouts/` - 优化日志
## 优化日志格式
```json
{
"timestamp": "2024-11-18T19:41:10.983000",
"document_stats": {
"kpi_count": 10,
"table_count": 2,
"chart_count": 2,
"max_kpi_value_length": 14,
"max_table_columns": 8
},
"optimizations": [
"KPI数值过长(14字符),字号从32调整为28",
"KPI卡片较多(10个),每行列数从2调整为3",
"表格列数较多(8列),缩小字号和内边距"
],
"final_config": {
"page": {...},
"kpi_card": {...},
"table": {...}
}
}
```
## 故障排除
### 问题1WeasyPrint库加载失败
**症状**
```
OSError: cannot load library 'libpango-1.0-0'
```
**解决方案**
```bash
# macOS
export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH
# 或在脚本中设置
import os
os.environ['DYLD_LIBRARY_PATH'] = '/opt/homebrew/lib'
```
### 问题2:字体文件缺失
**症状**
```
FileNotFoundError: 未找到字体文件
```
**解决方案**
确保以下字体文件存在:
- `ReportEngine/renderers/assets/fonts/SourceHanSerifSC-Medium.otf`
### 问题3PDF布局仍有问题
**解决方案**
1. 检查优化日志:`logs/pdf_layouts/`
2. 查看应用了哪些优化策略
3. 如需自定义,修改配置参数
4. 禁用优化对比:`optimize_layout=False`
## 性能优化建议
1. **首次导出**:需要加载字体文件,可能需要几秒钟
2. **字体子集化**:对于大型报告,考虑使用字体子集以减小文件大小
3. **图表处理**:图表会自动转换为表格,提高PDF渲染速度
4. **批量导出**:复用同一个PDFRenderer实例可以提高效率
## 架构说明
```
┌─────────────────────────────────────────┐
│ Web UI / API │
│ (用户点击"下载PDF"按钮) │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│ Flask API Endpoint │
│ /api/report/export/pdf/:task_id │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│ PDFLayoutOptimizer │
│ • 分析文档结构 │
│ • 智能调整布局参数 │
│ • 保存优化日志 │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│ HTMLRenderer │
│ • 将IR转换为HTML │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│ PDFRenderer │
│ • 注入优化的CSS │
│ • 嵌入字体 │
│ • 使用WeasyPrint生成PDF │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│ 优化的PDF文件 │
│ • 无溢出 │
│ • 布局美观 │
│ • 自动分页 │
└─────────────────────────────────────────┘
```
## 更新日志
### v1.0.0 (2024-11-18)
**新增功能**
- ✅ PDF布局智能优化器
- ✅ 自动调整字号、行间距、网格列数
- ✅ 配置持久化系统
- ✅ Flask API集成
- ✅ 前端一键导出
**优化措施**
- ✅ KPI卡片防溢出
- ✅ 表格自适应布局
- ✅ 长文本行高优化
- ✅ 标题防孤行
- ✅ 图表转表格渲染
**测试覆盖**
- ✅ 多种KPI场景测试
- ✅ 复杂表格测试
- ✅ 图表渲染测试
- ✅ 长文本测试
## 未来计划
- [ ] 支持更多纸张尺寸(A3、Letter等)
- [ ] 添加PDF水印功能
- [ ] 支持页眉页脚自定义
- [ ] 提供更多布局模板
- [ ] 优化大型文档渲染性能
## 技术栈
- **PDF生成**WeasyPrint
- **布局优化**:自研PDFLayoutOptimizer
- **字体**:思源宋体(SourceHanSerifSC
- **后端框架**Flask
- **前端**:原生JavaScript
## 贡献者
欢迎提交Issue和PR来改进PDF导出系统!
## 许可证
本项目遵循项目主仓库的许可证。