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"
나는 어떤 생각이 들지 않지만, 몇 가지 제안을 할 수 있습니다. 어쩌면 그 읽기 작업이 실패하면 PDF가 작동하지 않는다는 것을 알 수 있습니다. –
"PDF 읽기"를 의미하는 경우, 원래의 질문에서 itextsharp를 사용하여 Adobe Acrobat에서 실패한 PDF를 읽는 것을 언급합니다. 오류가 발생하지 않습니다. –
나는 "open file"로 C# 코드를 생각하고 있었지만 잘못된 생각으로 인해 충돌하는 경우 Acrobat Reader를 실행해야만 확인할 수 있습니다. 작은 프로그램/배치 파일/dunno 같은 파일을 열려면 그것을 실행 한 후 반환 값을 확인하려면 어때? –