OCRmyPDF 页面旋转与纠偏:一条命令摆正歪斜的扫描页
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
扫描回来的 PDF 有半页是横着放的,很多人的第一反应是在阅读器里一页页手动转。但有个反直觉的细节:PDF 里"横着"的页面,文件内部往往就是正着存的,只是页面字典里一行/Rotate 90让查看器把它渲染歪了。也就是说,要修的可能不是图像本身,而是这行元数据。OCRmyPDF 的--rotate-pages和--deskew两个参数自动化的正是这件事。
换个角度看,这两个开关默认都是关的。如果你跑 OCR 时从没带过它们,页面再歪,输出也原样保持——这正是不少人以为"它应该能自动摆正"却没看到效果的原因。一句话概括这个功能的价值:整批横放的扫描件,一条命令翻正;小角度歪斜,自动找平,全程不用打开任何一页。
🔍 它怎么知道页面朝向哪边
每页做 OCR 之前,OCRmyPDF 先让 Ghostscript 把该页画成一张预览图(此时已带上页面原有的/Rotate,和你肉眼看到的一致),再交给 Tesseract 的 OSD(方向与脚本检测)模块问一个问题:"这页朝哪边?你有多确定?" 返回两个数:角度(0/90/180/270)和置信度。决策逻辑在 src/ocrmypdf/_pipeline.py 里,核心就这几行:
correction = orient_conf.angle % 360 if orient_conf.confidence >= options.rotate_pages_threshold and correction != 0: return correction return 0它到底在干嘛:置信度够高且确实歪了,就返回校正角度;否则一律不动。阈值由--rotate-pages-threshold控制,默认 14.0(见 src/ocrmypdf/_defaults.py)。要留意这是 Tesseract 报告的任意单位,不是百分比,别把它当概率解读。
校正动作到底落在哪里
确定了校正角度后,OCRmyPDF 不是在原 PDF 里"转一下图",而是把整页按校正角度渲染成正的图像,再把图像和即将生成的 OCR 文本层一起装进新页面。90/270 度时连坐标轴都要互换,这段坐标映射在 src/ocrmypdf/_graft.py 里。所以最终输出是"图像正放、文字可选中",不再依赖查看器去解释/Rotate。
📐 只歪了几度怎么办
--rotate-pages只处理 90° 整数倍。扫描里最常见的其实是几度的小歪斜,那是--deskew的活:Tesseract 从文本行的基线估出偏斜角(实现见 src/ocrmypdf/_exec/tesseract.py),Pillow 再按这个角度旋转图像,旋出来露出的白边用白色填满。两个参数是配合关系:先把页面转到 90° 整数倍,再对小角度找平,建议一起加。
动手验证
最小命令,30 秒能看到效果:
ocrmypdf -l eng --rotate-pages --deskew in.pdf out.pdf它到底在干嘛:加上两个开关,横放页会被翻正、小歪斜被找平,需要翻正时日志会用"page is facing →, confidence 23.5 - will rotate"这种人话告诉你做了什么。
三个容易踩的坑
- 症状:页面明明横放,却没被翻转。原因:置信度没到阈值,日志会写 "confidence too low to rotate"。应对:对该文档用
--rotate-pages-threshold 10降低门槛,或接受不转。 - 症状:命令直接报错。原因:只写了
--rotate-pages-threshold却没开启--rotate-pages,参数校验层会拒绝这种组合。应对:把主开关一起加上。 - 症状:地图、图表页被误判或直接跳过。原因:OSD 靠连续文本行判断朝向,几乎没有水平文字线的页面缺乏参照,Tesseract 甚至会报 "Too few characters"。应对:图表多的文档保持默认阈值,必要时按页码范围分批处理。
想再往深里走
方向检测并不是 Tesseract 一家说了算。插件体系把检测拆成了get_orientation和get_deskew两个钩子,换成自己的算法只需实现这两个方法并注册插件,扩展方式见 docs/plugins.md。仓库里还配了一个 null OCR 引擎,永远报告"无需旋转",适合拿来做前后对比。
--rotate-pages管 90° 整数倍翻正,--deskew管小角度找平,两者默认关闭。- 默认置信度阈值 14,误判时看日志、调
--rotate-pages-threshold。 - 内置检测覆盖不了的版式,先看插件钩子,或直接给项目提 issue 讨论。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考