如何用 OCRmyPDF 的 --mode strip 移除 PDF 中已有的不可见 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——文字层还在,但搜不到东西或认读结果无用——通常的做法是重新 OCR,但那样会把页面栅格化重做一遍。如果你的目的只是把这一层不可见文字从文件里删掉、让页面保持原样,OCRmyPDF v17.6.0 起提供的--mode strip就是为这个任务设计的:它只移除以“不可见”方式(PDF 文本渲染模式 3)绘制的 OCR 文字层,不做栅格化,不改图像和可见内容,输出文件通常比输入更小。
前提条件:
- 已安装 OCRmyPDF 命令行工具,版本不低于 v17.6.0(
--mode参数在 v17.0.0 引入,strip模式在 v17.6.0 增加,见 v17 发布说明)。安装方式参见 安装文档; - 输入 PDF 中确实存在要移除的文字层。
执行移除:一条命令
标准用法是:
ocrmypdf --mode strip input.pdf output.pdfinput.pdf是带 OCR 文字层的原文件,output.pdf是输出文件,两者都可以替换为你自己的路径。执行完成后,输出文件中不再有那层不可见文字,而页面图像和可见内容保持不变——v17 发布说明 对这一行为的描述是:与--ocr-engine none --force-ocr不同,它不会栅格化页面,因此“images and visible content are preserved unchanged and the output is smaller rather than larger”。
如果输入 PDF 同时含有可见文字(比如数字原生生成的页面),这些文字不会被 strip 移除:--mode strip只移除以渲染模式 3 绘制的不可见文本(见 Cookbook 中 “Remove the OCR text layer from my PDF” 一节)。仓库中的测试 tests/test_strip.py 明确验证了这一点——对一个数字原生的文字 PDF 执行 strip 后,has_text仍为真。
原地修改文件
如果不想产生第二个文件,可以直接让输出覆盖输入:
ocrmypdf myfile.pdf myfile.pdf按 Cookbook 的说明,只有 OCRmyPDF 执行成功时文件才会被覆盖;失败时原文件保持不变。
验证结果
判断是否按预期完成,可以核对以下几点,均与仓库测试 tests/test_strip.py 中固化下来的断言一致:
- 文字层已移除:对输出文件做详细分析时,原先含文字的页面
has_text为假。测试test_mode_strip_removes_ocr_layer用PdfInfo(pdf, detailed_analysis=True)检查了这一点; - 页面未被栅格化:输出文件中页面的图像流与输入逐字节相同。测试通过
pikepdf读取第 1 页/Resources/XObject中每个 Image 对象的read_raw_bytes()并断言相等; - 文件没有变大:输出文件大小小于或等于输入(测试断言
out.stat().st_size <= input_pdf.stat().st_size); - 页数不变:输出仍为同样页数。
测试里另外使用了--output-type pdf --optimize 0,作用是跳过 PDF/A 转换和图像重编码干扰,保证“图像逐字节不变”这个断言成立。如果你只关心文字层被移除、不要求图像字节级不变,按标准命令执行即可;如果要求图像完全不受影响,可参考测试的写法追加这两个参数:
ocrmypdf --mode strip --output-type pdf --optimize 0 input.pdf output.pdf边界与限制
strip 无法移除“可见式”OCR 文字。Cookbook 指出,一些 OCR 产品(包括 OCRmyPDF v2.2 及更早版本)的 OCR 文字是以可见文字加一张不透明图片覆盖的方式绘制的,这种文字属于页面可见内容的一部分,
--mode strip不动它。若必须连这类文字也一并去掉,需要把整页栅格化成纯图像 PDF:ocrmypdf --ocr-engine none --force-ocr input.pdf output.pdf注意这是另一条路径:每页都会重建为图像,文件通常变大,矢量内容会丢失。
strip 模式拒绝需要栅格化/OCR 的选项。测试
test_mode_strip_rejects_image_processing_options表明,--mode strip与--deskew这类选项同用会抛出BadArgsError。strip 只做“摘掉文字层”这一件事,不能与其他图像处理选项组合。与重做 OCR 的区别:如果你的目标是“去掉旧文字层并重新识别”,应该用
--mode redo(等价于旧的--redo-ocr),它会在移除旧不可见文字层后重新执行 OCR;各模式的完整对照表见 高级文档 “OCR processing mode”一节。strip 只删不加,处理完成后文件里将没有可搜索的文字。
【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考