多くのPDFでいっぱいのディレクトリがあるとします。それらのほとんどでは、テキストは完全に検索可能であり、それが私が必要としている方法です。しかし、それらのいくつかは単なる画像スキャンであり、OCR処理する必要があります。
ディレクトリ全体でバッチOCRを実行する以外に、実際にOCRを実行する必要がある画像のみのPDFをすばやく特定する方法はありますか?
私はプログラマーではありませんが、Linuxに適したソリューションが望ましいでしょう。
これが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ループの部分をコメントアウトすることができます。
トリックを使用します。これは、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 {}
tree
に問題があったので、同じスクリプトを使用して、このソリューションが機能しました。
find . -name "*.pdf" -type f -exec ~/check_pdf_searchable.sh {} \;
~/
は、スクリプトがホームディレクトリにあることを前提としています。物事を簡単にします。