ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从 8 秒到 1.4 秒:OCRmyPDF 扫描 PDF 批量 OCR 调优

从 8 秒到 1.4 秒:OCRmyPDF 扫描 PDF 批量 OCR 调优 从 8 秒到 1.4 秒OCRmyPDF 扫描 PDF 批量 OCR 调优【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF凌晨三点运维群里丢进来一个 4GB 的扫描 PDF要求早上八点前可全文检索。OCRmyPDF 的核心工作就是给扫描 PDF 叠加一层 OCR 文本层图像保持原样Tesseract 的识别结果以隐形文字嵌入文档让扫描件变得可搜索、可复制。几个文件时默认配置足够用面对几百个文件或 GB 级文档默认管线会暴露出三类慢法——冗余的后处理、并发度不足、超大图像全量过识别。本文按一条命令跑通 → 中等规模批量 → 生产级目录监控三层来调。原理速写OCRmyPDF 不是单纯读写 PDF 的单进程程序每页的数据流是PDF 渲染成位图 → 可选的 unpaper 预处理 → Tesseract 识别输出 hOCR → hOCR 转换回 PDF 文本层并覆写回原页 → 最后整体过 Ghostscript 做优化与压缩。主调度逻辑在 src/ocrmypdf/_pipeline.py并行执行框架在 src/ocrmypdf/_concurrent.py具体执行器通过插件可插拔默认是每页一个 worker 进程的多进程池。这意味着 OCR 阶段Tesseract与优化阶段Ghostscript耗时基本独立调优要分开做OCR 阶段靠并发和降图提速优化阶段靠降低压缩等级提速。分层实践第一层一条命令跑通关掉不必要的后处理默认的**--optimize 1**会在 OCR 后做一轮图像重压缩**--output-type auto**还可能经 Ghostscript 做 PDF/A 转换两者都有明确开销。即时可用的场景可以直接都关掉ocrmypdf --optimize 0 --output-type pdf --fast-web-view 999999 scan.pdf out.pdf**--optimize 0**禁用文件体积优化**--output-type pdf**跳过 PDF/A 转换**--fast-web-view 999999**关闭线性化优化这三项是 docs/performance.md 给出的提速组合。代价是输出文件变大参考值约 1.5 倍归档场景建议保留**--optimize 3**。第二层worker 数怎么定中等规模批量几十到几百个文件先定**--jobs**。建议以 CPU 核心数为起点单 worker 内存够用300DPI 大页面单个 worker 峰值可达数百 MB时加到核心数 1.2 倍左右出现 OOM 再降参数在 0–256 之间校验见 src/ocrmypdf/_options.py。批量执行官方推荐搭配 GNU parallel注意用-j 2限制——否则 parallel 和 ocrmypdf 会同时打满所有核心系统被进程风暴拖垮parallel --tag -j 2 ocrmypdf {} output/{} ::: *.pdf**--tag**让错误输出带上文件名前缀方便定位是哪个文件失败。对含大图的扫描件Tesseract 有 32767 像素的内部限制OCRmyPDF 默认会自动降采样想直接跳过超大页可用**--skip-big 50**跳过 50 百万像素以上的页面300DPI 的 A4 页约 8.4MP并配合**--tesseract-timeout**放宽单页默认的 180 秒上限避免慢页直接失败。第三层生产环境的目录监控与失败恢复文件持续新增时脚本手动跑就不现实了。仓库自带目录监控脚本 misc/watcher.py用环境变量配置输入输出目录丢文件即触发处理env OCR_INPUT_DIRECTORY/mnt/input-pdfs \ OCR_OUTPUT_DIRECTORY/mnt/output-pdfs \ OCR_OUTPUT_DIRECTORY_YEAR_MONTH1 \ python3 misc/watcher.py**OCR_OUTPUT_DIRECTORY_YEAR_MONTH1**按年月归档输出**OCR_JSON_SETTINGS**可透传任意ocr()参数如**optimize: 3**。失败恢复方面OCRmyPDF 返回码 6 表示页面已含文本、未做 OCR不算失败可据此判断跳过还是重试完整策略见 docs/advanced.md 的 Return code policy 一节。多节点分发时用 misc/batch.py 生成任务清单经队列分发每个节点按第二层的配置运行即可。踩坑与边界页面已有文字运行直接报错退出。默认--mode default遇到已有文本会报错退出批量跑起来像文件没处理。这是保护行为混合格子库改用**--mode skip**让有文本页直接透传确需重做全部 OCR 才用--mode force。Tagged PDF 结构树转换后消失。默认--output-type auto可能回落到 Ghostscript 转换而 Ghostscript 10.x 转换时会丢弃结构树。需要保留结构标注的文档要显式加--output-type pdf。watcher 在网络上文件系统不灵。watchmedo 依赖文件系统事件NFS/SMB 类挂载经常丢事件且同目录下的复制、删除、移动操作都会触发误处理。网络盘场景调大**OCR_POLL_NEW_FILE_SECONDS**走轮询或改用定时任务。效果锚点参考值8 核 / 32GB 内存500 页 300DPI A4 扫描 PDF仅作量级参考配置单页平均耗时输出体积说明默认配置optimize 1PDF/A约 8.2s100%含后处理优化加--jobs取核心数约 3.5s100%并发是主要提速项再加--optimize 0 --output-type pdf约 2.1s约 150%跳过 Ghostscript 阶段大图库加--skip-big/ 降采样约 1.4s约 120%仅对含大图文档生效收尾先做第一层的--optimize 0 --output-type pdf确认输出体积可接受再用少量文件定--jobs最后上 watcher 做持续接入。参数边界与批量方案的完整说明见 docs/performance.md 与 docs/batch.md。【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表