2011-07-27 14 views
4

私は秘書が多機能プリンタで署名した文書をスキャンすることによって作成するPDFファイルを圧縮するプロセスを持っています。PDFファイルが「良好」であることを確認する方法を教えてください。

まれに、これらのファイルを圧縮後にAcrobat Readerで開くことはできません。私はこれがまれにしか起こっていない理由を知らないので、PDFの圧縮後をテストし、それが「良い」ものかどうかを確認したいと思います。

これを達成するためにitextsharp 5.1.1を使用しようとしていますが、うまくいけばPDFを読み込みます。私の最高の推測は、Acrobat Readerが画像を表示しようとすると失敗するということです。

PDFのレンダリング方法を教えてください。

+0

私には何の示唆もありませんが、いくつかの示唆を伝えることができます。おそらく、それらの読み込み操作が失敗した場合、あなたはpdfが動作していないことを知ることができます –

+0

"PDFを読む"という意味なら、私は元の質問で、私はitextsharpを使ってAdobe Acrobatで失敗したPDFエラーは発生しません。 –

+0

"オープンファイル"のC#コードを考えていましたが、これについて考えていますが、不正なイメージフォーマットのためにクラッシュした場合は、アクロバットリーダーを実行した場合にのみチェックすることができます。あなたがファイルを開くためにそれを実行した後に、小さなプログラム/バッチファイル/アングロの戻り値をチェックするようなものはどうですか? –

答えて

3

私がやったことは、itextsharpを使ってすべてのストリームオブジェクトをループし、その長さをチェックすることでした。私が持っていたエラー条件は、長さがゼロになるということでした。このテストはかなり信頼できるようです。それは誰にとってもうまくいかないかもしれませんが、この特定の状況では機能しました。

+0

私はレールアプリでエビを介して有効なPDFを生成したことを確認したいと思っていました。私の場合、無効なpdfの長さは1になります。 – sockmonk

3

これまでのような状況で、を使用して、無効なPDFを修復しました。このようなコマンドはpdftk broken.pdf output fixed.pdfです。

+0

ewall、この場合、まだ良いオリジナルがあるので、私はPDFを修復する必要はありません。この場合、PDFをテストするための信頼できる方法が必要です。しかし、このツールは多くの状況で非常に役立つように見えるので、この提案をお寄せいただきありがとうございます。 –

+0

それは理にかなっています。私はあなたが修正プログラムを実行し、元の(MD5またはSHA-1ハッシュ、または単にファイルサイズ)を介して出力ファイルを比較して、変更されているかどうかを確認するための何かを行うことができると思いますか?私が協力していたシステムでは、悪いPDFを出力したのが約5%だったので、確実にpdftkを使ってすべてを実行しました。 – ewall

0

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" 
関連する問題