2011-11-03 76 views
3

不知道从哪里开始对这个真的bash脚本来检查PDF的是ocr'd

我有超过8000 PDF格式的Linux服务器,并需要知道哪些PDF的已ocr'd和一个人的天堂“T。

正想着某种脚本中调用XPDF的检查的PDF,但说实话不知道这是否可能提前

感谢所有帮助

+0

您如何知道文件是否已被识别?是否有像file1.pdf.ocr这样的输出文件?祝你好运。 – shellter

+0

[这可能会帮助你](http://stackoverflow.com/questions/6026287/batch-ocr-program-for-pdfs) – potong

+0

所以你想告诉那些是包含文本的图像的文本?在这种情况下,您可以尝试'pdftotext'并查看它是否产生任何输出。 – ninjalj

回答

4

请确保您有安装一个命令行工具pdffonts。 (这方面有两个版本:一个船舶为xpdf-utils的一部分,其他的poppler-utils的一部分)

所有PDF其中包括扫描的页面不但不会有使用(没有嵌入那些任何字体,也未嵌入式)。

命令行

pdffonts /path/to/scanned.pdf 

也就那么显示该文件的任何字体信息。

这可能已经足够让您将文件分成两个不同的集合。

如果您的PDF包含扫描页面和“普通”页面(或已扫描页面),那么您将不得不扩展并完善上述简单化方法。有关更多信息,请参阅man pdffontspdffonts --help

1

pdffonts麻烦的是,有时它没有返回,就像这样:

name         type    emb sub uni object ID 
------------------------------------ ----------------- --- --- --- --------- 

有时它返回:

name         type    emb sub uni object ID 
------------------------------------ ----------------- --- --- --- --------- 
[none]        Type 3   yes no no  266 0 
[none]        Type 3   yes no no  9 0 
[none]        Type 3   yes no no  297 0 
[none]        Type 3   yes no no  341 0 
[none]        Type 3   yes no no  381 0 
[none]        Type 3   yes no no  394 0 
[none]        Type 3   yes no no  428 0 
[none]        Type 3   yes no no  441 0 
[none]        Type 3   yes no no  451 0 
[none]        Type 3   yes no no  480 0 
[none]        Type 3   yes no no  492 0 
[none]        Type 3   yes no no  510 0 
[none]        Type 3   yes no no  524 0 
[none]        Type 3   yes no no  560 0 
[none]        Type 3   yes no no  573 0 
[none]        Type 3   yes no no  584 0 
[none]        Type 3   yes no no  593 0 
[none]        Type 3   yes no no  601 0 
[none]        Type 3   yes no no  644 0 

考虑到这一点,让我们写一个小的文本工具从PDF获取所有字体:

pdffonts my-doc.pdf | tail -n +3 | cut -d' ' -f1 | sort | uniq 

如果您的PDF不是OCR'编辑,这将不会输出或[none]

如果你想让它跑得更快,使用-l标志只分析,比方说,前5页:

pdffonts -l 5 my-doc.pdf | tail -n +3 | cut -d' ' -f1 | sort | uniq 

现在它包装在一个bash脚本,例如is-pdf-ocred.sh

#!/bin/bash 
MYFONTS=$(pdffonts -l 5 "$1" | tail -n +3 | cut -d' ' -f1 | sort | uniq) 
if [ "$MYFONTS" = '' ] || [ "$MYFONTS" = '[none]' ]; then 
    echo "NOT OCR'ed: $1" 
else 
    echo "$1 is OCR'ed." 
fi 

最后,我们希望能够搜索pdf。 find命令不知道.bashrc中的别名或函数,所以我们需要给它脚本的路径。 运行在你选择的目录,如下所示:

find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \; 

我假设的PDF文件结束.pdf,虽然这并不总是你可以做一个假设。 你可能会想管就少或输出到文本文件:

find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \; | less 
find . -type f -name "*.pdf" -exec /path/to/my/script/is-pdf-ocred.sh '{}' \; > pdfs.txt 

我能够使用-l 5标志做约200 PDF文件在一点点超过10秒。

+1

如果实际PDF是文本和扫描图像的混合,则此方法不起作用。这在商业上很常见。例如,当您对扫描的PDF进行数字签名时,该签名将为PDF添加一个文本层,这样即使该签名不是OCR PDF,pdffonts也会输出该签名的字体。您可以使用'pdffonts scanned.pdf |从输出中删除已知字体grep -v -E'font_name | - | name'',以防万一您知道scanend PDF将使用的字体名称。 –