ตรวจสอบ / ตรวจสอบความสมบูรณ์ของไฟล์ PDF


11

มีเครื่องมือใดบ้างที่ฉันสามารถใช้กับไฟล์เก็บถาวร PDF (ทุกไดเรกทอรี) และในที่สุดมันก็แสดงรายการ / ระบุ PDF ที่เสียหาย / ไม่ถูกต้อง?

ฉันมีไฟล์ PDF หลายร้อยไฟล์ (ที่เกี่ยวข้องกับเอกสารประกอบ ฯลฯ ) บนคอมพิวเตอร์ของฉัน (เครื่อง Windows) และบ่อยครั้งที่ฉันได้รับ / ต้องส่งไฟล์ PDF จำนวนมากผ่านทางอีเมล ตอนนี้เป็นกิจวัตรปกติที่ PDF ที่ฉันได้รับหรือส่งเสียหาย สิ่งนี้สร้างปัญหาร้ายแรงบางครั้งเมื่อไฟล์ต้นฉบับ (เช่นไฟล์ Word หรือไฟล์เท็กซ์หายไป / ไม่สามารถใช้งานได้ทันที)

การตรวจสอบ PDF หลายพันรายการเหล่านี้เป็นไปไม่ได้ในเวลาที่ จำกัด ดังนั้นฉันจึงค้นหาเครื่องมือที่ฉันสามารถเรียกใช้ครั้งเดียวและสแกนไฟล์ PDF ทั้งหมด (ในไดเรกทอรีและไดเรกทอรีย่อย) และในที่สุดฉันก็ได้รับรายการไฟล์เหล่านั้นที่ฉันควร -สร้าง. ไม่เกินตอนนี้ดูเหมือนว่าจะไม่มีเครื่องมือดังกล่าว


2
หากคุณอยู่ใน linux ลอง pdfinfo ดูได้ที่: superuser.com/questions/580887/…
marcwho

1
ยังพิจารณาJHOVE - JSTOR / ฮาร์วาร์วัตถุการตรวจสอบสิ่งแวดล้อม
Dan D.

อาจเกี่ยวข้องอย่างหลวม ๆ : ฉันจะค้นหาและลบรูปภาพที่เสียหายจากไดเรกทอรีได้อย่างไร   และโดยอัตโนมัติสแกนของกราฟิกไฟล์สำหรับความเสียหาย
สกอตต์

คำตอบ:


6

มันค่อนข้างง่ายในการตรวจสอบว่าไฟล์ PDF นั้นถูกต้องหรือไม่โดยใช้ PDFtk GUI ฟรีสำหรับ pdftkสามารถใช้ได้จากรูปแบบไฟล์ PDF Labs เมื่อคุณเรียกใช้เครื่องมือนี้คุณสามารถโหลด PDF ได้มากเท่าที่คุณต้องการจากหลายไดเรกทอรี (โดยใช้ปุ่มเพิ่มไฟล์) จากนั้นมันจะเริ่มเข้าถึงหน้าต่างๆในไฟล์ PDF เหล่านี้อย่างรวดเร็ว

หากไฟล์ใด ๆ ในไฟล์ PDF ที่เลือกไม่ใช่ไฟล์ PDF ที่ถูกต้องยูทิลิตี้นี้จะแสดงข้อความเกี่ยวกับข้อผิดพลาดและจะลบออกโดยอัตโนมัติจากหน้าต่างการเลือก

ดังนั้นคุณสามารถประหยัดเวลาหลายชั่วโมงโดยใช้ขั้นตอนนี้ด้วย PDFtk นอกจากนี้หากคุณมี CPU แบบมัลติคอร์คุณสามารถเรียกใช้หลายอินสแตนซ์ของยูทิลิตี้นี้และส่ง 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 Shahid

4

ฉันใช้ "pdfinfo.exe" จากแพ็คเกจ xpdfbin-win และ cpdf.exe เพื่อตรวจสอบความเสียหายของไฟล์ PDF แต่ไม่ต้องการเกี่ยวข้องกับไบนารีหากไม่จำเป็น

ฉันอ่านว่ารูปแบบ PDF ที่ใหม่กว่ามีแคตตาล็อกข้อมูล xml ที่อ่านได้ในตอนท้ายดังนั้นฉันจึงเปิด PDF ด้วย windows NOTEPAD.exe ปกติและเลื่อนลงมาผ่านข้อมูลที่อ่านไม่ได้จนจบและเห็นคีย์ที่อ่านได้หลายปุ่ม ฉันต้องการเพียงคีย์เดียว แต่เลือกที่จะใช้ทั้ง CreationDate และ ModDate

สคริปต์ Powershell (PS) ต่อไปนี้จะตรวจสอบไฟล์ PDF ทั้งหมดในไดเรกทอรีปัจจุบันและส่งออกสถานะของแต่ละไฟล์เป็นไฟล์ข้อความ (! RESULTS.log) ใช้เวลาประมาณ 2 นาทีในการเรียกใช้ไฟล์นี้กับไฟล์ PDF 35,000 ไฟล์ ฉันพยายามเพิ่มความคิดเห็นสำหรับผู้ที่ยังใหม่กับ 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

หรือเหมือนกับสคริปต์ทุบตี:

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-loop แบบแบตช์ของ Windows ช่วยฉันเดาได้มากขึ้น ฉันใช้ bash script เป็นตัวอย่าง
wp78de

สำหรับดูเหมือนจะเป็นวิธีที่จะไปสำหรับ Linux ด้วย: stackoverflow.com/a/9612232/8291949
wp78de
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.