前言
做技术开发的同学应该都遇到过这种情况:拿到一份英文API文档、设备手册或者技术白皮书PDF,几十上百页,需要翻译成中文才能高效阅读。直接复制粘贴到翻译工具,翻译完排版全乱了------表格错位、代码块消失、图表编号对不上。
本文分享几种处理PDF技术文档翻译的实践方案,重点对比它们在排版保留方面的表现。
问题分析:为什么PDF翻译后排版会丢?
PDF是固定版式格式,内容通过坐标定位。翻译工具处理PDF时的典型流程是"提取文本 → 翻译 → 重新排版",其中重新排版是最容易出问题的环节:
- 多栏布局提取后文本顺序混乱
- 表格单元格被拆成纯文本,行列关系丢失
- 代码块、公式等非文本内容无法提取
- 翻译后文本长度变化导致版面错位
理解了原因,下面看几种解决方案。
方案一:Python提取 + 翻译API + 文本输出
适合需要提取内容做后续处理的场景。
环境
- Python 3.10+
- 依赖:
pip install pdfplumber googletrans==4.0.0-rc1
提取PDF文本
python
import pdfplumber
def extract_pdf_text(pdf_path: str) -> list:
"""逐页提取PDF文本和表格
Args:
pdf_path: PDF文件路径
Returns:
每页的文本和表格信息列表
"""
pages_data = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
# 提取纯文本
text = page.extract_text()
# 提取表格(如果有)
tables = page.extract_tables()
pages_data.append({
'page_num': page.page_number,
'text': text,
'tables': tables
})
return pages_data
调用翻译API
python
from googletrans import Translator
def translate_text(text: str, dest='zh-cn') -> str:
"""翻译文本
Args:
text: 待翻译文本
dest: 目标语言代码
Returns:
翻译后的文本
"""
translator = Translator()
# 分段翻译,避免超出API长度限制
chunks = [text[i:i+4500] for i in range(0, len(text), 4500)]
translated_chunks = []
for chunk in chunks:
result = translator.translate(chunk, dest=dest)
translated_chunks.append(result.text)
return ''.join(translated_chunks)
表格翻译与输出
python
def translate_tables(tables: list, dest='zh-cn') -> list:
"""翻译表格内容"""
translated_tables = []
for table in tables:
translated_table = []
for row in table:
translated_row = [translate_text(cell or '', dest) for cell in row]
translated_table.append(translated_row)
translated_tables.append(translated_table)
return translated_tables
效果评估:
| 指标 | 表现 |
|---|---|
| 文本提取 | 基本完整,多栏排版可能顺序乱 |
| 表格提取 | 简单表格可以,复杂合并单元格容易出错 |
| 公式/图表 | 无法提取 |
| 排版保留 | 不保留,输出为纯文本或简单表格 |
适用场景:只需要提取文本内容做后续处理(如构建知识库、术语提取),不关心排版。
方案二:PyMuPDF + 坐标映射 + 重排版
更高级的方案,尝试保留布局信息。
环境准备
bash
pip install pymupdf reportlab
提取带坐标的文本块
python
import fitz # PyMuPDF
def extract_text_blocks_with_position(pdf_path: str) -> list:
"""提取带坐标信息的文本块
Returns:
文本块列表,每个块包含文本、坐标、字号等信息
"""
doc = fitz.open(pdf_path)
blocks_data = []
for page_num in range(len(doc)):
page = doc[page_num]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
for span in line["spans"]:
blocks_data.append({
'page': page_num,
'text': span["text"],
'bbox': span["bbox"], # (x0, y0, x1, y1)
'size': span["size"],
'font': span["font"]
})
return blocks_data
翻译并按坐标重排
python
def translate_and_rebuild(pdf_path: str, output_path: str, dest='zh-cn'):
"""翻译并尝试按原坐标重建排版
注意:这是一个简化版本,实际应用中需要处理更多边界情况
"""
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
# 获取文本块
text_blocks = page.get_text("dict")["blocks"]
for block in text_blocks:
if "lines" not in block:
continue
for line in block["lines"]:
for span in line["spans"]:
original_text = span["text"]
if not original_text.strip():
continue
# 翻译
translated = translate_text(original_text, dest)
# 用红色文本覆盖原位置
rect = fitz.Rect(span["bbox"])
page.add_redact_annot(rect, fill=(1, 1, 1))
page.apply_redactions()
page.insert_text(
fitz.Point(rect.x0, rect.y1 - 2),
translated,
fontsize=span["size"] * 0.8, # 中文字体缩小
color=(0, 0, 0)
)
doc.save(output_path)
doc.close()
效果评估:
| 指标 | 表现 |
|---|---|
| 文本提取 | 完整,带坐标信息 |
| 排版保留 | 基本保留位置,但文本长度变化会导致重叠或留白 |
| 表格 | 位置保留但内容可能溢出单元格 |
| 公式/图表 | 不处理,保留原图 |
主要问题:中文翻译后文本通常比英文短,但有时也会变长(如术语展开),坐标映射难以完美适配所有情况。代码块和公式仍然是盲区。
方案三:在线整份翻译工具
如果不需要编程控制,直接使用现成的在线工具是效率最高的方案。
我测试了 PDFTranslator,它的处理方式是直接上传整个PDF文件,在翻译过程中保留原文档的页面结构、表格、图片和字体,下载翻译后的PDF。
测试用例
用一份技术手册PDF测试,包含参数表、安装步骤、示意图和警示框:
| 测试项 | 结果 |
|---|---|
| 参数表 | 行列对应关系保留,数值未翻译(正确行为) |
| 安装步骤 | 步骤编号保留,示意图位置未偏移 |
| 警示框 | 边框和图标保留,文字翻译 |
| 多栏排版 | 栏结构保留 |
| 文件大小 | 20MB以内,每月1000页免费额度 |
优势与局限
优势:
- 无需编程,上传即用
- 排版保留效果明显优于脚本方案
- 支持拆分、合并、压缩等PDF处理功能
局限:
- 翻译引擎不可自定义
- 专业术语需要人工复核
- 复杂公式的翻译效果因文档而异
方案对比总结
| 维度 | Python提取+API | PyMuPDF坐标重排 | 在线整份翻译 |
|---|---|---|---|
| 排版保留 | 不保留 | 部分保留 | 基本保留 |
| 表格处理 | 简单表格可提取 | 位置保留但可能溢出 | 结构保留 |
| 公式/图表 | 无法处理 | 保留原图 | 保留原图 |
| 可定制性 | 高 | 高 | 低 |
| 技术门槛 | 中 | 高 | 无 |
| 适合场景 | 批量文本提取 | 需要保留位置信息 | 日常文档翻译 |
实践建议
- 只需要文本内容:用pdfplumber提取 + 翻译API,简单高效
- 需要保留版面位置:PyMuPDF坐标映射方案可行,但要做好边界情况处理
- 需要翻译完整文档并保留排版:在线整份翻译工具是最省心的选择,适合日常使用
- 无论哪种方案:技术文档中的参数值、代码、公式建议对照原文复核
以上方案各有适用场景,根据实际需求选择即可。如果你有更好的PDF翻译排版保留方案,欢迎评论区交流。
标签:PDF翻译、Python自动化、技术文档翻译、效率工具