xpdfbin-winパッケージの「pdfinfo.exe」とcpdf.exeを使用してPDFファイルの破損をチェックしましたが、必要でない場合はバイナリを使用したくありませんでした。
新しいPDF形式の最後には読めるxmlデータカタログがあるので、通常のウィンドウNOTEPAD.exeを開いてPDFを開いて、最後まで読めないデータをスクロールしていくつかの読み取り可能なキーを見ました。私は1つのキーが必要でしたが、CreationDateとModDateの両方を使うことにしました。
以下のPowershell(PS)スクリプトは、現在のディレクトリ内のすべてのPDFファイルをチェックし、それぞれのステータスをテキストファイル(!RESULTS.log)に出力します。これを35,000のPDFファイルに対して実行するのに約2分かかりました。私はPSに新しい人のためのコメントを追加しようとしました。これで誰かが時間を節約できることを願っています。おそらくこれを行う良い方法がありますが、これは私の目的のために完璧に動作し、エラーを静かに処理します。画面にエラーが表示された場合は、最初に$ ErrorActionPreference = "SilentlyContinue"を定義する必要があります。
次のファイルをテキストファイルにコピーし、適切に名前を付けて(たとえば:CheckPDF.ps1)、PSを開き、PDFファイルを含むディレクトリを参照してコンソールにチェックアンドペーストします。
#
# PowerShell v4.0
#
# Get all PDF files in current directory
#
$items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}
$logFile = "!RESULTS.log"
$badCounter = 0
$goodCounter = 0
$msg = "`n`nProcessing " + $items.count + " files... "
Write-Host -nonewline -foregroundcolor Yellow $msg
foreach ($item in $items)
{
#
# Suppress error messages
#
trap { Write-Output "Error trapped"; continue; }
#
# Read raw PDF data
#
$pdfText = Get-Content $item -raw
#
# Find string (near end of PDF file), if BAD file, ptr will be undefined or 0
#
$ptr1 = $pdfText.IndexOf("CreationDate")
$ptr2 = $pdfText.IndexOf("ModDate")
#
# Grab raw dates from file - will ERR if ptr is undefined or 0
#
try { $cDate = $pdfText.SubString($ptr1, 37); $mDate = $pdfText.SubString($ptr2, 31); }
#
# Append filename and bad status to logfile and increment a counter
# catch block is also where you would rename, move, or delete bad files.
#
catch { "*** $item is Broken ***" >> $logFile; $badCounter += 1; continue; }
#
# Append filename and good status to logfile
#
Write-Output "$item - OK" -EA "Stop" >> $logFile
#
# Increment a counter
#
$goodCounter += 1
}
#
# Calculate total
#
$totalCounter = $badCounter + $goodCounter
#
# Append 3 blank lines to end of logfile
#
1..3 | %{ Write-Output "" >> $logFile }
#
# Append statistics to end of logfile
#
Write-Output "Total: $totalCounter/BAD: $badCounter/GOOD: $goodCounter" >> $logFile
Write-Output "DONE!`n`n"
私には何の示唆もありませんが、いくつかの示唆を伝えることができます。おそらく、それらの読み込み操作が失敗した場合、あなたはpdfが動作していないことを知ることができます –
"PDFを読む"という意味なら、私は元の質問で、私はitextsharpを使ってAdobe Acrobatで失敗したPDFエラーは発生しません。 –
"オープンファイル"のC#コードを考えていましたが、これについて考えていますが、不正なイメージフォーマットのためにクラッシュした場合は、アクロバットリーダーを実行した場合にのみチェックすることができます。あなたがファイルを開くためにそれを実行した後に、小さなプログラム/バッチファイル/アングロの戻り値をチェックするようなものはどうですか? –