Files

74 lines
2.6 KiB
Markdown

# 字体方案说明 | Font Strategy
## 当前方案 | Current Approach
XP.ReportEngine 使用 **Windows 系统自带字体** 生成 PDF,无需额外下载或嵌入字体文件。
| 语言 | 字体 | 文件 | 说明 |
|------|------|------|------|
| 简体中文 / 繁体中文 | 微软雅黑 | `C:\Windows\Fonts\msyh.ttc` | Windows 10+ 自带,支持简繁体 |
| 西文(英文等) | Arial | `C:\Windows\Fonts\arial.ttf` | Windows 自带 |
## 为什么使用系统字体 | Why System Fonts
1. **Telerik RadPdfViewer 兼容性** — 系统字体生成的 PDF 在 Telerik RadPdfViewer 中显示正常,不会出现中文乱码
2. **无需额外部署** — 不需要随应用程序分发字体文件,减小安装包体积
3. **跨阅读器兼容** — 字体以子集嵌入 PDF 中(`PREFER_EMBEDDED`),在任何 PDF 阅读器中都能正确显示
## 后备机制 | Fallback Mechanism
`ITextPdfRenderer` 按以下顺序加载字体:
```
微软雅黑 (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 上运行,需确保系统已安装微软雅黑字体
## 自定义字体扩展 | Custom Font Extension
如需添加自定义字体:
1. 将字体文件(.ttf / .ttc / .otf)放入项目 `Fonts/` 目录
2.`.csproj` 中取消注释嵌入资源配置:
```xml
<EmbeddedResource Include="Fonts\*.otf" />
<EmbeddedResource Include="Fonts\*.ttf" />
```
3. 在 `ITextPdfRenderer.InitializeFonts()` 中扩展加载逻辑