扫描PDF转EPUB
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_6a9f8e36/scan-pdf-to-epub。
技能介绍
先看清问题
扫描版 PDF 转 EPUB,很多人以为"跑个 OCR"就完事了。真正的坑在于:扫描书没有文字层,普通 OCR 会把整页拍平成一坨纯文本,段落边界和注释结构全丢。扫描书靠"首行缩进 2 字符"区分段落,不靠行距;纯文本 OCR 丢掉每行的 x/y 坐标后,你就无法分辨"同一段的续行"和"下一段的首行",结果要么每句被切成独立段落,要么好几段被并成一段。此外,圈号注释(①②③)会混在正文里,系统性 OCR 错字(如"进入"识成"进人")也会一路带进最终产物。
这套做法怎么落地
核心思路是:一开始就用带 bbox 的 OCR,别走纯文本的弯路。工作流分几个阶段:
- 判定 PDF 类型:用
PyMuPDF打开,检查get_text()长度。为 0 走全流程带坐标 OCR;不为 0 说明已有文字层,直接普通转换即可。 - 带坐标 OCR(断点续跑):脚本把每页识别成
page_XXXX.json,每行含{t, x1, y1, x2, y2, s},页内按(y1, x1)排序。300+ 页一次跑完容易超时,所以按 JSON 是否已存在来跳过,配合--start/--end/--limit分批,中断后重跑自动续上。 - 定阈值:只看 2~3 页,观察续行和段首行的 x1 位置差异来定缩进阈值(如
INDENT=40),再取相邻行 gap 的中间值定段间阈值(如GAP_THR=70)。跨页只用缩进判段,别用 gap——换页后 y 坐标从顶部重算,gap 天然很大,会误判成段界。 - 章节切分:用章号 token 做前缀匹配定位每章起点,副标题不参与匹配,这样即便副标题被 OCR 识错字、破折号识别成不同符号、或标题被拆成两段,都能稳定定位。
- 去噪:每页的页眉页脚(书名、英文书名)会被 OCR 成独立文本框,混进正文。脚本在段落重建前按文本框剥离,避免全书混入几百处书名噪声。
脚注与错字
注释会被抽离成章末脚注区,正文残留的圈号按顺序链接过去。错字校正用精确词对字典而非通配——因为"人/入"混淆(进入→进人、陷入→陷人)虽是系统性错误,但通配会误伤合法词如"引人""招人""纳人"。所以只做精确双字词替换,如 {'进人':'进入', ...}。所有文本经统一校正函数输出,确保导航和正文都不会残留错字。
适用边界与注意点
这套方案适合扫描质量尚可、段落缩进规律、注释结构清晰的书。如果原书排版混乱(多栏混排、缩进不规律),阈值需要逐本调。另外沙盒/云端环境经常被重置,依赖包可能要重装。跑完记得清理残留 worker 进程避免占用显存。
使用场景
- 手上有一本纯扫描版PDF书,没有文字层,需要转成手机上能读的EPUB。
- OCR把整页拍平成纯文本,段落边界全丢了,需要用每行坐标还原段首缩进。
- 原书用圈号标注释,OCR后混进正文,需要抽成EPUB3脚注并回插引用标记。
- 系统性OCR错字比如「进入」识成「进人」,需要用精确词对校正后再生成EPUB。
适合人员
- 想把图书馆扫描藏书转成可阅读EPUB的数字资源馆员
- 需要处理大批量扫描PDF并重建段落结构的古籍数字化工程师
- 开发电子书转换工具、需要解决OCR版面还原问题的后端工程师
- 负责将纸质出版项目数字化的出版社技术编辑