web-dev-qa-db-ja.com

検索できないPDFを自動的に見つける方法

多くのPDFでいっぱいのディレクトリがあるとします。それらのほとんどでは、テキストは完全に検索可能であり、それが私が必要としている方法です。しかし、それらのいくつかは単なる画像スキャンであり、OCR処理する必要があります。

ディレクトリ全体でバッチOCRを実行する以外に、実際にOCRを実行する必要がある画像のみのPDFをすばやく特定する方法はありますか?

私はプログラマーではありませんが、Linuxに適したソリューションが望ましいでしょう。

4
Brian Z

これが100%の解決策であるかどうかはわかりませんが、次のスクリプトを思いついたので、全体ではないにしても、かなりの部分が得られるはずです(仕様を確認していません)。すべてのPDFがあるディレクトリ(サブディレクトリを検索します)。

#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'\0' FILE; do
    PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)"
    RET_PDFFONTS="$?"
    FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))"
    if [[ ! "$RET_PDFFONTS" = "0" ]]
      then
          READ_ERROR=1
          echo "Error while reading $FILE. Skipping..."
          continue
    fi
    if [[ "$FONTS" = "0" ]]
      then
          echo "NOT SEARCHABLE: $FILE"
      else
          echo "SEARCHABLE: $FILE"
    fi
done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0)

echo "Done."
if [[ "$READ_ERROR" = "1" ]]
  then
      echo "There were some errors."
fi

各PDFで指定されているフォントの数を探すことで機能します。ファイルにフォントがない場合は、画像のみで構成されていると見なされます。 (これはパスワードで保護されたファイルでつまずく可能性があります、私にはわかりません、テストするものがありません)。検索可能なものと画像であるものがある場合、これは機能しません-しかし、スキャンされた画像ドキュメントをPDFコンテナから "実際の"から分離することはおそらく有用ですPDFの。

もちろん、検索できないファイルのみを印刷したい場合は、適用されないif-then-elseループの部分をコメントアウトすることができます。

3
davidgo

トリックを使用します。これは、pdfファイルに通常検索できないフォントがない場合に気付いた、独特の二次的な事実です。したがって、これを知っていると、pdffontsを使用できます。

pdffontsの最初の2行はテーブルヘッダーであるため、ファイルが検索可能である場合、3行以上の出力があり、これを知っていると次のように作成できます。

gedit check_pdf_searchable.sh

次にこれを貼り付けます

#!/bin/bash 
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1" # alternatively you can use ocrmypdf "$1" "${1}_ocr.pdf"
fi

次に、実行可能にします

chmod +x check_pdf_searchable.sh

次に、ディレクトリ内の検索不可能なPDFをすべて一覧表示します。

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}

またはディレクトリとそのサブディレクトリ内:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
2

treeに問題があったので、同じスクリプトを使用して、このソリューションが機能しました。

find . -name "*.pdf" -type f -exec ~/check_pdf_searchable.sh {} \;

~/は、スクリプトがホームディレクトリにあることを前提としています。物事を簡単にします。

1
tbst