208 lines
5.3 KiB
Markdown
208 lines
5.3 KiB
Markdown
# PDF中文乱码修复说明
|
||
|
||
## 问题描述
|
||
在Docker环境中,PDF导出时中文显示为乱码或方框,但本地Windows环境正常。
|
||
|
||
## 原因分析
|
||
- Docker容器基于Linux系统,默认不包含中文字体
|
||
- PDF生成器(reportlab)需要中文字体才能正确渲染中文字符
|
||
- 原代码只配置了Windows系统的字体路径
|
||
|
||
## 修复方案
|
||
|
||
### 已修改的文件
|
||
|
||
#### 1. `Dockerfile`
|
||
添加了中文字体包安装:
|
||
```dockerfile
|
||
# 安装Node.js (pywencai需要) 和中文字体 (PDF生成需要)
|
||
RUN apt-get update && apt-get install -y \
|
||
curl \
|
||
gnupg \
|
||
fonts-noto-cjk \
|
||
fonts-wqy-zenhei \
|
||
fonts-wqy-microhei \
|
||
fontconfig \
|
||
&& curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
|
||
&& apt-get install -y nodejs \
|
||
&& fc-cache -fv \
|
||
&& apt-get clean \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
```
|
||
|
||
安装的字体包:
|
||
- **fonts-noto-cjk**: Google Noto CJK字体(支持中日韩文字)
|
||
- **fonts-wqy-zenhei**: 文泉驿正黑体
|
||
- **fonts-wqy-microhei**: 文泉驿微米黑体
|
||
- **fontconfig**: 字体配置工具
|
||
|
||
#### 2. `pdf_generator.py`
|
||
更新了字体注册函数,支持Linux系统:
|
||
```python
|
||
def register_chinese_fonts():
|
||
"""注册中文字体 - 支持Windows和Linux系统"""
|
||
# Windows系统字体路径
|
||
windows_font_paths = [...]
|
||
|
||
# Linux系统字体路径(Docker环境)
|
||
linux_font_paths = [
|
||
'/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',
|
||
'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc',
|
||
'/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
|
||
# ... 更多字体路径
|
||
]
|
||
```
|
||
|
||
## 重新部署步骤
|
||
|
||
### 方式一:Docker Compose(推荐)
|
||
|
||
```bash
|
||
# 1. 停止并删除现有容器
|
||
docker-compose down
|
||
|
||
# 2. 删除旧镜像(可选,但推荐)
|
||
docker rmi agentsstock1-app
|
||
|
||
# 3. 重新构建并启动
|
||
docker-compose up -d --build
|
||
|
||
# 4. 查看日志,确认字体加载成功
|
||
docker-compose logs -f
|
||
```
|
||
|
||
### 方式二:Docker命令
|
||
|
||
```bash
|
||
# 1. 停止并删除现有容器
|
||
docker stop agentsstock1
|
||
docker rm agentsstock1
|
||
|
||
# 2. 删除旧镜像
|
||
docker rmi agentsstock1
|
||
|
||
# 3. 重新构建镜像
|
||
docker build -t agentsstock1 .
|
||
|
||
# 4. 启动新容器
|
||
docker run -d -p 8503:8501 \
|
||
-v $(pwd)/.env:/app/.env \
|
||
--name agentsstock1 \
|
||
agentsstock1
|
||
|
||
# 5. 查看日志
|
||
docker logs -f agentsstock1
|
||
```
|
||
|
||
## 验证修复
|
||
|
||
### 1. 检查字体安装
|
||
进入容器检查字体:
|
||
```bash
|
||
docker exec -it agentsstock1 bash
|
||
fc-list :lang=zh # 列出所有中文字体
|
||
```
|
||
|
||
应该看到类似输出:
|
||
```
|
||
/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc: WenQuanYi Zen Hei:style=Regular
|
||
/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc: Noto Sans CJK SC:style=Regular
|
||
...
|
||
```
|
||
|
||
### 2. 查看应用日志
|
||
在生成PDF时,日志中应该显示:
|
||
```
|
||
✅ 成功注册中文字体: /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc
|
||
```
|
||
|
||
### 3. 测试PDF导出
|
||
1. 在Web界面分析任意股票
|
||
2. 点击"生成并下载PDF报告"
|
||
3. 打开下载的PDF文件
|
||
4. 确认中文正常显示
|
||
|
||
## 故障排查
|
||
|
||
### 问题1:构建时字体安装失败
|
||
**现象**:构建过程中apt-get install失败
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 清理Docker缓存后重试
|
||
docker system prune -a
|
||
docker-compose build --no-cache
|
||
```
|
||
|
||
### 问题2:字体未加载
|
||
**现象**:日志显示"未找到中文字体"
|
||
|
||
**检查步骤**:
|
||
1. 确认Dockerfile中正确添加了字体包
|
||
2. 进入容器检查字体文件是否存在
|
||
3. 运行 `fc-cache -fv` 刷新字体缓存
|
||
|
||
### 问题3:PDF仍然乱码
|
||
**现象**:字体已安装但PDF中文仍显示为方框
|
||
|
||
**可能原因**:
|
||
1. 字体文件权限问题
|
||
2. reportlab缓存问题
|
||
3. 字体格式不兼容
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 重新构建时清理所有缓存
|
||
docker-compose down -v
|
||
docker system prune -a
|
||
docker-compose up -d --build
|
||
```
|
||
|
||
## 技术说明
|
||
|
||
### 字体选择
|
||
我们安装了3种字体包:
|
||
1. **Noto Sans CJK**:Google开发,覆盖范围广,质量高
|
||
2. **文泉驿正黑**:开源中文字体,适合阅读
|
||
3. **文泉驿微米黑**:适合小字号显示
|
||
|
||
系统会按优先级自动选择第一个可用的字体。
|
||
|
||
### 字体文件格式
|
||
- **TTC**:TrueType Collection(字体集合文件)
|
||
- **TTF**:TrueType Font(单个字体文件)
|
||
|
||
reportlab的TTFont可以处理这两种格式。
|
||
|
||
### Docker镜像大小
|
||
添加中文字体后,镜像大小会增加约50-100MB:
|
||
- fonts-noto-cjk: ~70MB
|
||
- fonts-wqy-zenhei: ~10MB
|
||
- fonts-wqy-microhei: ~5MB
|
||
|
||
这是正常的,为了支持完整的中文显示必须付出的空间代价。
|
||
|
||
## 注意事项
|
||
|
||
1. **本地环境无影响**:修改后的代码在Windows本地环境仍然正常工作
|
||
2. **字体缓存**:首次启动时fontconfig会建立字体缓存,可能需要几秒钟
|
||
3. **镜像更新**:已部署的用户需要重新构建镜像才能应用修复
|
||
4. **备份数据**:重新部署前请备份数据库文件(.db文件)
|
||
|
||
## 相关资源
|
||
|
||
- [ReportLab中文支持文档](https://www.reportlab.com/docs/reportlab-userguide.pdf)
|
||
- [Noto字体项目](https://www.google.com/get/noto/)
|
||
- [文泉驿字体项目](http://wenq.org/)
|
||
- [Docker字体配置指南](https://docs.docker.com/config/)
|
||
|
||
## 更新日志
|
||
|
||
- **2025-10-10**: 初始版本,添加Docker中文字体支持
|
||
- **2025-10-10**: 更新pdf_generator.py,支持跨平台字体检测
|
||
|
||
---
|
||
|
||
如有问题,请联系:ws3101001@126.com
|
||
|