2011-07-27 5 views
4

저는 비서가 다기능 프린터에서 서명 한 문서를 스캔하여 작성한 PDF 파일을 압축하는 프로세스를 가지고 있습니다.PDF 파일이 "양호"한지 어떻게 확인할 수 있습니까?

드문 경우지만 압축 후 Acrobat 판독기에서 이러한 파일을 열 수 없습니다. 나는 이것이 왜 드문 일인지 잘 모르겠다. 그래서 나는 PDF 압축을 테스트하고 그것이 "좋은가"를 볼 수 있기를 바란다.

이것을 달성하기 위해 itextsharp 5.1.1을 사용하려하지만 행복하게 PDF를로드합니다. 내 생각 엔 Acrobat Reader가 그림을 표시하려고 할 때 실패합니다.

PDF가 렌더링되는지 어떻게 알 수 있습니까?

+0

나는 어떤 생각이 들지 않지만, 몇 가지 제안을 할 수 있습니다. 어쩌면 그 읽기 작업이 실패하면 PDF가 작동하지 않는다는 것을 알 수 있습니다. –

+0

"PDF 읽기"를 의미하는 경우, 원래의 질문에서 itextsharp를 사용하여 Adobe Acrobat에서 실패한 PDF를 읽는 것을 언급합니다. 오류가 발생하지 않습니다. –

+0

나는 "open file"로 C# 코드를 생각하고 있었지만 잘못된 생각으로 인해 충돌하는 경우 Acrobat Reader를 실행해야만 확인할 수 있습니다. 작은 프로그램/배치 파일/dunno 같은 파일을 열려면 그것을 실행 한 후 반환 값을 확인하려면 어때? –

답변

3

좋아, 결국 나는 itextsharp를 사용하여 모든 스트림 개체를 반복하고 길이를 확인했다. 내가 가진 오류 상태는 길이가 0 일 것입니다. 이 테스트는 상당히 신뢰할만한 것으로 보입니다. 모든 사람에게 적용되는 것은 아니지만이 특정 상황에서 효과가있었습니다.

+0

난 레일 애플 리케이션에서 새우를 통해 유효한 PDF를 생성했는지 확인하고 싶었고, 길이를 확인해 주었다. 필자의 경우 잘못된 pdf의 길이는 1입니다. – sockmonk

3

이전의 비슷한 상황에서 을 사용하여 잘못된 PDF를 다음과 같은 명령으로 성공적으로 복구했습니다 : pdftk broken.pdf output fixed.pdf.

+0

ewall,이 경우에는 원본이 여전히 남아 있기 때문에 PDF를 복구 할 필요가 없습니다. 이 경우 PDF를 테스트 할 때 신뢰할 수있는 방법이 필요합니다. 이 도구는 여러 상황에서 매우 유용하기 때문에이 제안에 감사드립니다. –

+0

그건 의미가 있습니다.난 당신이 수정 프로그램을 실행 한 다음 원본 파일 (MD5 또는 SHA-1 해시 또는 파일 크기를 통해)과 비교하여 변경 여부를 확인할 수 있다고 생각하십니까? 한 시스템에서 필자는 5 % 정도의 시간 동안 나쁜 PDF 파일을 출력한다는 것을 발견 했으므로 pdftk 픽스를 통해 모든 것을 실행했습니다. – ewall

0

xpdfbin-win 패키지의 "pdfinfo.exe"와 cpdf.exe를 사용하여 PDF 파일의 손상 여부를 확인했지만 필요하지 않은 경우 이진 파일을 포함하고 싶지 않았습니다.

최신 PDF 형식 끝에 읽을 수있는 XML 데이터 카탈로그가 있으므로 일반 Windows NOTEPAD.exe가있는 PDF를 열었으며 읽을 수없는 데이터를 끝까지 스크롤하여 여러 가지 읽을 수있는 키를 보았습니다. 하나의 키만 있으면되지만 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" 
관련 문제