PPT 中文转英文 (In-Place Replacement)
核心目标
对现有 PPTX 文件进行中文→英文转换。有两种模式:
- 原位替换模式(默认):仅替换文本框文字,图片/图表原样保留。适用于纯文本 PPT。
- 重绘图表面板模式:当 PPT 中包含中文图表(柱状图、Venn 图等,中文在图片内部而非文本框),需要用 Python/matplotlib 重新生成英文版图表并替换原图。
触发判断
在开始替换前,先判断 PPT 中中文的存在形式:
用以下代码检查是否所有中文都在文本框中:
from pptx import Presentation
prs = Presentation('input.pptx')
has_image_text = False
for slide in prs.slides:
for shape in slide.shapes:
if shape.shape_type == 13: # PICTURE
print(f"Slide has image: {shape.name}")
if shape.has_text_frame:
text = shape.text_frame.text.strip()
if any(ord(ch) in range(0x4e00, 0xa000) for ch in text):
print(f"Text CN: {text[:50]}")
判断规则:
- 中文全部在文本框中 → 使用原位替换模式(Step 1-5)
- 中文在图片/图表内部(图表是图片,不是 PPT 原生图表对象)→ 必须重新生成图表,不能原位替换
- 不确定 → 先尝试原位替换,检查输出 PPT 是否有残留中文图片
重绘图表面板模式(图片内中文)
当中文在图片内部时,采用以下流程:
A. 分析图片内容
由于模型不支持直接识别图片内容,需要:
1. 请用户描述图片中的文字内容,或提供图片文字清单
2. 或根据 PPT 上下文(周围文本框、标题)推断图片内容
B. 用 Python/matplotlib 重新生成英文图表
通用模板:
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False
# 柱状图示例
fig, ax = plt.subplots(figsize=(3.2, 2.4))
categories = ['Phase I/II', 'Phase II', 'Phase III', 'Approved']
values = [12, 3, 4, 3]
ax.bar(range(len(categories)), values, color='#4472C4')
ax.set_xticks(range(len(categories)))
ax.set_xticklabels(categories, fontsize=7, rotation=15)
ax.set_title('Clinical Progress', fontsize=10, fontweight='bold', color='white',
bbox=dict(boxstyle='round,pad=0.3', facecolor='#2F5597'))
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
fig.savefig('chart_en.png', dpi=200, bbox_inches='tight')
C. 将新图表嵌回 PPT
from pptx import Presentation
from pptx.util import Inches
prs = Presentation('input.pptx')
slide = prs.slides[0]
# 找到目标图片位置,替换
slide.shapes.add_picture('chart_en.png', left, top, width, height)
D. 常见图表类型
| 图表类型 | 方法 | 注意事项 |
|---|---|---|
| 柱状图 | ax.bar() |
中文分类标签需翻译为英文 |
| Venn 图 | Circle() + ax.text() |
癌症名称必须用标准英文缩写 |
| 折线图 | ax.plot() |
坐标轴标签翻译 |
| 表格 | slide.shapes.add_table() |
用 python-pptx 重建,不要用图片 |
E. 癌症名称翻译规范
易错点:器官名 ≠ 癌症名
| 中文 | 正确英文 | 错误英文 |
|---|---|---|
| 肝癌 | HCC (Hepatocellular carcinoma) | Liver |
| 肾癌 | RCC (Renal cell carcinoma) | Renal |
| 头颈癌 | Head & neck cancer (HNC) | Head & neck |
| 胃癌 | Gastric cancer | Gastric |
| 胰腺癌 | Pancreatic cancer (PDAC) | Pancreatic |
| 三阴性乳腺癌 | TNBC | Triple-negative breast cancer |
原则:图表中的癌症名称应使用标准学术缩写(HCC, RCC, PDAC, TNBC, NSCLC, CRC 等),而非器官名称。
工作流程(原位替换模式)
Step 1: 获取源文件
如果 PPTX 在 IMA 知识库中:
- 调用 ima_api.cjs 的 get_media_info 获取下载 URL 和认证 headers
- 用 curl 下载到本地工作目录(约需 2-5 分钟,取决于网络)
- 验证:检查文件 magic bytes 或使用 file 命令确认是 PPTX 格式
如果 PPTX 已在本地工作目录,直接使用。
Step 2: 提取中文文本并建立翻译
先提取所有含中文的段落文本:
python -c "
from pptx import Presentation
prs = Presentation('input.pptx')
for i, slide in enumerate(prs.slides):
for shape in slide.shapes:
if shape.has_text_frame:
text = shape.text_frame.text.strip()
if text and any(ord(ch) in range(0x4e00, 0xa000) for ch in text):
print(text)
"
将提取的中文文本翻译为学术英文。组织为 TSV 格式(制表符分隔):
原始中文文本\t英文学术翻译
Step 3: 构建翻译词典文件
创建 translations.tsv,每行一条翻译对:
胰腺癌恶性度高、进展快、转移早、预后差 Pancreatic Ductal Adenocarcinoma: High Malignancy, Rapid Progression...
化疗 Chemotherapy
规则:
- 长句优先放在前面(脚本按长度降序匹配)
- 短词如"治疗"→"Therapy"要谨慎,可能误匹配长句中的部分
- 含特殊引号的文本(如 \u201c\u201d)TSV 可直接包含,无需转义
Step 4: 执行替换
使用 scripts/replace_cn_to_en.py:
python scripts/replace_cn_to_en.py input.pptx translations.tsv output.pptx
脚本逻辑:
1. 加载 TSV,按 CN 文本长度降序排列
2. 逐 Slide → Shape → Paragraph 遍历
3. 先精确匹配,再最长子串匹配
4. 替换 Paragraph 第一个 run 的文本,清空其余 run
5. 最后进行短词碎片清理("优于"→"superior to" 等常见残留)
6. 自动验证输出零中文字符残留
Step 5: 验证
脚本自动输出验证结果。如仍有残留,手动检查残留段落,追加 TSV 条目后重新执行。
关键注意事项
- python-pptx 必须可用。 安装:
pip install python-pptx - 翻译顺序: 长文本的翻译放在 TSV 前面,避免短词先匹配污染长段落
- 中文引号处理: PPTX 文本中的
\u201c(左引号)和\u201d(右引号)与 ASCII"不同,TSV 中应保持一致 - Run 结构: PPTX 文本可能分布在多个 Run 中,替换时只修改第一个 Run 并清空其余
- 文件大小: 原 PPTX 可能很大(含大量图片,50-100MB),下载需耐心
- 图片内中文无法原位替换: 如果中文在图片/图表内部(非文本框),必须重新生成图表。这是本技能最常见的失败原因,务必先判断中文存在形式。
常见问题
Q: 部分短文本被误匹配怎么办?
A: 短词(如"治疗""联合")在 Step 4 自动清理阶段统一处理。如果仍有误匹配,将长文本翻译放在 TSV 前面。
Q: 中文引号导致的语法错误?
A: TSV 格式天然支持 Unicode,用 Write 工具直接写入 TSV 文件即可包含中文引号。Python 脚本以 encoding='utf-8' 读取。
Q: IMA 下载超时?
A: IMA COS 服务器可能带宽较低(~200KB/s),85MB 文件约需 7 分钟。使用 bash 的 curl 并设置足够大的 --max-time。
Q: 替换后图片里还有中文?
A: 这是预期行为。原位替换只处理文本框,不处理图片内容。需要切换到"重绘图表面板模式",用 Python/matplotlib 重新生成英文图表。
Q: Venn 图/柱状图里的癌症名称翻译不准确?
A: 常见错误是把器官名当癌症名(Liver→HCC, Renal→RCC)。务必使用标准癌症缩写,参考"癌症名称翻译规范"表格。