如何查找所有基于图像的PDF?

时间:2015-12-04 16:31:20

标签: java python pdf debian ocr

我的系统中有很多PDF文档,有时我注意到文档是基于图像的,没有编辑功能。 在这种情况下,我在Foxit PhantomPDF中进行OCR以便更好地搜索,您可以在多个文件中进行OCR。 我想找到我的所有基于图像的PDF文档。

我不明白PDF阅读器如何识别文档的OCR不是文本的。必须有一些这些读者可以访问的字段。 这也可以在终端访问。 这个答案提供了如何在线程Check if a PDF file is a scanned one中执行此操作的开放式提议:

  

你最好的选择可能是检查它是否有文字,并查看是否   它包含一个大页面图像或许多平铺图像   覆盖页面。如果您还检查元数据,这应该涵盖最多   选项。

我想更好地了解你如何有效地做到这一点,因为如果存在一些元数据,那么这将很容易。 但是,我还没有找到这样的元素。 我认为最可能的方法是查看页面是否包含具有搜索OCR的页面化图像,因为它已经有效并且已经在一些PDF阅读器中使用。 但是,我不知道该怎么做。

关于answer

的边缘检测和休变换

在Hugh变换中,在参数空间的超平方中有特定选择的参数。它的复杂性$ O(A ^ {m-2})$其中m是你看到的参数数量超过那些参数的问题很难。 A 是图像空间的大小。福昕阅读器在其实现中使用最可能的3个参数。边缘易于检测,可以确保效率,必须在Hugh变换之前完成。简单地忽略了损坏的页面。其他两个参数仍然未知,但我认为它们必须是节点和一些交叉点。如何计算这些交叉点是未知的?确切问题的表述是未知的。

测试Deajan的answer

该命令适用于Debian 8.5,但我无法在Ubuntu 16.04中最初使用它

masi@masi:~$ find ./ -name "*.pdf" -print0 | xargs -0 -I {} bash -c 'export file="{}"; if [ $(pdffonts "$file" 2> /dev/null | wc -l) -lt 3 ]; then echo "$file"; fi'
./Downloads/596P.pdf
./Downloads/20160406115732.pdf
^C
操作系统:Debian 8.5 64位
Linux内核:4.6的backports
硬件:华硕Zenbook UX303UA

2 个答案:

答案 0 :(得分:2)

为聚会迟到,这是一个简单的解决方案,暗示已经包含字体的pdf文件不仅仅基于图像:

find ./ -name "*.pdf" -print0 | xargs -0 -I {}      \ 
    bash -c 'export file="{}";                          \
    if [ $(pdffonts "$file" 2> /dev/null | \
    wc -l) -lt 3 ]; then echo "$file"; fi'
  • pdffonts列出PDF文件中的所有嵌入字体。如果包含可搜索的文本,它也必须包含字体,因此pdffonts将列出它们。检查结果是否少于三行是因为pdffonts的标题是2行。因此,低于3行的所有结果都没有嵌入字体。 AFAIK,不应该有误报,尽管这是一个问问pdffonts开发者的问题。

作为单行

find ./ -name "*.pdf" -print0 | xargs -0 -I {} bash -c 'export file="{}"; if [ $(pdffonts "$file" 2> /dev/null | wc -l) -lt 3 ]; then echo "$file"; fi'

说明: 如果pdf包含文本,pdffonts file.pdf将显示超过2行。 输出所有不包含文本的pdf文件的文件名。

具有相同功能的我的OCR项目位于Github deajan/pmOCR

答案 1 :(得分:1)

纯粹来自OCR领域,我们可以使用Hough变换找到页面中最大的方块,然后我们计算其面积与整个区域的比率。如果比率很低,我们可以认为这个页面正在倾斜。最后,水平页面的统计比例和页面总和可以指示此PDF是否被扫描PDF。

我知道这个过程非常缓慢,比例很难确定。 ^ - ^