做跨境电商或出海产品的同学,经常会遇到一个问题:产品手册只有中文版,但要快速生成英文、西班牙语、法语、德语等多语言版本。手动翻译不现实,找翻译公司又贵又慢。
今天分享一个用 Python 批量处理产品手册翻译的 workflow:先对PDF做结构分析,再调用在线翻译能力生成多语言版本,最后按语言归档输出。文章会给出可直接运行的代码框架,你可以根据实际 API 文档替换具体参数。
一、需求分析
假设我们有以下输入:
- 一份中文版产品手册
manual_zh.pdf - 目标语言列表:
['en', 'es', 'fr', 'de'] - 输出要求:每种语言一个PDF,尽量保留原始排版
核心流程:
读取PDF -> 提取文本与元信息 -> 调用翻译 -> 格式还原 -> 保存结果
二、环境准备
- Python 3.10+
- 依赖库:
pip install requests pdfplumber openpyxl
说明:
pdfplumber用于本地提取PDF文本做预处理;requests用于调用翻译服务;openpyxl用于记录翻译日志。
三、代码实现
1. 读取PDF并提取文本
import pdfplumber
from pathlib import Path
def extract_pdf_text(pdf_path: str) -> list[dict]:
"""按页提取PDF文本,保留页码信息"""
pages = []
with pdfplumber.open(pdf_path) as pdf:
for idx, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or ""
pages.append({
"page": idx,
"text": text.strip(),
})
return pages
if __name__ == "__main__":
pages = extract_pdf_text("manual_zh.pdf")
print(f"共提取 {len(pages)} 页文本")
2. 调用翻译服务
这里以 PDFTranslator 的 API 为例(具体接口参数请参考官方文档),封装一个通用翻译函数:
import requests
import time
API_BASE = "https://api.pdftranslator.org/v1"
API_KEY = "your_api_key_here" # 替换为你的API Key
def translate_text(text: str, target_lang: str, source_lang: str = "zh") -> str:
"""调用PDFTranslator API翻译文本"""
if not text.strip():
return ""
payload = {
"text": text,
"source_lang": source_lang,
"target_lang": target_lang,
"preserve_format": True, # 请求保留格式标记
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
try:
resp = requests.post(
f"{API_BASE}/translate",
json=payload,
headers=headers,
timeout=60,
)
resp.raise_for_status()
return resp.json().get("translated_text", "")
except requests.RequestException as e:
print(f"翻译失败: {e}")
return ""
注意:如果 PDFTranslator 提供的是文件级翻译 API(直接上传PDF并下载译文),可以跳过按页提取文本的步骤,直接上传整个文件。上述代码适用于文本级 API 的演示。
3. 批量翻译整个手册
def translate_manual(pdf_path: str, target_langs: list[str], output_dir: str = "output"):
"""批量翻译产品手册到多语言"""
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
pages = extract_pdf_text(pdf_path)
base_name = Path(pdf_path).stem
for lang in target_langs:
translated_pages = []
print(f"正在翻译到 {lang} ...")
for page in pages:
translated = translate_text(page["text"], target_lang=lang)
translated_pages.append({
"page": page["page"],
"text": translated,
})
time.sleep(0.5) # 避免请求过快
# 保存为文本文件,后续可结合排版工具生成PDF
out_file = output_dir / f"{base_name}_{lang}.txt"
with open(out_file, "w", encoding="utf-8") as f:
for p in translated_pages:
f.write(f"\n--- Page {p['page']} ---\n")
f.write(p["text"])
f.write("\n")
print(f"已保存: {out_file}")
if __name__ == "__main__":
translate_manual(
pdf_path="manual_zh.pdf",
target_langs=["en", "es", "fr", "de"],
)
4. 记录翻译日志
import openpyxl
from datetime import datetime
def log_translation(log_file: str, records: list[dict]):
"""记录翻译日志到Excel"""
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "翻译日志"
ws.append(["时间", "源文件", "目标语言", "页数", "状态"])
for r in records:
ws.append([
r["time"],
r["source"],
r["lang"],
r["pages"],
r["status"],
])
wb.save(log_file)
四、进一步提升效果的建议
- 使用文件级翻译 API
如果翻译服务支持直接上传PDF并返回保留排版的译文PDF,优先使用文件级接口。这样可以避免手动提取文本后再还原排版的麻烦。
- 术语表对齐
产品手册里通常有大量固定术语。可以在翻译前准备术语表(glossary),在调用API时传入,保证"型号"“规格”"保修"等词翻译一致。
- 分块处理大文件
如果手册页数很多,可以按章节或页码范围分批翻译,降低单次请求失败的影响。
- 后处理校验
翻译完成后,建议写一个校验脚本,检查:
- 输出页数是否和输入一致
- 关键章节标题是否全部翻译
- 表格行数是否一致
五、完整代码汇总
"""
批量翻译产品手册示例
依赖:pip install requests pdfplumber openpyxl
"""
import time
import requests
import pdfplumber
import openpyxl
from pathlib import Path
from datetime import datetime
API_BASE = "https://api.pdftranslator.org/v1"
API_KEY = "your_api_key_here"
def extract_pdf_text(pdf_path: str) -> list[dict]:
pages = []
with pdfplumber.open(pdf_path) as pdf:
for idx, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or ""
pages.append({"page": idx, "text": text.strip()})
return pages
def translate_text(text: str, target_lang: str, source_lang: str = "zh") -> str:
if not text.strip():
return ""
payload = {
"text": text,
"source_lang": source_lang,
"target_lang": target_lang,
"preserve_format": True,
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
try:
resp = requests.post(
f"{API_BASE}/translate", json=payload, headers=headers, timeout=60
)
resp.raise_for_status()
return resp.json().get("translated_text", "")
except requests.RequestException as e:
print(f"翻译失败: {e}")
return ""
def translate_manual(pdf_path: str, target_langs: list[str], output_dir: str = "output"):
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
pages = extract_pdf_text(pdf_path)
base_name = Path(pdf_path).stem
records = []
for lang in target_langs:
translated_pages = []
print(f"正在翻译到 {lang} ...")
for page in pages:
translated = translate_text(page["text"], target_lang=lang)
translated_pages.append({"page": page["page"], "text": translated})
time.sleep(0.5)
out_file = output_dir / f"{base_name}_{lang}.txt"
with open(out_file, "w", encoding="utf-8") as f:
for p in translated_pages:
f.write(f"\n--- Page {p['page']} ---\n{p['text']}\n")
records.append({
"time": datetime.now().isoformat(),
"source": pdf_path,
"lang": lang,
"pages": len(pages),
"status": "成功",
})
print(f"已保存: {out_file}")
log_translation(output_dir / "translation_log.xlsx", records)
def log_translation(log_file: Path, records: list[dict]):
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "翻译日志"
ws.append(["时间", "源文件", "目标语言", "页数", "状态"])
for r in records:
ws.append([r["time"], r["source"], r["lang"], r["pages"], r["status"]])
wb.save(log_file)
if __name__ == "__main__":
translate_manual(
pdf_path="manual_zh.pdf",
target_langs=["en", "es", "fr", "de"],
)
六、结语
用Python做PDF批量翻译的核心价值,不是替代翻译本身,而是把"重复上传、下载、归档"的流程自动化。结合 PDFTranslator 这类支持格式保留的翻译服务,可以在保证排版不乱的前提下,快速产出多语言版本的产品手册。
如果你也在做类似需求,建议先拿一份样本手册跑通流程,再批量扩展到全量文档。
标签:PDF翻译、Python自动化、AI翻译、批量翻译、开发者工具

518

被折叠的 条评论
为什么被折叠?



