पीडीएफ फाइलों की अखंडता को सत्यापित / सत्यापित करें


11

क्या कोई ऐसा उपकरण है जिसे मैं पीडीएफ अभिलेखागार (सभी निर्देशिकाओं) पर चला सकता हूं और अंत में यह भ्रष्ट / अमान्य पीडीएफ की सूची / पहचान करता है?

मेरे कंप्यूटर (विंडोज मशीन) पर सैकड़ों पीडीएफ फाइलें (प्रलेखन आदि से संबंधित) हैं, और बहुत बार मुझे ईमेल के माध्यम से दर्जनों पीडीएफ भेजने / प्राप्त करने होते हैं। अब यह एक सामान्य दिनचर्या है कि मुझे जो पीडीएफ प्राप्त होता है या भेजा जाता है वह दूषित है। यह कभी-कभी गंभीर परेशानी पैदा करता है, जब स्रोत फ़ाइल (उदाहरण के लिए Word फ़ाइल या टेक्स फ़ाइल अनुपलब्ध है / तुरंत उपलब्ध नहीं है)।

इन हजारों PDF की जाँच करना परिमित समय में संभव नहीं है, इसलिए मैंने एक ऐसे उपकरण की खोज की जिसे मैं एक बार चला सकता हूँ और यह सभी PDF (निर्देशिकाओं और उप-निर्देशिकाओं में) को स्कैन करता है, और अंत में मुझे उन फ़ाइलों की एक सूची मिलती है, जिन्हें मुझे पुनः प्राप्त करना चाहिए -सृजन करना। अब तक, ऐसा लगता है कि ऐसा कोई उपकरण नहीं है।


2
यदि आप linux पर हैं तो pdfinfo आज़माएँ।
जरा देखिए


जवाबों:


6

PDFtk का उपयोग करके यह जांचना काफी आसान है कि कोई पीडीएफ फाइल वैध है या नहीं। PDFtk के लिए एक मुफ्त GUI पीडीएफ लैब्स से उपलब्ध है । जब आप इस टूल को चलाते हैं, तो आप कई डायरेक्टरी (Add files बटन का उपयोग करके) से अपनी इच्छानुसार कई PDF लोड कर सकते हैं, और फिर यह बहुत ही तेज़ी से इन पीडीएफ फाइलों में पेज एक्सेस करना शुरू कर देगा।

यदि चयनित PDF में से कोई भी फ़ाइल मान्य PDF नहीं है, तो यह उपयोगिता त्रुटि के बारे में एक संदेश दिखाएगी, और इसे स्वचालित रूप से चयन विंडो से हटा देगी।

इसलिए आप PDFtk के साथ इस प्रक्रिया का उपयोग करके कई घंटे बचा सकते हैं। इसके अतिरिक्त, यदि आपके पास मल्टीकोर सीपीयू है, तो आप इस उपयोगिता के कई उदाहरण चला सकते हैं और प्रत्येक उदाहरण में सैकड़ों पीडीएफ में फेंक सकते हैं।

मैं पिछले 1 साल से इस सॉफ्टवेयर का उपयोग कर रहा हूं, और यह सबसे आसान पीडीएफ टूल है जिसका मैंने कभी उपयोग किया है।


2
वैकल्पिक रूप से, उपकरण (pdfinfo.exe) लिंक marcwho ने उल्लेख से उपलब्ध, आप कर सकते हैं का उपयोग कर cdमें FolderContainingPDFsऔर Windows शेल में निम्न आदेश चला, और यह एक लॉग फ़ाइल में अमान्य पीडीएफ फाइल का प्रतीक होगा: FORFILES /S /M *.pdf /C "cmd /c echo. & echo @path @fname & D:\XPDF_3.04\bin64\pdfinfo.exe @file" 1>text.txt 2>&1
मुबीन शाहिद

4

मैंने भ्रष्टाचार के लिए पीडीएफ फाइलों की जांच के लिए xpdfbin- विन पैकेज और cpdf.exe से "pdfinfo.exe" का उपयोग किया है, लेकिन यदि आवश्यक नहीं था तो एक बाइनरी को शामिल नहीं करना चाहता था।

मैंने पढ़ा है कि नए पीडीएफ प्रारूप में अंत में एक पठनीय xml डेटा कैटलॉग है, इसलिए मैंने नियमित रूप से विंडोज़ NOTEPAD.exe के साथ पीडीएफ खोला और अंत तक अपठनीय डेटा को पिछले स्क्रॉल किया और कई पठनीय कुंजियों को देखा। मुझे केवल एक कुंजी की आवश्यकता थी, लेकिन क्रिएशनडेट और मोडडेट दोनों का उपयोग करना चुना।

निम्न Powershell (PS) स्क्रिप्ट वर्तमान निर्देशिका में सभी PDF फ़ाइलों की जांच करेगी और प्रत्येक की स्थिति को एक टेक्स्ट फ़ाइल (! RESULTS.log) में आउटपुट करेगी। 35,000 पीडीएफ फाइलों के खिलाफ इसे चलाने में लगभग 2 मिनट का समय लगा। मैंने उन लोगों के लिए टिप्पणियाँ जोड़ने की कोशिश की जो 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 के नक्शेकदम पर चलते हुए, मैंने एक पीडीएफ स्क्रिप्ट को PDFinfo के साथ एक विशिष्ट फ़ोल्डर में सभी PDF की जांच करने और इसे ठीक करने के प्रयास के रूप में टूटने पर 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 मिलेगा (जो कि मेरे लिए सही नहीं है, लेकिन काफी अच्छा है)। नोट: एक पुनर्निर्मित पीडीएफ में कम त्रुटियां हैं और एक नियमित पीडीएफ दर्शक के साथ देखा जाना चाहिए। लेकिन इसका मतलब यह नहीं है कि आप अपनी सारी सामग्री वापस पा लें। अप्राप्य सामग्री खाली पृष्ठों की ओर ले जाती है।

मैंने JHOVE (ओपन सोर्स फाइल फॉर्मेट आइडेंटिफिकेशन, वेलिडेशन एंड कैरेक्टराइजेशन टूल) के साथ भी ऐसा ही प्रयास किया, जैसा कि @kraftydevil द्वारा यहाँ सुझाया गया है: जाँच करें कि क्या पीडीएफ फाइलें लिनक्स पर कमांड लाइन का उपयोग करके दूषित हैं और अब यह पुष्टि कर सकती है कि यह भी एक वैध तरीका है। (पहले मुझे कम सफलता मिली थी। लेकिन फिर मैंने देखा कि मैंने JHOVE के आउटपुट को सही तरीके से नहीं संभाला है।)

एक पाठ संपादक (हटाए गए स्ट्रीम, इसलिए पृष्ठ मेरे पीडीएफ दर्शक, रेंडर किए गए पीडीएफ टैग और कुछ बिट्स को स्थानांतरित करने में विफल रहे) के साथ दोनों तरीकों से मैंने पीडीएफ से यादृच्छिक भागों को हटा दिया और बदल दिया। परिणाम है: 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 विंडोज बैच फॉर-लूप मेरे अनुमान से बहुत अधिक बचा है। मैं एक नमूना के रूप में बैश स्क्रिप्ट कार्यान्वयन दिया।
wp78de

लिनक्स के लिए जाने का रास्ता भी लगता है: stackoverflow.com/a/9612232/8291949
wp78de
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.