pdf2zh深度实践
安装
安装非常简单流畅:
pip install pdf2zh
配置
api key
准备好 openrouter 的 api key,
sk-or-v1-959e1a04a1505bdd9baa6xxxxxxxxxxxxxxxxxxxxxxxx
Model 选择 Claude Opus 4.6。Opus 是 Anthropic 的旗舰重磅模型,拥有最深的上下文理解能力、最强的逻辑推理和最细腻的语义把握。
打开终端,编辑 pdf2zh 的配置文件(如果文件不存在,新建即可):
mkdir -p ~/.config/PDFMathTranslate
vi ~/.config/PDFMathTranslate/config.json
内容如下:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENAI_API_KEY": "sk-or-v1-90c66f9c7xxxxxxxxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "anthropic/claude-4.6-opus"
}
}
]
}
pdf中文自体
我的 linux mint 系统上安装有 文泉驿微米黑 字体,我准备在生成的 pdf 中用这个字体,先找到自体的位置:
fc-list | grep wqy-microhei
/usr/share/fonts/truetype/wqy/wqy-microhei.ttc: WenQuanYi Micro Hei,文泉驛微米黑,文泉驿微米黑:style=Regular
/usr/share/fonts/truetype/wqy/wqy-microhei.ttc: WenQuanYi Micro Hei Mono,文泉驛等寬微米黑,文泉驿等宽微米黑:style=Regular
打开配置文件设置自体
vi ~/.config/PDFMathTranslate/config.json
设置字体为 文泉驿微米黑:
{
"translators": [
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
定制提示词
测试一下实际翻译效果,以经典的 linux-kernel-development-3rd.pdf 为例。
为了提高翻译效果,我准备了一段 Prompt:
vi ~/.config/PDFMathTranslate/it_book_prompt.txt
内容为:
你是一位同时精通中英文的资深IT技术专家,也是顶级技术图书(如 O'Reilly、机械工业出版社)的首席金牌译者。你具有极深厚的>计算机科学功底,深刻理解各类编程语言、系统架构与软件工程原理。
你现在的任务是翻译一本IT技术书籍的内容。你的翻译目标是:准确传达技术原意(信)、符合中国程序员的表达习惯(达)、行文专
业且具有技术专栏的流畅感(雅),彻底消除“机翻感”。
请你在后台静默执行以下翻译思考过程,但【绝对不要打印出思考过程】,你必须直接给出最终的翻译结果:
1. 语境分析:理解该段落在讲什么技术概念,前后逻辑关系是什么。
2. 术语识别:识别出所有代码片段、函数名、专有名词和行业标准缩写。
3. 意译重构:打破英文原句的定语从句和长难句结构,用中国程序员最习惯的语序和技术口吻进行重写。
为了配合 PDF 自动排版引擎,请你必须严格遵守以下极其严苛的【绝对规则】:
1. 【零废话输出(致命要求)】
绝不输出任何引导语、解释、或是“好的,翻译如下”、“这段话的意思是”等废话。你的输出必须且只能是翻译后的纯文本,用于原封不
动地替换源文件。
2. 【原样保留的元素】
- 严禁翻译任何代码块、函数名(如 main(), map())、类名、变量名、配置项。
- 严禁翻译文件路径、终端命令(如 git commit)、编译指令、URL。
- 严禁翻译业界通用的英文缩写(如 API, CPU, GPU, I/O, JSON, HTTP, DOM, GUI, K8s, IP 等)。
- 若文中出现带有特殊符号的代码词汇(如 `<script>`, `__init__`, `*args`),必须原样保留。
3. 【中英文排版规范(盘古之白)】
- 在中文字符与英文字符/数字之间,必须强行加上一个半角空格(例如:“配置 `WebPack` 的过程”、“在 Python 3 中运行”)。
- 务必完美保留原文中的所有 Markdown 符号、LaTeX 公式标签(如 **加粗**、*斜体*、`代码片段`)、列表编号和换行符。绝不能>丢失任何一个排版标签!
4. 【行文风格与技术人味】
- 采用专业、客观、严谨的技术工程口吻,不要使用轻浮或口语化的表达。
- 遇到非常冗长的英文复合句时,请将其拆分为多个简短的中文短句。
- 宁可意译,也不要死板的字对字直译。例如,不要把 "it makes sense to..." 翻译成“它有意义去...”,而应翻译为“...是合理的”或“通常建议...”。
- 遇到带有比喻色彩的技术俚语(如 under the hood, boilerplate),请直接翻译为其对应的技术含义(如“底层原理”、“样板代码”)。
- 保持文字简洁,在表达清晰的前提下,尽量字数少一些
5. 【强制技术术语对照表(Glossary)】
当你遇到以下英文词汇时,必须严格使用对应的中文翻译,绝不可使用其他同义词(在特别生僻的概念首次出现时,请在中文后用括号保留英文原文):
# 操作系统与内核底层
- Kernel -> 内核
- Process -> 进程
- Thread -> 线程
- Daemon -> 守护进程
- Context switch -> 上下文切换
- System call (syscall) -> 系统调用
- Interrupt -> 中断
- Exception -> 异常
- Trap -> 陷阱
- Signal -> 信号
- Semaphore -> 信号量
- Mutex (Mutual Exclusion) -> 互斥锁
- Spinlock -> 自旋锁
- Deadlock -> 死锁
- Race condition -> 竞态条件
- Critical section -> 临界区
- Concurrency -> 并发
- Parallelism -> 并行
# 内存管理
- Memory Management Unit (MMU) -> 内存管理单元
- Virtual Memory -> 虚拟内存
- Page -> 页 / 内存页
- Page Table -> 页表
- Page fault -> 缺页异常 / 缺页中断
- Cache -> 缓存
- Buffer -> 缓冲区
- Heap -> 堆
- Stack -> 栈
- Pointer -> 指针
- Memory leak -> 内存泄漏
- Segmentation fault -> 段错误
# 存储与文件系统
- File system -> 文件系统
- Directory -> 目录(绝不要翻译为“文件夹”)
- Inode -> 索引节点 (inode)
- Mount -> 挂载
- Block device -> 块设备
- Character device -> 字符设备
- Sector -> 扇区
# 编程与通用架构
- Instance -> 实例
- Runtime -> 运行时
- Framework -> 框架
- Middleware -> 中间件
- Interface -> 接口
- Parameter / Argument -> 参数
- Return value -> 返回值
- Macro -> 宏
- Deprecated -> 废弃的 / 不推荐使用的
- Hardcode -> 硬编码
- Refactor -> 重构
- Deploy -> 部署
- Overhead -> 开销
- Scalability -> 可扩展性
- Robustness -> 健壮性 / 鲁棒性
- Transparent -> 透明的(在IT语境中通常指“对用户不可见/无需感知的”)
请基于以上所有规则,直接输出你的最终翻译结果。
TODO: prompt 待继续完善
执行翻译
现在可以开始翻译了:
cd /home/sky/temp/pdf2zh
pdf2zh linux-kernel-development-3rd.pdf --prompt ~/.config/PDFMathTranslate/it_book_prompt.txt -p 1-20 -s openai -t 4
常见错误
api key无效
如果遇到 401 错误,有可能是 api key 有问题比如过期,可以单独用下面的命令检查 api key 是否有效:
curl https://openrouter.ai/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-or-v1-959e1xxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{
"model": "anthropic/claude-3-haiku",
"messages": [{"role": "user", "content": "Hello"}]
}'
没有文件权限
如果报错如下:
PermissionError: [Errno 13] Permission denied: 'pdf2zh_files'
说明 pdf2zh 在启动的目录没有写入权限,最好换一个目录如 ~/temp 再启动 pdf2zh。
pdf格式错误
返回接近完成时,报错:
100%|███████████████████████████████████████████| 10/10 [00:36<00:00, 3.69s/it]
MuPDF error: format error: cannot find object in xref (16578 0 R)
报错的核心是这句:MuPDF error: format error: cannot find object in xref (16578 0 R) 这是底层 PDF 处理库 (PyMuPDF) 报的错。意思是这本源 PDF 文件,其内部的交叉引用表(xref)结构有损坏。
很多从网上下载的早期技术类 PDF(尤其是这种十几年前出版的书)都有这种内部结构的微小错误。平常用 PDF 阅读器看的时候,阅读器会自动容错和忽略它;但是 pdf2zh 需要精确修改和重写 PDF 结构,遇到这种结构损坏就会直接报错停止。
要解决这个问题,我们需要先修复这本源 PDF 的结构。
先安装 PDF 修复工具 qpdf:
sudo apt update && sudo apt install qpdf -y
将要翻译的 pdf 复制到临时目录,然后修复:
cd /home/sky/temp/pdf2zh
cp /media/sky/data/data/ebook/programming/linux/kernel/2017-linux-kernel-development-3rd/linux-kernel-development-3rd.pdf original.pdf
qpdf --linearize original.pdf linux-kernel-development-3rd.pdf
rm original.pdf
卡住不动
pdf2zh 翻译时经常会遇到进度缓慢,然后卡住不懂的情况, 如果想知道发生了什么,可以在启动命令中增加 -d 参数开启 Debug 模式:
pdf2zh linux-kernel-development-3rd.pdf -p 1-20 -s openai -t 4 -d
必要时可以增加 --ignore-cache 参数来忽略可能损坏的缓存。
403访问权限封禁
我用 anthropic/claude-4.6-opus 模型时,遇到翻译中途报错:
[03/28/26 00:49:17] ERROR ERROR:pdf2zh.converter:Error code: 403 - converter.py:357
{'error': {'message': 'Author anthropic is
banned', 'code': 403, 'metadata':
{'provider_name': None}}, 'user_id':'user_2y584Hxxxxxxxxxxxxxxxxx'}
这是因为 pdf2zh 默认启动4线程,同时向 OpenRouter 发送 4 个 Opus 的重度翻译请求,触发了 OpenRouter 的 API 频率限制。因为瞬间并发太高,OpenRouter 拒绝了部分请求,pdf2zh 正在后台疯狂重试,导致进度条假死。
模型选择
免费
pdf2zh 自带了几个无需注册、开箱即用的传统机器翻译引擎。速度快,质量一般,适合快速扫一眼的普通文档翻译场景:
-
Google (谷歌翻译):默认服务。完全免费,没有页数限制。
pdf2zh linux-kernel-development-3rd.pdf -s google -t 4注:传统翻译不怕并发封号,可以把 -t 线程数开到 4 甚至更高,速度快
-
Bing (必应翻译):也是免费的传统翻译。如果所在的环境访问谷歌接口偶尔不稳定,可以试试 Bing
pdf2zh linux-kernel-development-3rd.pdf -s bing -t 4
收费
-
anthropic/claude-4.6-opus: 最好也最贵 -
anthropic/claude-sonnet-4.6:比 opus 差一点点,但是便宜非常多。 -
openai/gpt-4o:对于翻译技术书籍,OpenAI 的 GPT-4o 会是顶级选择 -
deepseek/deepseek-chat: DeepSeek V3 在处理代码和技术书籍时表现极佳,而且在 OpenRouter 上的价格只有 Claude Opus 的几十分之一
总而言之:Sonnet 或 DeepSeek 的速度比 Opus 好,而且成本更低,性价比高。
快速切换配置
为了方便在多种配置之间快速切换,避免改来改去,新建 configs 目录
mkdir -p ~/.config/PDFMathTranslate/configs/
原理上,为每个不同用法新建一个单独的 config 文件,然后在 pdf2zh 的命令行中通过 --config 参数指定
google翻译
新增配置文件 config-google-translator.json:
vi ~/.config/PDFMathTranslate/configs/config-google-translator.json
内容为:
{
"translators": [
{
"name": "google",
"envs": {
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s google -t 1 --config ~/.config/PDFMathTranslate/configs/config-google-translator.json
实测效果:速度快,翻译467页的 linux-kernel-development-3rd.pdf 时间在10分钟级别。
Bing翻译
新增配置文件 config-bing-translator.json:
vi ~/.config/PDFMathTranslate/configs/config-bing-translator.json
内容为:
{
"translators": [
{
"name": "bing",
"envs": {
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s google -t 1 --config ~/.config/PDFMathTranslate/configs/config-bing-translator.json
实测效果:速度快,翻译467页的 linux-kernel-development-3rd.pdf 时间在10分钟级别。
openrouter + deepseek
新增配置文件 config-deepseek-openrouter.json:
vi ~/.config/PDFMathTranslate/configs/config-deepseek-openrouter.json
内容为:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://api.deepseek.com/v1",
"OPENAI_API_KEY": "sk-e3374xxxxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "deepseek-chat"
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s openai -t 1 --config ~/.config/PDFMathTranslate/configs/config-deepseek-openrouter.json
实测效果:速度非常慢,翻译467页的 linux-kernel-development-3rd.pdf 时间在1.5小时。
deepseek 直连
新增配置文件 config-deepseek-direct.json:
vi ~/.config/PDFMathTranslate/configs/config-deepseek-direct.json
内容为:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://api.deepseek.com/v1",
"OPENAI_API_KEY": "sk-e3374xxxxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "deepseek-chat"
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s openai -t 1 --config ~/.config/PDFMathTranslate/configs/config-deepseek-direct.json
实测效果:速度非常慢,翻译467页的 linux-kernel-development-3rd.pdf 时间在1.5小时。
openrouter + opus
新增配置文件 config-openrouter-opus.json:
vi ~/.config/PDFMathTranslate/configs/config-openrouter-opus.json
内容为:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENAI_API_KEY": "sk-or-v1-90c66f9c7xxxxxxxxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "anthropic/claude-4.6-opus"
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s openai -t 1 --config ~/.config/PDFMathTranslate/configs/config-openrouter-opus.json --prompt ~/.config/PDFMathTranslate/it_book_prompt.txt
问题:哪怕只用一个线程,也会被 banned
jiekou + sonnet
新增配置文件 config-jiekou-sonnet.json:
vi ~/.config/PDFMathTranslate/configs/config-jiekou-sonnet.json
内容为:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://api.jiekou.ai/openai",
"OPENAI_API_KEY": "sk_JscMPplxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "claude-sonnet-4-6"
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s openai -t 1 --config ~/.config/PDFMathTranslate/configs/config-jiekou-sonnet.json --prompt ~/.config/PDFMathTranslate/it_book_prompt.txt
问题: 总是很快(一般3-5页)就报错 RateLimitError,虽然还能继续,但是速度就严重降低. 原因: jiekou.ai 这个中转网站限速,充值升级等级之后配额限制放大就不会再报这个错误了。
jiekou + gemini-flash
新增配置文件 config-jiekou-gemini-flash.json:
vi ~/.config/PDFMathTranslate/configs/config-jiekou-gemini-flash.json
内容为:
{
"translators": [
{
"name": "openai",
"envs": {
"OPENAI_BASE_URL": "https://api.jiekou.ai/openai",
"OPENAI_API_KEY": "sk_JscMPpl32z2sxxxxxxxxxxxxxxxxxx",
"OPENAI_MODEL": "gemini-2.5-flash"
}
}
],
"NOTO_FONT_PATH": "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
}
使用方式:
pdf2zh linux-kernel-development-3rd.pdf -s openai -t 1 --config ~/.config/PDFMathTranslate/configs/config-jiekou-gemini-flash.json --prompt ~/.config/PDFMathTranslate/it_book_prompt.txt