OCR任务中如何区分扫描版PDF与原生可搜索文本PDF?
扫描版与原生文本PDF高效区分方案
原有pdf_fonts方法失效的原因
pdf_fonts通过读取PDF内嵌字体元数据做判断,存在大量误判场景:
- 扫描版PDF为兼容旧阅读器,常会在文档结构中写入空的占位字体条目,但页面本身不存在任何可提取的文本对象
- 部分原生PDF导出时未规范写入字体元数据,会导致
pdf_fonts无法返回有效结果,被误判为扫描版
可落地的区分逻辑
核心判断依据为PDF内嵌可提取有效文本的占比,完全适配你当前使用的pdftools工具链,无需引入额外复杂依赖,可跳过耗时的全量OCR预判环节:
- 执行轻量无OCR文本提取
直接读取PDF内置的文本对象,不对页面位图做识别,耗时仅为OCR的1%不到:extracted_raw <- pdf_text(pdf_path) - 基于有效文本量设置分流阈值
先过滤所有空白字符,统计有效字符总数,再按单页平均字符量判定类型:total_valid_chars <- sum(nchar(gsub("\\s", "", extracted_raw))) page_count <- pdf_info(pdf_path)$pages avg_valid_chars_per_page <- total_valid_chars / page_count- 若
avg_valid_chars_per_page低于设定阈值,判定为扫描版,走原有OCR流程 - 若
avg_valid_chars_per_page高于阈值,判定为原生文本PDF,直接使用提取的文本结果
阈值参考:纯文字类文档阈值设为20-30即可;图表较多的学术/商业文档可将阈值上调至50-100,避免因文本占比低出现误判。
- 若
- 伪OCR场景的兜底校验
针对部分扫描后叠加了劣质伪OCR层的文件,可搭配页面图片占比做二次校验:
若单页图片覆盖面积超过90%、同时有效文本量低于阈值,可100%判定为扫描版,避免伪OCR层干扰判断。# 提取单页内嵌图片的面积 page_image_info <- pdf_page_images(pdf_path, page = 1)
内容的提问来源于stack exchange,提问作者Andres Mora
相关产品推荐
相关产品推荐

