Проверить/подтвердить целостность PDF файлов

Вопрос или проблема

Существуют ли какие-либо инструменты, которые я могу запустить на архивах PDF (все каталоги) и, в конечном итоге, они перечислят/идентифицируют поврежденные/недействительные PDF?

У меня на компьютере (машина Windows) есть сотни PDF файлов (связанных с документацией и т.д.), и очень часто я получаю/должен отправлять десятки PDF по электронной почте. Сейчас это нормальная рутина, что PDF, который я получаю или отправляю, повреждён. Это создает серьезные проблемы иногда, когда исходный файл (например, файл Word или файл Tex) отсутствует/недоступен мгновенно.

Проверка этих тысяч файлов PDF не возможна в конечное время, поэтому я искал инструмент, который я мог бы запустить один раз, и он бы сканировал все PDF (в каталогах и подкаталогах), и в конце я бы получил список файлов, которые мне нужно воссоздать. До сих пор, кажется, такого инструмента нет.

Довольно легко проверить, является ли файл PDF действительным, с помощью PDFtk. Бесплатная графическая оболочка для PDFtk доступна на сайте PDF Labs. Когда вы запускаете этот инструмент, вы можете загрузить столько PDF, сколько хотите, из нескольких каталогов (используя кнопку “Добавить файлы”), и затем он начнёт очень быстро обращаться к страницам в этих PDF файлах.

Если какой-либо файл среди выбранных PDF не является действительным PDF, это утилита покажет сообщение об ошибке и автоматически удалит его из окна выбора.

Таким образом, вы можете сэкономить много часов, используя эту процедуру с PDFtk. Кроме того, если у вас многоядерный процессор, вы можете запустить несколько экземпляров этой утилиты и бросить сотни PDF в каждый экземпляр.

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

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

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

Следующий скрипт PowerShell (PS) проверит ВСЕ файлы PDF в текущем каталоге и выводит статус каждого в текстовый файл (!RESULTS.log). Это заняло около 2 минут, чтобы запустить это на 35,000 файлов PDF. Я пытался добавить комментарии для тех, кто является новичком в PS. Надеюсь, это сэкономит кому-то время. Вероятно, есть лучший способ сделать это, но это работает безупречно для моих целей и тихо обрабатывает ошибки. Вам может потребоваться задать следующее в начале: $ErrorActionPreference = “SilentlyContinue”, если вы увидите ошибки на экране.

Скопируйте следующее в текстовый файл и назовите его соответствующим образом (например, CheckPDF.ps1) или откройте PS и перейдите в каталог, содержащий файлы PDF для проверки, и вставьте его в консоль.

#
# PowerShell v4.0
#
# Получить все PDF файлы в текущем каталоге
#
$items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}

$logFile = "!RESULTS.log"
$badCounter = 0
$goodCounter = 0
$msg = "`n`nОбработка " + $items.count + " файлов... "
Write-Host -nonewline -foregroundcolor Yellow $msg
foreach ($item in $items)
{
    #
    # Подавить сообщения об ошибках
    #
    trap { Write-Output "Ошибка обнаружена"; continue; }

    #
    # Читать исходные данные PDF
    #
    $pdfText = Get-Content $item -raw

    #
    # Найти строку (ближе к концу PDF файла), если файл ПЛОХОЙ, ptr будет неопределён или 0
    #
    $ptr1 = $pdfText.IndexOf("CreationDate")
    $ptr2 = $pdfText.IndexOf("ModDate")

    #
    # Извлечь исходные даты из файла - будет ОШИБКА, если ptr равен 0
    #
    try { $cDate = $pdfText.SubString($ptr1, 37); $mDate = $pdfText.SubString($ptr2, 31); }

    #
    # Добавить имя файла и плохой статус в файл журнала и увеличить счётчик
    # блок catch также является местом, где вы бы переименовали, переместили или удалили плохие файлы.
    #
    catch { "*** $item повреждён ***" >> $logFile; $badCounter += 1; continue; }

    #
    # Добавить имя файла и хороший статус в файл журнала
    #
    Write-Output "$item - OK" -EA "Stop" >> $logFile

    #
    # Увеличить счётчик
    #
    $goodCounter += 1
}
#
# Вычислить сумму
#
$totalCounter = $badCounter + $goodCounter

#
# Добавить 3 пустых строки в конец файла журнала
#
1..3 | %{ Write-Output "" >> $logFile }

#
# Добавить статистику в конец файла журнала
#
Write-Output "Всего: $totalCounter / ПЛОХИЕ: $badCounter / ХОРОШИЕ: $goodCounter" >> $logFile
Write-Output "ГОТОВО!`n`n"

Следуя по стопам @n0nuf, я написал пакетный скрипт для проверки всех PDF в определённой папке с помощью pdfinfo и передачи его через cpdf, если он сломан, в попытке исправить:

@ECHO OFF
FOR %%f in (*.PDF) DO (
    echo %%f
    pdfinfo "%%f" 2>&1 | findstr /I "error"  >nul 2>&1
    if not errorlevel 1 (
        echo "плохой -> попытка исправить"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        mv %%f .\\bak\\%%f
    ) else (
       REM echo хороший        
    )
)
@ECHO ON

Или то же самое как Bash скрипт:

for file in $(find . -iname "*.pdf")
do
    echo "$file"
    pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null
    if [ $? == 0 ]; then
       echo "сломанный -> попытка исправить"
       cpdf -i "$file" -o "$file"_.pdf
    fi
done

Поврежденные PDF будут перемещены в подкаталог \bak, и воссозданные PDF получат суффикс _.pdf (что не идеально, но достаточно хорошо для меня). ПРИМЕЧАНИЕ: Воссозданный PDF содержит меньше ошибок и должен быть доступен для просмотра с обычным просмотрщиком PDF. Но это не означает, что вы получите весь ваш контент обратно. Невосстановимый контент приводит к пустым страницам.

Я также попробовал то же самое с JHOVE (инструмент идентификации, проверки и характеристики формата открытых файлов), как было предложено @kraftydevil здесь: Проверка, повреждены ли файлы PDF с использованием командной строки в Linux и могу теперь подтвердить, что это также действительный подход. (Сначала у меня было меньше успеха. Но затем я заметил, что я неправильно обрабатывал вывод JHOVE.)

Для тестирования обоих подходов я удалил и изменил случайные части из PDF с помощью текстового редактора (удалил потоки, так что страницы не отображались в моём просмотрщике PDF, изменил теги PDF и сдвинул некоторые биты). Результат: Оба pdfinfo и JHOVE способны правильно обнаруживать поврежденные файлы (JHOVE был даже более чувствителен в некоторых случаях).

И вот эквивалентный скрипт для JHOVE:

@ECHO OFF
FOR %%f in (*.PDF) DO (
    echo %%f
    "C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Форматирован и валиден" >nul 2>&1
    if not errorlevel 1 (
        echo хороший
    ) else (
        echo "плохой -> попытка исправить"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        REM mv %%f .\\bak\\%%f
    )
)
@ECHO ON

Также существует (относительно новая) библиотека/инструмент pdfcpu, имеющая функцию валидации:

pdfcpu validate whatever.pdf

Учтите, что на момент написания (август 2020) pdfcpu все ещё находится на стадии Альфа.

К 2025 году появился также Arlington PDF Model Checker, который проверяет PDF относительно Arlington PDF Model.

Модель Arlington представляет собой машиночитаемое представление всех типов объектов, которые определяются ISO 32000-2:2020 (PDF 2.0) и всеми предыдущими версиями PDF.

Установщики Java можно скачать из раздела выпусков VeraPDF.

После установки, запустите программное обеспечение следующим образом:

arlington-pdf-model-checker whatever.pdf > whatever.xml

По умолчанию, проверка модели PDF Arlington автоматически пытается определить версию PDF и затем проверяет файл в соответствии с ней. Используйте опцию -f (псевдоним: --flavour), чтобы принудительно установить определённую версию. Например, следующая команда приведёт к проверке в соответствии с PDF 1.4:

arlington-pdf-model-checker -f arlington1.4 whatever.pdf > whatever.xml

Обратите внимание, что, проще говоря, модель Arlington определяет “грамматику” объектов/словарей PDF, и в результате проверка модели PDF Arlington способна выявить даже малейшие отклонения от спецификации. Однако это не охватывает все аспекты проверки PDF, см. раздел “Ограничения” в The Arlington PDF Model readme.

.

Ответ или решение

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

Анализ существующих методов и инструментов

На рынке существует несколько инструментов и техник, позволяющих проверить целостность PDF-файлов:

  1. PDFtk Toolkit:
    Это мощный инструмент для работы с PDF, который может проверить файлы на наличие ошибок. Бесплатная версия доступна от PDF Labs, и ее можно использовать для обработки большого числа файлов с поддержкой многопоточности.

  2. PowerShell скрипты:
    PowerShell предоставляет возможность написать скрипт, который будет автоматически анализировать все PDF-файлы в заданной директории. Ниже приведен пример скрипта для проверки целостности файлов через использование ключевых данных CreationDate и ModDate в структуре PDF.

    $items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}
    $logFile = "!RESULTS.log"
    $badCounter = 0
    $goodCounter = 0
    
    foreach ($item in $items) {
       $pdfText = Get-Content $item -raw
       $ptr1 = $pdfText.IndexOf("CreationDate")
       $ptr2 = $pdfText.IndexOf("ModDate")
    
       try {
           $cDate = $pdfText.SubString($ptr1, 37)
           $mDate = $pdfText.SubString($ptr2, 31)
           Write-Output "$item - OK" >> $logFile
           $goodCounter += 1
       } catch {
           "*** $item is Broken ***" >> $logFile
           $badCounter += 1
       }
    }
    
    $totalCounter = $badCounter + $goodCounter
    Write-Output "Total: $totalCounter / BAD: $badCounter / GOOD: $goodCounter" >> $logFile
  3. Скрипты для командной строки:
    Использование pdfinfo и cpdf позволяет автоматически проверять и в случае необходимости восстанавливать PDF-файлы. Аналогично, инструменты, такие как JHOVE и pdfcpu, также могут быть использованы для проверки целостности файлов.

  4. Arlington PDF Model Checker:
    Этот инструмент более свежий и предлагает проверку PDF на соответствие модели Arlington, которая представляет машиночитаемое описание формата PDF. Это позволяет выявить даже минимальные отклонения от стандарта, что может быть полезно для углубленной валидации.

Заключение и рекомендации

Для обеспечения максимальной надежности и эффективности рекомендуется выбрать инструмент в зависимости от конкретных нужд и масштабов работы. Для обработки больших объемов и глубокой проверки подойдет использование Arlington PDF Model Checker или JHOVE. Если необходимо быстро проверить большое количество файлов на базовом уровне, PDFtk Toolkit и PowerShell-скрипты могут оказаться наиболее простым и быстродействующим решением.

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

Оцените материал
Добавить комментарий

Капча загружается...