Los PDFs son documentos binarios que albergan una gran cantidad de información, y que son mucho más complejos que los documentos de texto plano.
Para trabajar con documentos PDF desde Python se usará el módulo PyPDF2. Es un módulo qde terceros que hay que instalar, en estas notas se usará la versión 1.26.0: pip install –user PyPDF2==1.26.0
El formato PDF es muy particular y cabe la posibilidad que se produzcan fallos a la hora de extraer texto. Es algo que hay que tener en cuenta y que es inevitable.
El módulo PyPDF2 no tiene ninguna función para extraer elementos multimedia, pero puede extraer texto y retornarlo a Python como un string.
Los pasos para extraer texto de un pdf son los siguientes:
import PyPDF2 docPdf = open('miDocumento.pdf', 'rb') docPdfLeible = PyPDF2.PdfFileReader(docPdf) docPdfLeible.numpages # Devuelve el número de páginas del PDF paginaPDF = docPdfLeible.getPage(3) # Extraemos la página 4 de la que queremos obtener el texto. textoPDF = paginaPDF.extractText() # ... # Cosas que hacer con el texto docPdf.close()
Spoiler: Hay que conocer la contraseña con la que han sido encriptados. Lógicamente.
import PyPDF2 docPdf = pyPDF2.PdfFileReader(open('DocumentoEncriptado.pdf', 'rb'))
docPdf.isEncrypted # True
docPdf.decrypt('//contraseña//')
pagina = docPdf.getPage(0)
Debido a un bug en la versión 1.26.0 de PyDF2, se produce un error IndexError: list index out of range cuando se llama a getPage(), si ésta ha sido llamada anteriormente, antes de decrypt(). Si se diese el Caso, para evitar ese error, es necesario volver a abrir el documento.
PyPDF2 no permite crear PDSFs editándolos manualmente. Lo que hace es crear un PDF, a aprtir de pegar, rotar, sobreponer o encriptar otros PDFs:
Del mismo modo que antes, cuando se extrae la página a copiar, se la aplica el método pagina.rotateClockwise(nº_grados_rotación).
Continuaría igual: Creando un nuevo PDF y escribiendo las págias rotadas.
Útil, por ejemplo, para añadir marcas de agua.
La metodología es la misma que anteriormente: Una vez se han abierto las 2 páginas a unir, se utiliza el método merge() de la que va a ser “sobrepuesta” (queda debajo). primeraPagina.mergePage(pdfMarcaAguaReader.getPage(0))
Una vez se le han añadido todas las páginas al objeto pdfWriter, se encripta con: pdfWriter.encrypt(clave).
El método encrypt() permite tener 2 argumentos: el primero es el user password (sólo permite ver el PDF) y el segundo el owner password (permite realizar otras acciones, como por ejemplo, extraer texto). Si sólo se pasa una clave, se usa para ambos usuarios.
Después el siguiente paso es crear el PDF, como se vió anteriormente.