报告XP.ReportEngine:新增 IReportService接口封装完整报告生成流程,支持外部类库直接调用;新增 ReportRequest、ReportServiceResult 请求/响应模型;新增引擎预热机制;PDF 生成改为 Task.Run 后台线程执行,解决进度窗口和主窗口卡死问题;完善文档。
This commit is contained in:
@@ -17,18 +17,57 @@ XP.ReportEngine 使用 **Windows 系统自带字体** 生成 PDF,无需额外
|
||||
|
||||
## 后备机制 | Fallback Mechanism
|
||||
|
||||
ITextPdfRenderer 按以下顺序加载字体:
|
||||
`ITextPdfRenderer` 按以下顺序加载字体:
|
||||
|
||||
1. 微软雅黑(`msyh.ttc`)→ 加载失败时尝试宋体(`simsun.ttc`)
|
||||
2. Arial(`arial.ttf`)→ 加载失败时使用 iText 内置 Helvetica
|
||||
3. 最终后备:Helvetica(不支持中文字符)
|
||||
```
|
||||
微软雅黑 (msyh.ttc)
|
||||
↓ 加载失败
|
||||
宋体 (simsun.ttc)
|
||||
↓ 加载失败
|
||||
_cjkFont = null
|
||||
|
||||
Arial (arial.ttf)
|
||||
↓ 加载失败
|
||||
_westernFont = null
|
||||
|
||||
最终后备: iText 内置 Helvetica(不支持中文字符)
|
||||
```
|
||||
|
||||
语言选择逻辑:
|
||||
- zh-CN / zh-TW → 优先使用微软雅黑
|
||||
- en-US → 优先使用 Arial,后备微软雅黑(微软雅黑也支持西文)
|
||||
|
||||
## 字体子集化 | Font Subsetting
|
||||
|
||||
iText7 在 `document.Close()` 时执行字体子集化:
|
||||
- 分析文档中实际使用的字符
|
||||
- 从完整字体文件(微软雅黑约 15MB)中提取用到的字形子集
|
||||
- 仅嵌入子集到 PDF 中
|
||||
|
||||
这使得最终 PDF 文件大小合理(通常 200KB-2MB),但 `Close()` 操作需要约 1-1.5 秒。
|
||||
|
||||
## 性能说明 | Performance Notes
|
||||
|
||||
| 阶段 | 首次耗时 | 后续耗时 | 说明 |
|
||||
|------|---------|---------|------|
|
||||
| 字体加载 | ~5-6s | 0ms | 首次需从磁盘读取 TTC 文件并解析 |
|
||||
| 字体子集化 | ~1.2s | ~1.2s | 每次生成都需要,与字符数量相关 |
|
||||
|
||||
模块通过 `WarmUpAsync()` 预热机制在应用启动时后台完成首次字体加载,用户首次生成报告时不会感受到延迟。
|
||||
|
||||
## 系统要求 | System Requirements
|
||||
|
||||
- Windows 10 或更高版本(微软雅黑为系统预装字体)
|
||||
- 如果在精简版 Windows 上运行,需确保系统已安装微软雅黑字体
|
||||
|
||||
## Fonts 目录 | Fonts Directory
|
||||
## 自定义字体扩展 | Custom Font Extension
|
||||
|
||||
`XP.ReportEngine/Fonts/` 目录当前为空,保留用于未来可能的自定义字体扩展。
|
||||
如需添加自定义字体,可在 `ITextPdfRenderer.InitializeFonts()` 中扩展加载逻辑。
|
||||
如需添加自定义字体:
|
||||
|
||||
1. 将字体文件(.ttf / .ttc / .otf)放入项目 `Fonts/` 目录
|
||||
2. 在 `.csproj` 中取消注释嵌入资源配置:
|
||||
```xml
|
||||
<EmbeddedResource Include="Fonts\*.otf" />
|
||||
<EmbeddedResource Include="Fonts\*.ttf" />
|
||||
```
|
||||
3. 在 `ITextPdfRenderer.InitializeFonts()` 中扩展加载逻辑
|
||||
|
||||
Reference in New Issue
Block a user