145 lines
5.5 KiB
Markdown
145 lines
5.5 KiB
Markdown
# 修复Ubuntu环境下占位符未替换问题
|
||
|
||
## 问题描述
|
||
|
||
在本地Windows环境下生成的谈话审批表内容正确,占位符被正确替换,但在远程Ubuntu服务器上生成的文档中占位符没有被正确替换。
|
||
|
||
## 可能的原因
|
||
|
||
1. **表格处理错误(主要原因)**:在处理表格时出现 `list index out of range` 错误,导致表格中的占位符没有被替换
|
||
- python-docx 库在处理某些表格结构时可能出现索引越界错误
|
||
- 错误发生在访问 `row.cells` 时,导致整个行被跳过
|
||
- 虽然代码有异常处理,但错误处理不够完善,导致表格中的占位符没有被处理
|
||
2. **文件保存问题**:在Ubuntu上,文件保存后可能没有正确刷新到磁盘
|
||
3. **编码问题**:Windows和Ubuntu在处理文件编码时可能有差异
|
||
4. **文件系统同步问题**:Ubuntu上可能需要显式同步文件系统
|
||
5. **占位符匹配问题**:可能因为编码或格式问题导致占位符没有被正确识别
|
||
|
||
## 修复内容
|
||
|
||
### 1. 增强占位符替换逻辑
|
||
|
||
- 添加了正则表达式匹配作为备用方案,确保能够识别各种格式的占位符
|
||
- 增强了替换逻辑,使用多种方式检查占位符是否存在
|
||
|
||
### 2. **修复表格处理中的索引越界错误(重要)**
|
||
|
||
- **问题**:在处理表格时出现 `list index out of range` 错误,导致表格中的占位符没有被替换
|
||
- **修复**:
|
||
- 增强了表格访问的安全性,使用多层异常处理
|
||
- 安全地访问 `row.cells`,避免索引越界错误
|
||
- 安全地访问 `cell.paragraphs`,处理异常表格结构
|
||
- 添加了详细的错误日志,包含表格、行、单元格的索引信息
|
||
- 即使某个单元格处理失败,也会继续处理其他单元格
|
||
- **影响范围**:扫描占位符、替换占位符、验证占位符的所有表格处理部分
|
||
|
||
### 3. 增强文件保存验证
|
||
|
||
- 保存后验证文件是否存在且大小大于0
|
||
- 在非Windows系统上显式同步文件系统(使用`os.sync()`)
|
||
- 保存后重新打开文件验证内容是否正确
|
||
|
||
### 4. 增强调试信息
|
||
|
||
- 添加了详细的调试日志,记录每个替换步骤
|
||
- 在替换前后验证占位符是否存在
|
||
- 记录替换的详细信息,便于诊断问题
|
||
- 表格处理错误现在包含表格、行、单元格的索引信息
|
||
|
||
### 5. 增强替换后验证
|
||
|
||
- 替换后立即验证段落文本是否还包含占位符
|
||
- 如果验证失败,记录详细的错误信息
|
||
- 多次尝试写入,确保文本被正确写入
|
||
|
||
## 修改的文件
|
||
|
||
- `services/document_service.py`
|
||
|
||
## 主要修改点
|
||
|
||
1. **`replace_placeholder_in_paragraph`函数**:
|
||
- 添加了正则表达式匹配作为备用方案
|
||
- 增强了占位符检测逻辑
|
||
- 添加了替换后的验证步骤
|
||
|
||
2. **文件保存部分**:
|
||
- 添加了文件保存后的验证
|
||
- 在Ubuntu上显式同步文件系统
|
||
- 保存后重新打开文件验证内容
|
||
|
||
3. **调试信息**:
|
||
- 添加了详细的调试日志
|
||
- 记录每个替换步骤的详细信息
|
||
|
||
## 如何验证修复
|
||
|
||
1. **查看日志**:
|
||
- 在Ubuntu服务器上运行服务时,查看控制台输出的调试信息
|
||
- 特别关注以下日志:
|
||
- `[DEBUG] 替换占位符: ...`
|
||
- `[DEBUG] 保存前验证:检查文档中是否还有占位符...`
|
||
- `[DEBUG] 保存后验证通过:文件中所有占位符已替换`
|
||
- `[WARN] 保存后验证:文件中仍有占位符: ...`
|
||
- **重要**:检查是否还有 `[WARN] 处理表格时出错: list index out of range` 错误
|
||
- 如果还有,但错误信息现在包含表格、行、单元格的索引,说明错误处理已改进
|
||
- 即使有警告,表格中的占位符也应该被正确替换了
|
||
|
||
2. **测试文档生成**:
|
||
- 在Ubuntu服务器上生成谈话审批表
|
||
- 下载生成的文档,**特别检查表格中的占位符是否被正确替换**
|
||
- 如果仍有问题,查看日志中的警告信息,特别是表格处理相关的警告
|
||
|
||
3. **对比测试**:
|
||
- 在Windows和Ubuntu上使用相同的数据生成文档
|
||
- 对比生成的文档内容,**特别关注表格部分**
|
||
- 查看日志中的差异,确认表格处理是否正常
|
||
|
||
## 如果问题仍然存在
|
||
|
||
如果修复后问题仍然存在,请检查以下内容:
|
||
|
||
1. **查看日志**:
|
||
- 检查是否有 `[WARN]` 或 `[ERROR]` 日志
|
||
- 特别关注占位符替换相关的警告
|
||
|
||
2. **检查字段数据**:
|
||
- 确认传入的`field_data`包含所有需要的字段
|
||
- 确认字段值不为空
|
||
|
||
3. **检查模板文件**:
|
||
- 确认模板文件中的占位符格式正确(`{{field_code}}`)
|
||
- 确认占位符没有被其他字符包围
|
||
|
||
4. **检查python-docx版本**:
|
||
- 确认Windows和Ubuntu上使用的是相同版本的`python-docx`
|
||
- 当前版本:`python-docx==1.1.0`
|
||
|
||
5. **检查文件权限**:
|
||
- 确认Ubuntu服务器上的临时目录有写入权限
|
||
- 确认MinIO上传功能正常
|
||
|
||
## 进一步诊断
|
||
|
||
如果问题仍然存在,可以:
|
||
|
||
1. **启用更详细的日志**:
|
||
- 在代码中添加更多调试信息
|
||
- 记录每个步骤的详细信息
|
||
|
||
2. **对比文件内容**:
|
||
- 下载Windows和Ubuntu上生成的文档
|
||
- 使用工具对比文件内容,找出差异
|
||
|
||
3. **检查环境差异**:
|
||
- 对比Windows和Ubuntu上的Python版本
|
||
- 对比依赖包的版本
|
||
- 检查系统编码设置
|
||
|
||
## 注意事项
|
||
|
||
- 修复后的代码在保存文件时会等待0.1秒,确保文件系统同步
|
||
- 在Ubuntu上会显式调用`os.sync()`同步文件系统
|
||
- 如果文件保存验证失败,会抛出异常,阻止错误文件被上传
|
||
|