web-dev-qa-db-ja.com

Linuxのコマンドラインを使用してPDFファイルが破損していないか確認します

1つのフォルダに多くのPDFファイルがあります。

コマンドラインを使用して、1つ以上のファイルを1つずつ開く必要なく、破損している(ゼロページ、または未完了のダウンロード)かどうかを確認できますか?

18
Kokizzu

pdfinfo(ここではFedoraのpoppler-utils パッケージ)。 pdfinfoは、辞書からPDFファイルに関する情報を取得するため、見つかった場合、ファイルに問題はありません。

for f in *.pdf; do
  if ! pdfinfo "$f" &> /dev/null; then
    echo "$f" is broken
  fi
done
22
vonbrand
find . -iname '*.pdf' | while read -r f
  do
    if pdftotext "$f" - &> /dev/null; then 
        echo "$f" was ok;   
    else
        mv "$f" "$f.broken";
        echo "$f" is broken;   
    fi; 
done
13
schoetbi

PDFをチェックするための私の選択ツールは qpdf です。 qpdfには、PDFの問題を見つけるのに役立つ--check引数があります。

単一のPDF with qpdfをチェックします:

qpdf --check test_file.pdf

qpdfを含むディレクトリ内のすべてのPDFを確認します。

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)

コマンドの説明:

  • find ./directory_to_scan/ -type f -iname '*.pdf'拡張子が「.pdf」のすべてのファイルを検索

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \;見つかったファイルごとにqpdfを実行し、すべての出力を/dev/nullにパイプします。また、qpdfの戻りステータスが0(エラーなし)の場合は、ファイル名の後に「:OK」を付けて出力します。

  • -o -exec echo "{}": FAILED \; \)エラーが検出された場合に実行されます:「:FAILED」が後に続くファイル名を印刷します


入手先qpdf

qpdfには、LinuxとWindowsの両方のバイナリが用意されています: https://github.com/qpdf/qpdf/releases 。選択したパッケージマネージャーを使用して取得することもできます。たとえばUbuntuでは、次のコマンドでaptを使用してqpdfをインストールできます。

apt install qpdf
7
moo

pdfinfoまたはpdftotextを使用するすべてのメソッドが機能しませんでした。実際、彼らは私に偽陽性を与え続け、時には不要なファイルを作成してしまいました。

うまくいったのは [〜#〜] jhove [〜#〜] でした。

インストール:

上記のリンクからjarをインストールし、次のコマンドでPATH環境変数を更新します。

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile

各ターミナルをsource ~/.bash_profileで更新すると、システム全体で使用を開始できます。

基本的な使用法:

jhove -m pdf-hul someFile.pdf

PDFに関する多くの情報が得られます-ほとんどの人がおそらく必要とする以上のものです。

Bash One-Liner:
単にvalidまたはinvalidを返します:

if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;

これはMac OS Xで実行されていましたが、UnixベースのBash環境でも同じように機能すると想定しています。

2
kraftydevil