做跨境电商或出海产品的同学,经常会遇到一个问题:产品手册只有中文版,但要快速生成英文、西班牙语、法语、德语等多语言版本。手动翻译不现实,找翻译公司又贵又慢。
今天分享一个用 Python 批量处理产品手册翻译的 workflow:先对PDF做结构分析,再调用在线翻译能力生成多语言版本,最后按语言归档输出。文章会给出可直接运行的代码框架,你可以根据实际 API 文档替换具体参数。
一、需求分析
假设我们有以下输入:
- 一份中文版产品手册
manual_zh.pdf - 目标语言列表:
['en', 'es', 'fr', 'de'] - 输出要求:每种语言一个PDF,尽量保留原始排版
核心流程:
读取PDF -> 提取文本与元信息 -> 调用翻译 -> 格式还原 -> 保存结果二、环境准备
- Python 3.10+
- 依赖库:
pipinstallrequests pdfplumber openpyxl说明:
pdfplumber用于本地提取PDF文本做预处理;requests用于调用翻译服务;openpyxl用于记录翻译日志。
三、代码实现
1. 读取PDF并提取文本
importpdfplumberfrompathlibimportPathdefextract_pdf_text(pdf_path:str)->list[dict]:"""按页提取PDF文本,保留页码信息"""pages=[]withpdfplumber.open(pdf_path)aspdf:foridx,pageinenumerate(pdf.pages,start=1):text=page.extract_text()or""pages.append({"page":idx,"text":text.strip(),})returnpagesif__name__=="__main__":pages=extract_pdf_text("manual_zh.pdf")print(f"共提取{len(pages)}页文本")2. 调用翻译服务
这里以 PDFTranslator 的 API 为例(具体接口参数请参考官方文档),封装一个通用翻译函数:
importrequestsimporttime API_BASE="https://api.pdftranslator.org/v1"API_KEY="your_api_key_here"# 替换为你的API Keydeftranslate_text(text:str,target_lang:str,source_lang:str="zh")->str:"""调用PDFTranslator API翻译文本"""ifnottext.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()returnresp.json().get("translated_text","")exceptrequests.RequestExceptionase:print(f"翻译失败:{e}")return""注意:如果 PDFTranslator 提供的是文件级翻译 API(直接上传PDF并下载译文),可以跳过按页提取文本的步骤,直接上传整个文件。上述代码适用于文本级 API 的演示。
3. 批量翻译整个手册
deftranslate_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).stemforlangintarget_langs:translated_pages=[]print(f"正在翻译到{lang}...")forpageinpages:translated=translate_text(page["text"],target_lang=lang)translated_pages.append({"page":page["page"],"text":translated,})time.sleep(0.5)# 避免请求过快# 保存为文本文件,后续可结合排版工具生成PDFout_file=output_dir/f"{base_name}_{lang}.txt"withopen(out_file,"w",encoding="utf-8")asf:forpintranslated_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. 记录翻译日志
importopenpyxlfromdatetimeimportdatetimedeflog_translation(log_file:str,records:list[dict]):"""记录翻译日志到Excel"""wb=openpyxl.Workbook()ws=wb.active ws.title="翻译日志"ws.append(["时间","源文件","目标语言","页数","状态"])forrinrecords: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 """importtimeimportrequestsimportpdfplumberimportopenpyxlfrompathlibimportPathfromdatetimeimportdatetime API_BASE="https://api.pdftranslator.org/v1"API_KEY="your_api_key_here"defextract_pdf_text(pdf_path:str)->list[dict]:pages=[]withpdfplumber.open(pdf_path)aspdf:foridx,pageinenumerate(pdf.pages,start=1):text=page.extract_text()or""pages.append({"page":idx,"text":text.strip()})returnpagesdeftranslate_text(text:str,target_lang:str,source_lang:str="zh")->str:ifnottext.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()returnresp.json().get("translated_text","")exceptrequests.RequestExceptionase:print(f"翻译失败:{e}")return""deftranslate_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=[]forlangintarget_langs:translated_pages=[]print(f"正在翻译到{lang}...")forpageinpages: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"withopen(out_file,"w",encoding="utf-8")asf:forpintranslated_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)deflog_translation(log_file:Path,records:list[dict]):wb=openpyxl.Workbook()ws=wb.active ws.title="翻译日志"ws.append(["时间","源文件","目标语言","页数","状态"])forrinrecords: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翻译、批量翻译、开发者工具