dsh-pdf-book-translate:版式保留的 PDF 书籍翻译 DSH 插件

前言

在 DSH(DeepSeek Harness)里处理整本 PDF 技术书时,常见做法是抽纯文本丢给模型再粘回 Word 或 Markdown。这条路会丢掉原版的栏宽、字号、图片位置和矢量图,章节结构也要自己猜。扫描版还要上 OCR,成本和误差都更高。

dsh-pdf-book-translate 面向有文本层的 PDF:先按章/节拆解并生成章节纪要,再在你明确指定的页、章或节范围内并发翻译,尽量保持段落位置与版式,并支持断点续译、术语表与左右对照 PDF。下面按安装、工具链与注意点说明用法。

这是什么

  • 名称:dsh-pdf-book-translate(DSH bundle 插件 id:pdf-book-translate)
  • 维护者:MikuDayo-IoI
  • 分类:工作流(社区目录归类)
  • 版本:0.1.1(README 与 package.json 一致)
  • 许可证:MIT

插件在 Host 侧注册三个工具:pdf_book_outline、pdf_book_translate、pdf_book_status;PDF 解析与重排由 Python PyMuPDF worker 完成。不支持 OCR,扫描版 PDF 不在支持范围内。

核心功能

章节扫描与纪要

pdf_book_outline 会检查 PDF 是否有文本层,无则直接拒绝。结构识别顺序:自带目录(TOC)→ 按标题字号/位置的启发式章/节 → 回退为单章全书。AI 为每章生成约 180–350 字摘要,结果写入输出目录的 zhan_jie.md 与 .pdf-book-state.json。

范围门禁与合并

pdf_book_translate 必须收到 pages、chapters、sections 之一,或用户明确要求全书时的 all=true。什么都不传时返回 status=scope_required 和可用章节列表,由 Agent 先问用户,不会默认整本翻译。

同一本书多次翻译不同范围会合并到同一份译文 PDF;状态中保留每次范围与已完成页的并集。

版式与排版(0.1.1)

  • 段落级重排:提取时把视觉硬换行还原为连续语义段落(代码段保留换行);翻译后按原栏宽、字号、对齐重新折行,而不是原文一行对应译文一行。
  • 版式避让:重排参考同栏宽度,避开右侧图片、矢量图与相邻栏。
  • 矢量图保留:仅对文本层 redact;图片、背景、表格线与矢量图仍为 PDF 原生对象,不栅格化。

翻译、缓存与术语表

  • 按约 8 段 / 3000 字符组批,默认并发 6(可在设置中调整 1–16)。
  • 每段译完即以 sha256(langPair + 原文) 为键写入 .translate-cache.jsonl journal,再原子合并到 .translate-cache.json;进程被强杀后重跑可跳过已译段落。
  • 术语表支持 JSON 数组/对象与 TXT(制表符或逗号分隔),条目可设 locked;未指定路径时会自动发现输出目录下的 termbase.json、glossary.json、术语表.json 等。
  • API Key 留空时使用当前会话 Host 模型;填写则走 OpenAI 兼容 /chat/completions(默认 https://api.deepseek.com)。

输出

默认输出目录为 PDF 同目录下的 <文件名>-translation,主要包括:

文件 作用
<书名>.<目标语言>.pdf 译文 PDF
<书名>.<目标语言>.compare.pdf 原版/译文左右对照
zhan_jie.md 章节纪要 + 内嵌断点状态
.pdf-book-state.json 机器可读断点状态
.translate-cache.json / .translate-cache.jsonl 段落缓存与崩溃恢复 journal

安装与启用

运行依赖

  • Python 3.10+,且能 import pymupdf:python -m pip install pymupdf
  • Node.js 22+,pnpm 或 npm(用于从源码构建)

从源码构建时,在仓库根目录执行:

npm install
npm run build
npm test

构建产物包括 lib/index.js(Host 入口)、lib/client.js(Web 设置卡)与 worker/*.py。

装入 DSH

README 说明:将包含 lib/、worker/、cordis.patch.yml 和 package.json 的包目录,通过 DSH 插件管理器以 bundle 形式安装。配置命名空间为 pdf-book-translate;设置卡挂在 bundle 配置页(plugins.bundle.config,key 为包名 dsh-pdf-book-translate)。新安装后刷新一次 Web GUI 即可看到设置项。

运行时不要把该项目的 devDependencies 一并装进 DSH 宿主;发布包仅保留 @deepseek-ai/schemastery 为 dependency。

主要设置项

设置 默认 说明
apiKey 空 留空用 Host 模型
baseUrl https://api.deepseek.com OpenAI 兼容端点
model deepseek-chat API 模式模型名
langPair en→zh 默认语言对
concurrency 6 并发批次
termbasePath 空 默认术语表路径
pythonBin python 需能 import pymupdf

Host 模式要求对应 provider 已在 DSH Models 页配置凭据,或环境中有如 DEEPSEEK_API_KEY 等变量;否则工具会返回可操作的错误信息。

典型用法

整体流程如下(与 README 一致):

pdf_book_outline
  ├─ 检查文本层
  ├─ 识别章/节并生成摘要
  └─ 写 zhan_jie.md + .pdf-book-state.json
        ↓
   询问用户翻译范围(页 / 章 / 节 / 全书)
        ↓
pdf_book_translate(必须显式范围)
  ├─ 提取段落 → 查缓存 → 并发翻译 → 重建 PDF → 生成对照 PDF
  └─ 写回 state / zhan_jie.md,返回统计
        ↓
pdf_book_status(中断后查看进度)

pdf_book_outline

参数 必填 说明
input ✅ PDF 路径(绝对或工作区相对)
outputDir 可选 默认 <PDF 同目录>/<文件名>-translation
langPair 可选 如 en→zh
rescan 可选 true 重新识别结构

pdf_book_translate

参数 必填 说明
input ✅ PDF 路径
pages 范围之一 如 1-20,35,40-45(1-based)
chapters 范围之一 如 ch-1,ch-3
sections 范围之一 节 id 或标题
all 范围之一 仅当用户明确要求整本时传 true
termbase 可选 术语表路径

pdf_book_status

用于中断后查看章节纪要、已翻译页并集、缓存条目数、输出文件是否存在及上次统计。

术语表示例(JSON 数组):

[
  { "src": "transformer", "dst": "Transformer", "locked": false },
  { "src": "DeepSeek", "dst": "DeepSeek", "locked": true }
]

适用场景与注意

适合:有文本层的技术书、教材 PDF,需要在 Agent 工作流里分段翻译、断点续跑,并保留接近原版的版式与对照阅读。

不适合:扫描版或无文本层 PDF(插件明确无 OCR)。

已知限制(README):

  • 同一段落内混合字体样式会按首 span 样式统一写回。
  • 极长译文可能触发缩字号或排版警告,记录在返回的 warnings 中。
  • 表格按文本行/单元格几何处理,不重建表格结构。
  • 缓存键不含术语表;改术语表后若要重译,需删对应缓存或换输出目录。

安全与权限:插件以当前 DSH 进程权限读写你指定的 PDF 与输出目录,并可能调用你配置的 LLM API。安装前请阅读 GitHub 源码 与 MIT 许可证,确认环境与凭据策略符合你的要求。

DSH 社区插件目录(SkillHub 条目)由社区维护,与 DeepSeek / 幻方无官方从属关系;选型时以仓库 README 与本地构建结果为准。

结尾

dsh-pdf-book-translate 把「章节约束 + 术语表 + 版式保留 + 可恢复缓存」绑成一条 DSH 工作流,适合在智能体对话里先 outline、再按范围 translate、用 status 查进度。若你手头是可复制文本的 PDF 而非扫描件,这条路径比纯文本抽取再手工排版更贴近原书阅读体验。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye