OCRmyPDF 批量 OCR 自动化指南:一个脚本搞定几百份扫描件
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
手上堆了几百份扫描 PDF,一份份点开、逐个跑 OCR,手酸还容易漏。OCRmyPDF 是一款开源的 PDF 文字层工具,能给扫描件加上可搜索、可复制的文本层;它的仓库里就自带一个批处理脚本,一条命令把整个目录的 PDF 递归扫一遍,已含文本的自动跳过,处理完还留好日志,全程不用你盯着。
三步跑通批量 OCR 脚本
不用改任何代码,三步就能跑起来。
- 把仓库克隆到本地:
git clone https://gitcode.com/GitHub_Trending/oc/OCRmyPDF- 进入项目目录:
cd OCRmyPDF- 运行 批处理脚本。不带参数时处理当前目录;要处理别的目录,把路径作为第一个参数传进去:
python3 misc/batch.py /path/to/your/pdf/directory脚本依赖ocrmypdf库,跑之前确认它已安装。第一个参数是起始目录,第二个参数可选、用来指定日志文件。
它是怎么工作的
脚本从你给的起始目录出发,用start_dir.glob("**/*.pdf")递归往下钻,不管 PDF 藏在多深的子文件夹里,只要扩展名是.pdf就会被翻出来。
每拿到一个文件,它先做一个“值不值得跑”的判断:调用ocrmypdf.pdfa.file_claims_pdfa(filename)["pass"]看文件是否已经声明为 PDF/A、是否已经带了文字层。带文字的直接记一句“已包含文本,跳过”,省下一整轮 OCR。就算这一步没拦住,后面真正调用ocr时抛出的PriorOcrFoundError也会被兜住,照样跳过,不会重复加工。
真正需要处理的文件,脚本会先做一份备份:把原件拷到归档目录,确保就算这次 OCR 出问题,原始扫描件也还完好。备份完再调用 ocr API 定义 里的ocr(),脚本里固定用了deskew=True,也就是让倾斜的页面先自动校正,识别更准。整个过程——几点几分开始、处理哪个文件、结果如何——都追加写进日志,方便你事后回看。
核心循环就这几行,改参数也主要在这里动手:
for filename in start_dir.glob("**/*.pdf"): logging.info(f"Processing {filename}") if ocrmypdf.pdfa.file_claims_pdfa(filename)["pass"]: logging.info("Skipped document because it already contained text") else: # 先备份原件到 archive_dir,再跑 OCR try: result = ocrmypdf.ocr(filename, filename, deskew=True) logging.info(result) except ocrmypdf.exceptions.EncryptedPdfError: logging.info("Skipped document because it is encrypted") # 其余异常(数字签名、已标记 PDF 等)同理捕获自定义归档与日志路径
脚本顶部和命令行参数里留了几个口子,大多数时候你不用动,但有两种情况值得改。
- 归档目录
archive_dir:默认值是/pdfbak,用来存原件备份。当你需要给重要文档留底时,把它改成你自己的绝对路径即可;如果压根不想备份、只想就地 OCR,把它设为空字符串"",脚本就跳过备份这一步。 - 日志文件:默认写到项目目录下的
ocr-tree.log。想换位置,运行时把第二个参数传进去就行:
python3 misc/batch.py /path/to/pdf/directory /path/to/logfile.log- 起始目录:第一个参数。不传就用当前目录,适合你想从某个根目录一次性扫全树的场景。
三类真实落地场景
- 企业文档管理:把一整年的发票、合同扫描件丢进一个目录,跑一次脚本,全部变成可搜索 PDF。之后直接搜“发票号”“金额”“抬头”,几秒定位,不用翻几十页。
- 学术论文扫描件:研究者手里常有成堆的老论文扫描版,批量转成文本层后就能复制引用、做笔记、提取关键词,省去一个字一个字敲的功夫。
- 机构档案数字化:政府或单位归档的纸质档案扫描件,用脚本批量加上文字层并留好原始备份,归档和检索都能自动化,原始数据安全也有保障。
常见现象排查
现象:处理速度慢原因:默认会把工作铺到所有核心上,文件多、页数大时显得吃力。 解法:调小jobs参数控制并发文件数;用image_dpi降低渲染分辨率;不需要的功能关掉,比如把remove_background、rotate_pages设为False。
现象:部分 PDF 被跳过或报错原因:脚本对几类文件是“主动放过”而非失败——加密 PDF 抛EncryptedPdfError、已签名 PDF 抛DigitalSignatureError、已含文字抛PriorOcrFoundError、已标记的 PDF 抛TaggedPDFError,都会被捕获后记录并跳过。 解法:加密文件先解密再处理;损坏文件先用 PDF 修复工具修好;单文件内存不足时考虑分批或换更充裕的机器重跑。
现象:日志文件越滚越大原因:默认级别是INFO,每个文件的每个动作都写一行。 解法:在logging.basicConfig里把level调成logging.WARNING或logging.ERROR,只留关键信息;定期清理旧日志也行。
一个脚本,把“几百份扫描件逐个 OCR”这件重复体力活压成一条命令,还顺带解决了留底、去重、追溯三个隐患。想更进一步的话,可以照着 批处理脚本 的写法给它加参数解析、多线程、按语言分目录,甚至接一个watcher监听新文件自动入队——ocr函数里那一大串可选参数(语言、分辨率、优化级别、PDF 输出类型)几乎给了你全部的定制空间。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考