PyPDF 2 descifrar no funciona

Actualmente estoy usando el PyPDF 2 como una dependencia.

Encontré algunos archivos cifrados y los manejé como lo haría normalmente (en el siguiente código):

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

Mi ruta de archivo se ve algo como “~ / blah / FDJKL492019 21490, LFS.pdf” PDF.decrypt (“”) devuelve 1, lo que significa que fue exitoso. Pero cuando llega a imprimir PDF.getNumPages (), aún genera el error “PyPDF2.utils.PdfReadError: el archivo no se ha descifrado”.

¿Cómo me deshago de este error? Puedo abrir el archivo PDF correctamente haciendo doble clic (que se abre de forma predeterminada con Adobe Reader).

Este error puede deberse a un cifrado AES de 128 bits en el pdf, consulte https://github.com/mstamy2/PyPDF2/issues/53

Una solución es descifrar todos los archivos PDF cifrados con “qpdf”

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

Incluso si su PDF no aparece protegido con contraseña, aún puede estar encriptado sin contraseña. El fragmento anterior asume que este es el caso.

Para responder a mi propia pregunta: Si tiene CUALQUIER espacio en su nombre de archivo, la función de descifrado de PyPDF 2 fallará en última instancia a pesar de haber devuelto un código de éxito. Intente atenerse a los guiones bajos al nombrar sus PDF antes de ejecutarlos a través de PyPDF2.

Por ejemplo,

En lugar de “FDJKL492019 21490, LFS.pdf”, haga algo como “FDJKL492019_21490_, LFS.pdf”.

El siguiente código podría resolver este problema:

 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') 

No tiene nada que ver con si el archivo ha sido descifrado o no al usar el método getNumPages() .

Si echamos un vistazo al código fuente de 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) 

notaremos que es la propiedad self.isEncrypted controla el flujo. Y como todos sabemos, la propiedad isEncrypted es de solo lectura y no se puede cambiar, incluso cuando el pdf está descifrado.

Por lo tanto, la manera fácil de manejar la situación es simplemente agregar la contraseña como argumento de palabra clave con una cadena vacía como valor predeterminado y pasar su contraseña al usar el método getNumPages() y cualquier otro método que se desarrolle más allá.

Puede probar el paquete PyMuPDF , puede abrir archivos cifrados y resolver mis problemas.