2014-10-07 10 views
7

वर्तमान में मैं एक निर्भरता के रूप में पीईपीडीएफ 2 का उपयोग कर रहा हूं।पीईपीडीएफ 2 डिक्रिप्ट काम नहीं कर रहा

मैं (निम्नलिखित कोड में) कुछ एन्क्रिप्टेड फ़ाइलों का सामना करना पड़ा और सामान्य रूप से संभाला उन्हें:

PDF = PdfFileReader(file(pdf_filepath, 'rb')) 
    if PDF.isEncrypted: 
     PDF.decrypt("") 
     print PDF.getNumPages() 

मेरे filepath "~/blah/FDJKL492019 21,490, LFS.pdf" तरह दिखता है PDF.decrypt ("") 1 लौटाता है, जिसका अर्थ है कि यह सफल रहा। लेकिन जब यह प्रिंट करता है PDF.getNumPages(), यह अभी भी त्रुटि उठाता है, "PyPDF2.utils.PdfReadError: फ़ाइल को डिक्रिप्ट नहीं किया गया है"।

मैं इस त्रुटि से कैसे छुटकारा पा सकता हूं? मैं पीडीएफ फाइल को डबल क्लिक करके ठीक कर सकता हूं (जो डिफ़ॉल्ट रूप से एडोब रीडर के साथ खुलता है)।

उत्तर

5

मेरा खुद का प्रश्न उत्तर देने के लिए: यदि आपके पास अपने फ़ाइल नाम में कोई स्थान है, तो सफलता कोड लौटने के बावजूद पीईपीडीएफ 2 डिक्रिप्ट फ़ंक्शन अंततः विफल हो जाएगा। पीडीपीडीएफ 2 के माध्यम से चलाने से पहले अपने पीडीएफ नामकरण करते समय अंडरस्कोर पर चिपकने का प्रयास करें।

उदाहरण के लिए,

बजाय "FDJKL492019 21,490, LFS.pdf" "FDJKL492019_21490_, LFS.pdf" की तरह कुछ करना।

+0

अच्छी तरह से देखा गया! यह पाइथन या विशेष रूप से इस विशेष पुस्तकालय की सीमा होना चाहिए (इसका पीडीएफ प्रारूप से कोई लेना देना नहीं है)। आप उस साइट पर इसका उल्लेख करना चाह सकते हैं जहां से आपको यह मिला। – usr2564301

+0

ऐसा लगता है कि यह विशेष वर्ण "®ø" आदि का उपयोग करते समय भी विफल रहता है .. – rsm

6

यह त्रुटि के बारे में आ सकता है कारण पीडीएफ पर 128 बिट एईएस एन्क्रिप्शन करने के लिए, को देखने के https://github.com/mstamy2/PyPDF2/issues/53

एक वैकल्पिक हल "qpdf"

qpdf --password='' --decrypt input.pdf output.pdf 

यहां तक ​​कि अगर आप अपनी PDF करता है के साथ सभी isEncrypted pdfs डिक्रिप्ट करने के लिए है पासवर्ड सुरक्षित नहीं दिखता है, यह अभी भी पासवर्ड के साथ एन्क्रिप्ट किया जा सकता है। उपरोक्त स्निपेट मानता है कि यह मामला है।

0

इस विधि के साथ कोई लेना देना नहीं है कि फ़ाइल को getNumPages() विधि का उपयोग करते समय डिक्रिप्ट किया गया है या नहीं।

अगर हम getNumPages() के स्रोत कोड पर एक नज़र डालें:

def getNumPages(self): 
    """ 
    Calculates the number of pages in this PDF file. 

    :return: number of pages 
    :rtype: int 
    :raises PdfReadError: if file is encrypted and restrictions prevent 
     this action. 
    """ 

    # Flattened pages will not work on an Encrypted PDF; 
    # the PDF file's page count is used in this case. Otherwise, 
    # the original method (flattened page count) is used. 
    if self.isEncrypted: 
     try: 
      self._override_encryption = True 
      self.decrypt('') 
      return self.trailer["/Root"]["/Pages"]["/Count"] 
     except: 
      raise utils.PdfReadError("File has not been decrypted") 
     finally: 
      self._override_encryption = False 
    else: 
     if self.flattenedPages == None: 
      self._flatten() 
     return len(self.flattenedPages) 

हम देखेंगे कि यह self.isEncrypted संपत्ति प्रवाह को नियंत्रित करने है। और जैसा कि हम सभी जानते हैं कि isEncrypted संपत्ति केवल पढ़ने योग्य है और पीडीएफ डिक्रिप्ट होने पर भी परिवर्तनीय नहीं है।

तो, आसान तरीका स्थिति से निपटने के सिर्फ डिफ़ॉल्ट मान के रूप रिक्त स्ट्रिंग के साथ की-शब्द तर्क के रूप में पासवर्ड जोड़ सकते हैं और अपना पासवर्ड पारित जब getNumPages() विधि और किसी भी अन्य विधि का उपयोग कर का निर्माण होता है परे यह

1

निम्नलिखित कोड इस समस्या को हल कर सकते हैं:

import os 
import PyPDF2 
from PyPDF2 import PdfFileReader 

fp = open(filename) 
pdfFile = PdfFileReader(fp) 
if pdfFile.isEncrypted: 
    try: 
     pdfFile.decrypt('') 
     print('File Decrypted (PyPDF2)') 
    except: 
     command = ("cp "+ filename + 
      " temp.pdf; qpdf --password='' --decrypt temp.pdf " + filename 
      + "; rm temp.pdf") 
     os.system(command) 
     print('File Decrypted (qpdf)') 
     fp = open(filename) 
     pdfFile = PdfFileReader(fp) 
else: 
    print('File Not Encrypted') 
संबंधित मुद्दे