Как я могу проверить, что файл PDF "хорош"? - PullRequest
5 голосов
/ 27 июля 2011

У меня есть процесс, который сжимает PDF-файлы, которые наши секретари создают путем сканирования подписанных документов на многофункциональном принтере.

В редких случаях эти файлы не могут быть открыты в Acrobat Reader после сжатия.Я не знаю, почему это происходит редко, поэтому я хотел бы иметь возможность протестировать PDF после сжатия и посмотреть, хорошо ли это.

Я пытаюсь использовать itextsharp 5.1.1чтобы сделать это, но он с удовольствием загружает PDF.Я думаю, что Acrobat Reader не работает, когда пытается отобразить изображение.

Есть идеи, как определить, будет ли PDF отображаться?

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

ОК, в итоге я использовал itextsharp для циклического прохождения всех потоковых объектов и проверки их длины. У меня было условие ошибки: длина будет равна нулю. Этот тест кажется довольно надежным. Это может не сработать для всех, но в данной конкретной ситуации это сработало.

3 голосов
/ 03 августа 2011

В подобных ситуациях в прошлом я успешно использовал PDF Toolkit (a / k / a pdftk) для исправления плохих PDF-файлов с помощью такой команды: pdftk broken.pdf output fixed.pdf.

0 голосов
/ 25 мая 2017

Я использовал pdfinfo.exe из пакета xpdfbin-win и cpdf.exe для проверки файлов PDF на наличие повреждений, но не хотел использовать двоичный файл, если в этом нет необходимости.

Я прочитал, что в новых форматах PDF в конце есть читаемый каталог данных xml, поэтому я открыл PDF с обычными окнами NOTEPAD.exe и прокрутил до конца нечитаемые данные и увидел несколько читаемых клавиш. Мне нужен был только один ключ, но я решил использовать CreationDate и ModDate.

Следующий скрипт Powershell (PS) проверит ВСЕ PDF-файлы в текущем каталоге и выведет их статус в текстовый файл (! RESULTS.log). Потребовалось около 2 минут, чтобы запустить это с 35 000 PDF-файлов. Я попытался добавить комментарии для тех, кто плохо знаком с 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"
...