2011-11-03 94 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將使用的字體名稱。 –