Перевірка / перевірка цілісності файлів PDF


11

Чи є який-небудь інструмент, який я можу запустити в архівах PDF-файлів (усі каталоги) і, нарешті, він перераховує / ідентифікує корумповані / недійсні PDF-файли?

У мене на комп’ютері (машина Windows) сотні файлів PDF (пов'язані з документацією тощо), і дуже часто мені надходить / доводиться надсилати десятки PDF-файлів електронною поштою. Зараз нормальною процедурою є пошкодження PDF, який я отримую або надсилаю. Це створює серйозні проблеми іноді, коли вихідний файл (наприклад, Word-файл або файл Tex відсутній / недоступний миттєво).

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


2
Якщо ви користуєтесь Linux, спробуйте pdfinfo. Подивіться на: superuser.com/questions/580887/…
marcwho


Відповіді:


6

За допомогою PDFtk перевірити, чи PDF-файл є дійсним, досить легко. З PDF Lab доступний безкоштовний графічний інтерфейс для PDFtk . Запустивши цей інструмент, ви можете завантажити скільки завгодно PDF-файлів, як хочете, з декількох каталогів (за допомогою кнопки Додати файли), і тоді він дуже швидко почне доступ до сторінок цих файлів PDF.

Якщо жоден файл серед вибраних PDF-файлів не є дійсним PDF, ця утиліта покаже повідомлення про помилку та автоматично видалить її з вікна вибору.

Отже, ви можете заощадити багато годин за допомогою цієї процедури за допомогою PDFtk. Крім того, якщо у вас багатоядерний процесор, ви можете запускати кілька екземплярів цієї утиліти і передавати сотні PDF-файлів у кожному екземплярі.

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


2
Крім того , з допомогою інструменту (pdfinfo.exe) доступний за посиланням згаданої marcwho, ви можете cdв FolderContainingPDFsі запустити наступну команду в оболонці Windows, і це буде означати неприпустимий файл PDF в файл журналу: FORFILES /S /M *.pdf /C "cmd /c echo. & echo @path @fname & D:\XPDF_3.04\bin64\pdfinfo.exe @file" 1>text.txt 2>&1
Mubeen Шахід

4

Я використовував "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 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"

3

Слідуючи крокам @ 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 "bad -> try to fix"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        mv %%f .\\bak\\%%f
    ) else (
       REM echo good        
    )
)
@ECHO ON

Або те саме, що і bash script:

for file in $(find . -iname "*.pdf")
do
    echo "$file"
    pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null
    if [ $? == 0 ]; then
       echo "broken -> try to fix"
       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:"Well-Formed and valid" >nul 2>&1
    if not errorlevel 1 (
        echo good
    ) else (
        echo "bad -> try to fix"
        @cpdf -i %%f -o %%f_.pdf 2>NUL
        REM mv %%f .\\bak\\%%f
    )
)
@ECHO ON


Дякую @Scott Пакетна FOR-петля Windows набагато більше, напевне, я думаю. Я дав реалізацію сценарію bash просто як зразок.
wp78de

Для здається, шлях для Linux теж: stackoverflow.com/a/9612232/8291949
wp78de
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.