Validasi / verifikasi integritas file PDF

11

Apakah ada alat yang bisa saya jalankan di arsip PDF (semua direktori) dan akhirnya daftar / mengidentifikasi PDF yang korup / tidak valid?

Saya memiliki ratusan file PDF (terkait dengan dokumentasi dll.) Di komputer saya (mesin Windows), dan sangat sering saya menerima / harus mengirim lusinan PDF melalui email. Sekarang sudah menjadi rutinitas normal bahwa PDF yang saya terima atau kirim rusak. Ini terkadang menimbulkan masalah serius, ketika file sumber (mis. File Word atau file Tex hilang / tidak tersedia secara instan).

Memeriksa ribuan PDF ini tidak mungkin dilakukan dalam waktu yang terbatas, jadi saya mencari alat yang dapat saya jalankan sekali dan memindai semua PDF (dalam direktori dan sub-direktori), dan akhirnya saya mendapatkan daftar file-file yang harus saya ulangi. -membuat. Sampai sekarang, sepertinya tidak ada alat seperti itu.

Laksamana
sumber
2
Jika Anda menggunakan linux, coba pdfinfo. Lihatlah: superuser.com/questions/580887/…
marcwho

Jawaban:

6

Sangat mudah untuk memeriksa apakah file PDF valid, dengan menggunakan PDFtk. Sebuah GUI gratis bagi pdftk tersedia dari PDF Labs . Ketika Anda menjalankan alat ini, Anda dapat memuat PDF sebanyak yang Anda inginkan, dari banyak direktori (dengan menggunakan tombol Tambah file), dan kemudian akan mulai mengakses halaman dalam file PDF ini, dengan sangat cepat.

Jika ada file di antara PDF yang dipilih adalah PDF yang tidak valid, utilitas ini akan menampilkan pesan tentang kesalahan, dan akan menghapusnya secara otomatis dari jendela pilihan.

Karenanya Anda dapat menghemat banyak waktu menggunakan prosedur ini dengan PDFtk. Selain itu, jika Anda memiliki CPU multicore, Anda dapat menjalankan beberapa instance dari utilitas ini dan memasukkan ratusan PDF di setiap instance.

Saya menggunakan perangkat lunak ini sejak 1 tahun terakhir, dan ini adalah alat PDF paling praktis yang pernah saya gunakan.

Mubeen Shahid
sumber
2
Atau, dengan menggunakan alat (pdfinfo.exe) yang tersedia dari tautan yang disebutkan oleh marcwho, Anda dapat cdmasuk FolderContainingPDFsdan menjalankan perintah berikut dalam shell Windows, dan itu akan menandai file PDF yang tidak valid dalam file log: 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 Shahid
4

Saya telah menggunakan "pdfinfo.exe" dari paket xpdfbin-win dan cpdf.exe untuk memeriksa file PDF untuk korupsi, tetapi tidak ingin melibatkan biner jika tidak diperlukan.

Saya membaca bahwa format PDF yang lebih baru memiliki katalog data xml yang dapat dibaca di akhir, jadi saya membuka PDF dengan windows NOTEPAD.exe biasa dan menggulir ke bawah melewati data yang tidak dapat dibaca sampai akhir dan melihat beberapa kunci yang dapat dibaca. Saya hanya membutuhkan satu kunci, tetapi memilih untuk menggunakan CreationDate dan ModDate.

Skrip Powershell (PS) berikut ini akan memeriksa SEMUA file PDF di direktori saat ini dan mengeluarkan status masing-masing ke dalam file teks (! RESULTS.log). Butuh sekitar 2 menit untuk menjalankan ini terhadap 35.000 file PDF. Saya mencoba menambahkan komentar untuk mereka yang baru mengenal PS. Semoga ini menghemat waktu seseorang. Mungkin ada cara yang lebih baik untuk melakukan ini, tetapi ini berfungsi dengan sempurna untuk tujuan saya dan menangani kesalahan secara diam-diam. Anda mungkin perlu mendefinisikan yang berikut di awal: $ ErrorActionPreference = "SilentlyContinue" jika Anda melihat kesalahan di layar.

Salin yang berikut ke dalam file teks dan beri nama dengan tepat (mis: CheckPDF.ps1) atau buka PS dan telusuri ke direktori yang berisi file PDF untuk memeriksa dan menempelkannya di konsol.

#
# 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"
tidak
sumber
3

Mengikuti jejak @ n0nuf, saya menulis skrip batch untuk memeriksa semua PDF dalam folder tertentu dengan pdfinfo dan mendorongnya melalui cpdf jika rusak sebagai upaya untuk memperbaikinya:

@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

Atau sama dengan skrip bash:

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 yang rusak akan dipindahkan ke subfolder \ bak dan PDF yang dibuat ulang mendapatkan akhiran _.pdf (yang tidak sempurna, tetapi cukup baik untuk saya). CATATAN: PDF yang dibuat ulang mengandung kesalahan yang lebih sedikit dan harus dapat dilihat dengan penampil PDF biasa. Tapi ini tidak berarti Anda mendapatkan semua konten Anda kembali. Konten yang tidak dapat dikembalikan mengarah ke halaman kosong.

Saya juga mencoba hal yang sama dengan JHOVE (Identifikasi format file sumber terbuka, alat validasi & karakterisasi) seperti yang disarankan oleh @kraftydevil di sini: Periksa apakah file PDF rusak menggunakan baris perintah di Linux dan sekarang dapat mengkonfirmasi ini juga merupakan pendekatan yang valid. (Pertama saya kurang sukses. Tapi kemudian saya perhatikan saya tidak menangani hasil JHOVE dengan benar.)

Untuk menguji kedua pendekatan saya menghapus dan mengubah bagian acak dari PDF dengan editor teks (aliran dihapus, sehingga halaman gagal membuat di penampil PDF saya, mengubah Tag PDF, dan menggeser beberapa bit). Hasilnya adalah: Baik pdfinfo dan JHOVE dapat menemukan file yang rusak dengan benar (JHOVE bahkan lebih sensitif dalam beberapa kasus).

Dan di sini adalah skrip yang setara untuk 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
wp78de
sumber
@Scott terima kasih. Batch Windows UNTUK-loop jauh lebih hemat saya kira. Saya memberikan implementasi script bash hanya sebagai sampel.
wp78de
Sebab tampaknya juga cara untuk menggunakan Linux: stackoverflow.com/a/9612232/8291949
wp78de