如何找到所有基于图像的 PDF?
How do I find all image-based PDFs?
我的系统中有很多 PDF 文档,我发现有时文档是基于图像的,没有编辑功能。
在这种情况下,我在 Foxit PhantomPDF 中进行 OCR 以更好地搜索,您可以在其中对多个文件进行 OCR。
我想找到我的所有基于图像的 PDF 文档。
我不明白 PDF reader 如何识别文档的 OCR 不是文本。这些 reader 必须访问某些字段。
这也可以在终端中访问。
这个答案给出了如何在线程 Check if a PDF file is a scanned one:
中完成的公开建议
Your best bet might be to check to see if it has text and also see if
it contains a large pagesized image or lots of tiled images which
cover the page. If you also check the metadata this should cover most
options.
我想更好地了解如何有效地做到这一点,因为如果存在一些元字段,那么它会很容易。
但是,我还没有找到这样的元字段。
我认为 最可能的方法是查看页面是否包含页面大小的图像,该图像具有用于搜索的 OCR 因为它是有效的并且已经在某些 PDF reader 中使用。
但是,我不知道该怎么做。
关于
的边缘检测和Hugh变换
在Hugh变换中,参数space的超方块中有专门选择的参数。它的复杂性 $O(A^{m-2})$ 其中 m 是您看到的参数数量,如果参数多于参数,问题就很困难。 A是图片的大小space。 Foxit reader 在他们的实现中很可能使用了 3 个参数。边缘容易检测,保证效率,必须在Hugh变换前完成。损坏的页面将被忽略。其他两个参数仍然未知,但我认为它们必须是节点和一些交叉点。这些交叉点是如何计算的是未知的?确切问题的公式未知。
正在测试 Deajan 的
该命令在 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
OS: Debian 8.5 64 位
Linux 内核:向后移植 4.6
硬件:华硕 Zenbook UX303UA
纯粹从OCR领域,我们可以利用霍夫变换找到页面中最大的正方形,然后计算它的面积与整个面积的比值。如果这个比例很低,我们可以认为这个页面有问题。最后统计漏页比例和页数总和可以判断这个PDF是否是扫描PDF。
我知道这个过程很慢,比例也很难确定。 ^-^
派对迟到了,这里有一个简单的解决方案,暗示已经包含字体的 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' header 是 2 行。所以所有低于 3 行的结果都没有嵌入字体。 AFAIK,不应该有误报,尽管这是一个要问 pdffonts 开发人员的问题。
作为one-liner
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 file.pdf
如果 pdf 包含文本,将显示多于 2 行。
输出所有不包含文本的 pdf 文件的文件名。
我的具有相同功能的 OCR 项目在 Github deajan/pmOCR 中。
我的系统中有很多 PDF 文档,我发现有时文档是基于图像的,没有编辑功能。 在这种情况下,我在 Foxit PhantomPDF 中进行 OCR 以更好地搜索,您可以在其中对多个文件进行 OCR。 我想找到我的所有基于图像的 PDF 文档。
我不明白 PDF reader 如何识别文档的 OCR 不是文本。这些 reader 必须访问某些字段。 这也可以在终端中访问。 这个答案给出了如何在线程 Check if a PDF file is a scanned one:
中完成的公开建议Your best bet might be to check to see if it has text and also see if it contains a large pagesized image or lots of tiled images which cover the page. If you also check the metadata this should cover most options.
我想更好地了解如何有效地做到这一点,因为如果存在一些元字段,那么它会很容易。 但是,我还没有找到这样的元字段。 我认为 最可能的方法是查看页面是否包含页面大小的图像,该图像具有用于搜索的 OCR 因为它是有效的并且已经在某些 PDF reader 中使用。 但是,我不知道该怎么做。
关于
的边缘检测和Hugh变换
在Hugh变换中,参数space的超方块中有专门选择的参数。它的复杂性 $O(A^{m-2})$ 其中 m 是您看到的参数数量,如果参数多于参数,问题就很困难。 A是图片的大小space。 Foxit reader 在他们的实现中很可能使用了 3 个参数。边缘容易检测,保证效率,必须在Hugh变换前完成。损坏的页面将被忽略。其他两个参数仍然未知,但我认为它们必须是节点和一些交叉点。这些交叉点是如何计算的是未知的?确切问题的公式未知。
正在测试 Deajan 的
该命令在 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
OS: Debian 8.5 64 位
Linux 内核:向后移植 4.6
硬件:华硕 Zenbook UX303UA
纯粹从OCR领域,我们可以利用霍夫变换找到页面中最大的正方形,然后计算它的面积与整个面积的比值。如果这个比例很低,我们可以认为这个页面有问题。最后统计漏页比例和页数总和可以判断这个PDF是否是扫描PDF。
我知道这个过程很慢,比例也很难确定。 ^-^
派对迟到了,这里有一个简单的解决方案,暗示已经包含字体的 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' header 是 2 行。所以所有低于 3 行的结果都没有嵌入字体。 AFAIK,不应该有误报,尽管这是一个要问 pdffonts 开发人员的问题。
作为one-liner
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 file.pdf
如果 pdf 包含文本,将显示多于 2 行。
输出所有不包含文本的 pdf 文件的文件名。
我的具有相同功能的 OCR 项目在 Github deajan/pmOCR 中。