如何用 Python + PDFTranslator API 做多语言产品手册批量翻译

做跨境电商或出海产品的同学,经常会遇到一个问题:产品手册只有中文版,但要快速生成英文、西班牙语、法语、德语等多语言版本。手动翻译不现实,找翻译公司又贵又慢。

今天分享一个用 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)

四、进一步提升效果的建议

  1. 使用文件级翻译 API

如果翻译服务支持直接上传PDF并返回保留排版的译文PDF,优先使用文件级接口。这样可以避免手动提取文本后再还原排版的麻烦。

  1. 术语表对齐

产品手册里通常有大量固定术语。可以在翻译前准备术语表(glossary),在调用API时传入,保证"型号"“规格”"保修"等词翻译一致。

  1. 分块处理大文件

如果手册页数很多,可以按章节或页码范围分批翻译,降低单次请求失败的影响。

  1. 后处理校验

翻译完成后,建议写一个校验脚本,检查:

  • 输出页数是否和输入一致
  • 关键章节标题是否全部翻译
  • 表格行数是否一致

五、完整代码汇总

"""
批量翻译产品手册示例
依赖: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翻译、批量翻译、开发者工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值