Summary
将扫描版 PDF 书籍(内页全为图片、无文字层)转换为带完整导航目录、可点击跳转的可读 EPUB。 识别由 Claude 视觉子代理(Sonnet 模型)逐页读图完成,CLI 脚本负责 拆页渲染、标记检查、批次合并、按章节切分打包、EPUB 校验。当用户提到"扫描 PDF 转电子书 / PDF 转 EPUB /…
wmy2981/skills
>- 将扫描版 PDF 书籍(? 识别由 Claude 视觉子代理(Sonnet 模型)逐页读图完成,CLI 脚本负责 拆页渲染、标记检查、批次合并、按章节切分打? 扫描书转 epub / 把这本书做成 epub / 扫描件转可读格式 / 图片 PDF 生成目录"时,务? 即使对方没有明确说出"skill"或"epub"字样。
npx skills add wmy2981/skills --skill scanned-pdf-to-epub
将扫描版 PDF 书籍(内页全为图片、无文字层)转换为带完整导航目录、可点击跳转的可读 EPUB。 识别由 Claude 视觉子代理(Sonnet 模型)逐页读图完成,CLI 脚本负责 拆页渲染、标记检查、批次合并、按章节切分打包、EPUB 校验。当用户提到"扫描 PDF 转电子书 / PDF 转 EPUB /…
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Use for Azure AI: Search, Speech, OpenAI, Document Intelligence. Helps with search, vector/hybr…
568.2K installsUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or bot…
216.8K installsUse this skill whenever the user wants to do anything with PDF files. This includes reading or …
192.4K installsUse this skill whenever the user wants to create, read, edit, or manipulate Word documents (.do…
184.5K installsUse this skill any time a spreadsheet file is the primary input or output. This means any task …
165K installsOther skills from wmy2981/skills · top by installs.
npx skills add wmy2981/skills
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
14,876 B
SUMMARY.md
567 B
本 skill 不适用于:有文字层的数字原生 PDF(直接用提取工具即可);漫画书(图为主,本流程去除插图)。
| 环节 | 承担方 | 理由 |
|---|---|---|
| 拆页渲染、标记检查、批次合并、分章、打包、校验 | CLI 脚本(scripts/) |
确定性、可复现、可重跑 |
| 识图、错别字校对、版权页判定、锚点转标题 | Agent(Claude 子代理 / 主代理) | 需要视觉与语义判断,不写脚本 |
| 全流程编排与规范 | SKILL.md | 承载流程与严谨规则 |
模型约定:识图子代理必须使用 Sonnet 模型;不要使用外部 API。主代理校对由当前会话模型完成。
不要为识图或校对环节编写脚本——那部分是 Agent 的灵活任务,脚本只覆盖五个确定性命令:extract、check-markers、merge-batches、md-to-epub、verify。
1. extract (CLI) PDF → 每页一张图 page_0001.png...
2. 子代理识图 (Agent) 每子代理一批 → batch_001.md(纯文本行 + 锚点)
3. 批次标记检查 (CLI) check-markers 检查各 batch 标记 → 有误重跑、无误通过
4. 批次合并 (CLI) merge-batches 按序合并 → draft.md
5. 草稿标记复查 (CLI) check-markers 复查 draft.md 标记
6. 主代理校对 (Agent) 修正错别字(不改原文)→ 锚点转 h 标题 → book.md
7. md-to-epub (CLI) book.md → 按 h 标题切分章节 → 生成导航目录 → book.epub
8. verify (CLI) 校验 EPUB 结构、目录跳转、无残留
pymupdf(渲染 PDF 页为图,import fitz 或 import pymupdf)1. 系统 CLI pandoc(winget install JohnMacFarlane.Pandoc / brew install pandoc) 2. 或 pip install pypandoc-binary(捆绑 pandoc 二进制,无需单独安装) 3. 兜底:pip install ebooklib(纯 Python 打包,目录同样生成)
启动前先检查:python scripts/extract.py --check 会报告缺哪些依赖。
在临时目录内新建一个项目文件夹 book/,全部产物放其中:
book/
├── pages/ # 1. 拆页图片 page_0001.png...
├── raws/ # 2. 子代理识图输出 batch_001.md...
├── draft.md # 3-5. 批次合并 + 标记检查后的草稿(仍含 PAGE/CH/__ 标记)
├── book.md # 6. 校对优化后的全文(干净层级化 Markdown)
└── book.epub # 7. 最终产物
python scripts/extract.py <input.pdf> -o book/pages [--dpi 300]
page0001.png、page0002.png……(从 1 起连续编号,忽略 PDF 内部无关页面偏移)。pages/ 图片数量 == PDF 页数。page0001–page0010,#2 负责 page0011–page0020……批次严格按页码顺序分派。page{(k-1)10+1:04d} ~ page{k10:04d};最后一批不足 10 页则只处理实际存在的页。batch{k:03d}.md(命名规范见 references/subagentprompt.md),文件内每页(含空白页、无正文页)均以 <!-- PAGE XXXX --> 注释定位(空页只写标记不写内容)。失败重跑以批次为单位。调度每个子代理时,直接使用 references/subagentprompt.md 中的提示词模板:把 {N}、{起始页}、{结束页}、{批次序号}、{pagesdir}、{raws_dir} 替换为实际值后作为子代理任务传入(识别必须用 Sonnet 模型)。该文件是提示词的唯一正式来源,本小节不再内嵌模板正文。 调度子代理时,仅可替换模板中 {占位符} 标记的内容,模板其余部分必须原样保留,禁止增删或修改。
子代理的唯一输出规范以 references/subagent_prompt.md 的提示词模板为准,要点归纳如下;完整条款见模板与下方「锚点规范」「内容保留 / 去除规则」:
__ 连接标记(两部分间不放空行),校对时合并为一段。batch{k:03d}.md:严格按 pageXXXX.png 文件名的数字顺序逐页读取,整批页内容顺序写入同一文件;每页(含空页)以 <!-- PAGE XXXX --> 定位(XXXX 严格等于该图片文件名的页码:读 page_0005.png 写 <!-- PAGE 0005 -->)。<!-- COPYRIGHT_CANDIDATE --> 起始,交由主代理终审。每遇到一个标题,插入一行注释,CH 后的数字表示层级:
<!-- CH1: 第二部 江湖 -->
<!-- CH2: 第1章 初入师门 -->
<!-- CH3: 第一节 拜师 -->
CH1 = 全书最高级标题:有部/卷则部/卷为 CH1、章为 CH2、节为 CH3;无部/卷的书,章直接为 CH1(保证顶级章节转成 h1,pandoc 才能按章切分,否则全书挤成单一文件)。| 内容 | 处理 | |
|---|---|---|
| ✅ 保留 | 前言、后记 | 作为正文保留(标题用锚点标注层级) |
| ✅ 保留 | 各章节章号/大标题 | 插入锚点,作为分章依据 |
| ✅ 保留 | 正文段落 | 每段一行,段落间空行 |
| ❌ 去除 | 页眉、页脚 | 直接丢弃,不写入 |
| ❌ 去除 | 插图(含示意图、照片) | 直接丢弃,不写入(本 skill 面向纯文字书籍) |
| ❌ 去除 | 版权页(整页版权声明) | 用 <!-- COPYRIGHT_CANDIDATE --> 标记,主代理终审 |
| ❌ 去除 | 无关标识(二维码、条形码、水印、页码) | 直接丢弃 |
| ⚠️ 特殊 | 原书目录页 | 子代理照常识别正文,但主代理校对阶段会据此提取章节结构并整体丢弃(不进入最终 EPUB,避免与导航目录重复) |
全部批次子代理完成后,用脚本逐个检查 raws/ 下的 batch_XXX.md:
python scripts/check_markers.py book/raws/*.md
脚本输出每个文件的标记清单与问题:
<!-- CHn: 标题 --> 及行号;检查层级是否跳级(作警告)。 及行号;检查跨页切口是否成对。判定:无问题 → 通过;有问题(PAGE 缺失/乱序、__ 不成对)→ 单独重派该批次子代理,重跑后复检,直至通过;不重跑全书。若同一批次多次失败,可临时缩小该批次页数(如拆为 5 页)再试,或暂停交由用户处理。
python scripts/merge_batches.py book/raws -o book/draft.md
按批次序号顺序合并所有 batch_XXX.md 为 draft.md:保留各批内的 PAGE/CH/ 标记(供校对定位、跨批次 切口衔接);合并时校验批次序号连续(1..K 无缺)。合并后规范化行距:任意两个相邻非空行之间恰好 1 个空行(跨页 __ 切口连接的行除外,保持切口两部分紧密相连),无连续空行堆积、无缺失空行。
python scripts/check_markers.py book/draft.md
合并后对整本草稿复查一次标记:全书画页码连续(无跨批次缺页)、__ 切口在批次边界正确成对、CH 层级全本连续。复查通过后再进入校对。
这是 Agent 的灵活任务,不写脚本。基于 draft.md 执行:
draft.md,每块在上下文内完整读完。页数多也不爆上下文。主要修正识别出来的错别字,不改变原文、不增删句子。- 删除 <!-- PAGE XXXX --> 页定位注释——空白页/无意义页仅含该注释,删除后自然无痕。 - 去掉跨页行尾/行首的 __ 连接标记并把两部分合成为一段。 - 将 <!-- CH1 --> / CH2 / CH3 / CH4 分别转为 # / ## / ### / #### Markdown 标题(以此类推);删除已无用的锚点注释与 COPYRIGHT_CANDIDATE 标记。
COPYRIGHT_CANDIDATE 标记的页——确为版权声明则删除;误标(如书名页、献辞页)则保留为正文。<!-- PAGE 残留、无 __ 残留;h 标题层级连续无跳级。此时产出 book.md,是干净的层级化 Markdown,h1=全书最高级标题(有部/卷则为部/卷,无则为章),h2、h3 依层级递减。python scripts/md_to_epub.py book/book.md -o book/book.epub \
--title "书名" --author "作者" --lang zh [--cover book/pages/page_0001.png]
脚本行为:
--cover <图片> 指定封面图(PNG/JPG)。实际流程通常用拆页得到的 page_0001.png(原书封面页),也可由用户提供其他图片;pandoc 路径用 --epub-cover-image,ebooklib 路径用 EpubImage 设 cover-image 属性,两条路径均生成封面。pandoc(Markdown → EPUB);若 pandoc 缺失,回退用 ebooklib 手工组包(目录同样生成)。两种路径都保证阅读顺序与原书一致、已去除的内容不出现。book.epub。python scripts/verify.py book/book.epub
脚本检查并完整打印校验报告到终端:
content.opf / manifest / spine 完整一致。<!-- CH 锚点注释残留、无 COPYRIGHT_CANDIDATE、无 <!-- PAGE 页定位注释残留、无 __ 连接标记残留。校验失败时脚本给出具体条目,修复后重跑 md-to-epub 与 verify 直至通过。
check-markers 检查确认问题,单独重跑该批次子代理(batch_XXX),不重跑全书。