我写了一个bash脚本,从扫描的PDF文件中提取纯文本 . 我有很多PDF,但有些是扫描的,有些则不是 . 所以现在我的主要目标是通过检查PDF是否已经可搜索来改进我的脚本,因此不需要提取OCR .
我试过了:
pdftext -nopgbrk pdf_file.pdf wordlist
在 wordlist
中存储可能的OCR文本,那么我可以检查它是否是可搜索的PDF .
我也试过 pdffonts pdf_file.pdf
检查是否有_1663945的文字 .
两种方式都很好,但在某些情况下失败了 .
例如,我需要对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
将始终取决于我们的数字签名's format and if it changes then it' ll搞砸了我的脚本 .
谢谢 .
1 回答
不幸的是,实际上没有一种简单的方法可以以“非hacky”的方式执行此操作,而无需对文件进行明显更多的分析,这将远远超出bash脚本的范围和规模 .
当
pdftotext
输出数字签名的文本时,该文本不是来自数字签名本身 . 它被存储为PDF中的对象,其中包含pdftotext
忽略的元数据 . 相反,pdftotext
选择的只是:文本也被添加到文件中 .这是Adobe's sample signed PDF document的一个例子 . 首先,数字签名的元数据:
这是插入文档的文本:
从技术上讲,你可以拥有一个没有另一个,并且通常伴随数字签名的文本没有确定的格式 . 因此,你被困在了:
忽略
grep
的特定文本,正如您现在所做的那样,这可能是不可靠的 .在所有文件上运行OCR,然后检查OCR之前/之后文本是否存在差异,但这样就无法完成首先检查的全部目的 .