增加港股支持

This commit is contained in:
oficcejo
2025-10-10 17:07:21 +08:00
parent 88c7db1ab9
commit 80bead4f2f
8 changed files with 1015 additions and 30 deletions
+207
View File
@@ -0,0 +1,207 @@
# 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` 刷新字体缓存
### 问题3PDF仍然乱码
**现象**:字体已安装但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