Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查PDF是否可搜索_Linux_Bash_Pdf_Ocr_Pdftotext - Fatal编程技术网

Linux 检查PDF是否可搜索

Linux 检查PDF是否可搜索,linux,bash,pdf,ocr,pdftotext,Linux,Bash,Pdf,Ocr,Pdftotext,我编写了一个bash脚本,从扫描的PDF文件中提取纯文本。我有很多PDF,但有些是扫描过的,有些不是。所以现在我的主要目标是通过检查PDF是否已经可以搜索来改进我的脚本,这样就不需要OCR提取了 我试过: pdftext-nopgbrk pdf_file.pdf单词列表 将可能的OCR文本存储在单词列表中,这样我就可以检查它是否为空,并确定它是否是可搜索的PDF 我还尝试了pdfforts pdf_file.pdf来检查pdf中是否有字体,因此是否有文本 这两种方法都很好,但在某些情况下失败了

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

我试过:

pdftext-nopgbrk pdf_file.pdf单词列表

将可能的OCR文本存储在
单词列表中,这样我就可以检查它是否为空,并确定它是否是可搜索的PDF

我还尝试了
pdfforts pdf_file.pdf
来检查pdf中是否有字体,因此是否有文本

这两种方法都很好,但在某些情况下失败了

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

数字签名始终以这种方式添加文本(使用Helvetica字体):

签字人:姓名

日期:日期CEST

公司:公司名称

因此:

pdftext-nopgbrk pdf|u file.pdf单词列表| grep-v-E“签名|日期|公司”

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

它适用于一些PDF格式,直到我注意到一个具有其他格式的签名,所以我觉得这是一个很好的解决方案,而不是一个很好的解决方案

有没有办法检查PDF是否完全可搜索?我只需要一种方法来提取PDF的文本,但忽略数字签名。另外,
grep-v
将始终取决于我们数字签名的格式,如果它发生变化,那么它将破坏我的脚本


谢谢。

不幸的是,如果不对文件进行更复杂的分析(这将远远超出bash脚本的范围和规模),以“非黑客”的方式实现这一点是不容易的

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

这里有一个例子。首先,数字签名的元数据:

以下是插入到文档中的文本:

从技术上讲,您可以有一个而没有另一个,并且通常伴随数字签名的文本没有既定的格式。因此,您可能会遇到以下两种情况:

  • 使用
    grep
    忽略特定文本,就像您现在所做的那样,这可能是不可靠的
  • 在所有文件上运行OCR,然后检查OCR前后的文本是否存在差异,但这样做首先会破坏检查的全部目的
你可能是对的。我在发布这个问题时考虑了我的OCR脚本,它与编程相关,但是当您提到我遇到的问题时,它本身可能是离题的,因此Unix和Linux堆栈交换可能是发布它的更好地方。无论如何,如果有人拿出一个脚本或算法来解决我的问题,那么它也可能与编程有关。很抱歉。为了补充最后一点,我们的一些OCR工具包括一个选项“跳过可搜索文本层PDF上的OCR”。因此,您仍然可以在整个集合上运行OCR,但只有基于图像的PDF才会进行OCR。结果将是您的现有文件,其中的文本将通过未接触的+图像PDF传递,现在带有OCR文本。@IlyaEvdokimov但在这种情况下,处理器不会忽略仍然需要OCR的文件,但碰巧有一个可搜索的文本层,其中只包含有关数字签名的信息吗?从我对OP困境的理解来看,这是问题的症结所在。这似乎需要某种更复杂的分析,将文本与数字签名中的信息进行比较,PDF是否有图像,并对是否在特定文档上运行OCR进行有根据的猜测。