¿Cómo desbloquear un PDF “protegido” (protegido contra lectura) en Python?

En Python, estoy usando pdfminer para leer el texto de un pdf con el código debajo de este mensaje. Ahora recibo un mensaje de error que dice:

File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfpage.py", line 124, in get_pages raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) PDFTextExtractionNotAllowed: Text extraction is not allowed:  

Cuando abro este pdf con Acrobat Pro, resulta que está protegido (o “protegido contra lectura”). Sin embargo, en este enlace , leí que hay una multitud de servicios que pueden deshabilitar esta protección de lectura fácilmente (por ejemplo, pdfunlock.com . Al bucear en la fuente de pdfminer, veo que el error anterior se genera en estas líneas) .

 if check_extractable and not doc.is_extractable: raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) 

Dado que hay una multitud de servicios que pueden desactivar esta protección de lectura en un segundo, supongo que es muy fácil de hacer. Parece que .is_extractable es un atributo simple del doc , pero no creo que sea tan simple como cambiar .is_extractable a True …

¿Alguien sabe cómo puedo deshabilitar la protección de lectura en un pdf usando Python? Todos los consejos son bienvenidos!

================================================

A continuación, encontrará el código con el que actualmente extraigo el texto de no protegido contra lectura.

 def getTextFromPDF(rawFile): resourceManager = PDFResourceManager(caching=True) outfp = StringIO() device = TextConverter(resourceManager, outfp, codec='utf-8', laparams=LAParams(), imagewriter=None) interpreter = PDFPageInterpreter(resourceManager, device) fileData = StringIO() fileData.write(rawFile) for page in PDFPage.get_pages(fileData, set(), maxpages=0, caching=True, check_extractable=True): interpreter.process_page(page) fileData.close() device.close() result = outfp.getvalue() outfp.close() return result 

Por lo que sé, en la mayoría de los casos, el contenido completo del PDF está realmente encriptado, utilizando la contraseña como clave de encriptación, y simplemente establecer .is_extractable en True no lo ayudará.

Por este hilo:

¿Existe una biblioteca para eliminar contraseñas de archivos PDF mediante progtwigción?

Recomendaría eliminar la protección de lectura con una herramienta de línea de comandos como qpdf (fácilmente instalable, por ejemplo, en Ubuntu use apt-get install qpdf si aún no lo tiene):

 qpdf --password=PASSWORD --decrypt SECURED.pdf UNSECURED.pdf 

Luego abre el archivo desbloqueado con pdfminer y haz tus cosas.

Para una solución de Python puro, puede intentar usar PyPDF2 y su método .decrypt() , pero no funciona con todos los tipos de encriptación, así que realmente, es mejor que use qpdf . Vea:

https://github.com/mstamy2/PyPDF2/issues/53

Tuve algunos problemas al intentar que qpdf se comporte en mi progtwig. Encontré una biblioteca útil, pikepdf , que se basa en qpdf y convierte automáticamente archivos PDF para que sean extraíbles.

El código para usar esto es bastante sencillo:

 import pikepdf pdf = pikepdf.open('unextractable.pdf') pdf.save('extractable.pdf') 

En mi caso no hubo contraseña, sino que simplemente se estableció check_extractable=False eludió la excepción PDFTextExtractionNotAllowed para un archivo problemático (que se abrió bien en otros visores).