@ n0nufの足跡をたどって、特定のフォルダー内のすべてのPDFをpdfinfoでチェックし、壊れている場合は修正する試みとしてcpdfにプッシュするバッチスクリプトを作成しました。
@ECHO OFF
FOR %%f in (*.PDF) DO (
echo %%f
pdfinfo "%%f" 2>&1 | findstr /I "error" >nul 2>&1
if not errorlevel 1 (
echo "bad -> try to fix"
@cpdf -i %%f -o %%f_.pdf 2>NUL
mv %%f .\\bak\\%%f
) else (
REM echo good
)
)
@ECHO ON
またはbashスクリプトと同じ:
for file in $(find . -iname "*.pdf")
do
echo "$file"
pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null
if [ $? == 0 ]; then
echo "broken -> try to fix"
cpdf -i "$file" -o "$file"_.pdf
fi
done
壊れたPDFはサブフォルダ\ bakに移動され、再作成されたPDFには_.pdfというサフィックスが付きます(これは完璧ではありませんが、私には十分です)。注:再作成されたPDFはエラーが少なく、通常のPDFビューアで表示できるはずです。しかし、これはすべてのコンテンツを取り戻すという意味ではありません。回復不可能なコンテンツは空のページにつながります。
ここで@kraftydevilによって提案されたJHOVE(オープンソースファイル形式の識別、検証、特性評価ツール)でも同じことを試しました:Linuxのコマンドラインを使用してPDFファイルが破損していないか確認し、これが有効なアプローチであることを確認できます。(最初はあまり成功しませんでしたが、JHOVEの出力を正しく処理していないことに気付きました。)
両方のアプローチをテストするために、テキストエディターを使用してPDFからランダムな部分を削除および変更しました(ストリームが削除されたため、PDFビューアでページをレンダリングできず、PDFタグが変更され、一部のビットがシフトされました)。結果は次のとおりです。pdfinfoとJHOVEの両方で、破損したファイルを正しく検出できます(場合によっては、JHOVEはさらに敏感でした)。
そして、これがJHOVEと同等のスクリプトです。
@ECHO OFF
FOR %%f in (*.PDF) DO (
echo %%f
"C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Well-Formed and valid" >nul 2>&1
if not errorlevel 1 (
echo good
) else (
echo "bad -> try to fix"
@cpdf -i %%f -o %%f_.pdf 2>NUL
REM mv %%f .\\bak\\%%f
)
)
@ECHO ON