2017-07-26 81 views
0

我写了一个bash脚本,从扫描的PDF文件中提取纯文本。我有很多PDF文件,但有些是扫描的,有些则不是。所以现在我的主要目标是通过检查PDF是否已经可以搜索来改进我的脚本,所以不需要OCR提取。检查PDF是否可搜索

我已经试过:

pdftext -nopgbrk pdf_file.pdf wordlist

存储可能OCR'ed文字wordlist,所以后来我可以检查它是否是空的,并找出是否是一个可搜索的PDF或没有。

我也试过pdffonts pdf_file.pdf来检查该PDF中是否有字体,因此是否有文字。

这两种方式工作很好,但在某些情况下失败。

例如,我需要OCR的一些PDF需要数字签名,而这些签名始终为PDF添加文本图层。所以,当我运行这两个命令中的任何一个时,它将输出签名的文本或它使用的字体。就好像它是因为签名而发现了纯文本一样。它可能只是一个带有数字签名的扫描PDF,但会被检测为纯文本PDF。

数码引援总是添加文字这种方式(使用Helvetica字体):名称

日期:日期CEST

公司:公司名称

通过签名

所以:

pdftext -nopgbrk pdf_file.pdf wordlist | grep -v -E 'Signed|Date|Company'

我可以设法删除这些行,所以如果它真的是扫描的PDF,输出将为空。

它工作的一些PDF的,直到我注意到有一些其他格式的签名,所以我觉得这是相当多的解决方法,而不是一个很好的解决方案。

有什么方法可以检查PDF是否完全可搜索?我只需要一种方法来提取PDF文本,但省略了数字签名。另外grep -v将总是取决于我们的数字签名的格式,如果它改变,那么它会搞砸我的脚本。

谢谢。

+0

你可能是对的。我发布了这个与我的OCR脚本相关的问题,这个脚本与编程相关,但是当你提到我自己的问题可能是无关紧要的时候,所以Unix&Linux堆栈交换可能是一个更好的地方发布它。无论如何,如果有人用脚本或算法来解决我的问题,那么它也可能与编程有关。反正很抱歉。 –

回答

1

不幸的是,如果没有对文件进行更多的涉及分析,这将远远超出bash脚本的范围和规模,那么真的不是一种简单的方法来以“非hacky”的方式来做到这一点。

pdftotext输出数字签名的文本时,该文本不是来自数字签名本身。这是作为对象存储在PDF中的,其中元数据pdftotext将被忽略。相反,pdftotext拿起来就是:文本也被添加到文件中。

下面是Adobe's sample signed PDF document的一个示例。首先,数字签名的元数据:

Screenshot of digital signature metadata

在此可以被插入到文档中的文本:

Screenshot of text with same information as in digital signature

技术上讲,你可以有一个没有其他,有通常伴随数字签名的文本没有建立的格式。因此,您被卡住了:

  • 忽略具有grep的特定文本,因为您现在正在执行此操作,这可能是不可靠的。
  • 对所有文件运行OCR,然后检查文本在OCR之前/之后是否存在差异,但是这首先破坏了检查的整体目的。
+0

要添加到最后一个项目符号点,我们提供的一些OCR工具包括一个选项,以“在带有可搜索文本层的PDF上跳过OCR”。因此,您仍然可以在整套设备上运行OCR,但只有基于图像的PDF才会被OCR。结果将是您的现有文件,其文本通过未经处理的+图像PDF现在通过OCR文本传递。 –

+0

@IlyaEvdokimov但是,在这种情况下,处理器是否会忽略仍需要OCR的文件,但碰巧有可搜索的文本层,其中只包含有关数字签名的信息?从我在OP的困境中了解的情况来看,这是问题的关键。似乎需要一些更多的参与分析,将文本与数字签名中的信息进行比较,不管PD​​F是否具有图像,并且对是否在该特定文档上运行OCR都进行了有根据的猜测。 –