Trabajar con archivos PDF en Python

Todos ustedes deben estar familiarizados con lo que son los archivos PDF. De hecho, son uno de los medios digitales más importantes y más utilizados. PDF significa formato de documento portátil . Utiliza la extensión .pdf . Se utiliza para presentar e intercambiar documentos de manera confiable, independientemente del software, hardware o sistema operativo.
Inventado por Adobe , PDF es ahora un estándar abierto mantenido por la Organización Internacional de Normalización (ISO). Los archivos PDF pueden contener enlaces y botones, campos de formulario, audio, video y lógica empresarial.
En este artículo, aprenderemos cómo podemos hacer varias operaciones como: 
 

  • Extraer texto de PDF
  • Rotación de páginas PDF
  • Combinar archivos PDF
  • Dividir PDF
  • Agregar marca de agua a páginas PDF

usando simples scripts de python!
Instalación 
Usaremos un módulo de terceros, PyPDF2.
PyPDF2 es una biblioteca de python creada como un conjunto de herramientas de PDF. Es capaz de: 
 

  • Extraer información del documento (título, autor,…)
  • División de documentos página por página
  • Combinar documentos página por página
  • Recortar páginas
  • Combinar varias páginas en una sola página
  • Cifrado y descifrado de archivos PDF
  • ¡y más!

Para instalar PyPDF2, ejecute el siguiente comando desde la línea de comando: 
 

 pip3 install PyPDF2

El nombre de este módulo distingue entre mayúsculas y minúsculas, así que asegúrese de que la y esté en minúsculas y que todo lo demás esté en mayúsculas. Todo el código y los archivos PDF utilizados en este tutorial/artículo están disponibles aquí .
1. Extraer texto de un archivo PDF 
 

Python

# importing required modules
import PyPDF2
  
# creating a pdf file object
pdfFileObj = open('example.pdf', 'rb')
  
# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  
# printing number of pages in pdf file
print(pdfReader.numPages)
  
# creating a page object
pageObj = pdfReader.getPage(0)
  
# extracting text from page
print(pageObj.extractText())
  
# closing the pdf file object
pdfFileObj.close()

La salida del programa anterior se ve así: 
 

20
PythonBasics
S.R.Doty
August27,2008
Contents

1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]

Tratemos de entender el código anterior en fragmentos: 
 

pdfFileObj = open('example.pdf', 'rb')
  • Abrimos el ejemplo.pdf en modo binario. Y guardó el objeto de archivo como pdfFileObj .
     
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  • Aquí, creamos un objeto de la clase PdfFileReader del módulo PyPDF2 y pasamos el objeto de archivo PDF y obtenemos un objeto de lector de PDF.
     
print(pdfReader.numPages)
  • La propiedad numPages da el número de páginas en el archivo PDF. Por ejemplo, en nuestro caso, es 20 (ver primera línea de salida).
     
pageObj = pdfReader.getPage(0)
  • Ahora, creamos un objeto de la clase PageObject del módulo PyPDF2. El objeto del lector de PDF tiene la función getPage() que toma el número de página (a partir del índice 0) como argumento y devuelve el objeto de la página.
     
print(pageObj.extractText())
  • El objeto de página tiene la función extractText() para extraer texto de la página PDF.
     
pdfFileObj.close()
  • Por último, cerramos el objeto del archivo PDF.

Nota: Si bien los archivos PDF son excelentes para diseñar texto de una manera que sea fácil de imprimir y leer para las personas, no son sencillos para que el software los analice en texto sin formato. Como tal, PyPDF2 puede cometer errores al extraer texto de un PDF e incluso es posible que no pueda abrir algunos PDF. Desafortunadamente, no hay mucho que puedas hacer al respecto. Es posible que PyPDF2 simplemente no pueda trabajar con algunos de sus archivos PDF particulares.

2. Rotación de páginas PDF
 

Python

# importing the required modules
import PyPDF2
  
def PDFrotate(origFileName, newFileName, rotation):
  
    # creating a pdf File object of original pdf
    pdfFileObj = open(origFileName, 'rb')
      
    # creating a pdf Reader object
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  
    # creating a pdf writer object for new pdf
    pdfWriter = PyPDF2.PdfFileWriter()
      
    # rotating each page
    for page in range(pdfReader.numPages):
  
        # creating rotated page object
        pageObj = pdfReader.getPage(page)
        pageObj.rotateClockwise(rotation)
  
        # adding rotated page object to pdf writer
        pdfWriter.addPage(pageObj)
  
    # new pdf file object
    newFile = open(newFileName, 'wb')
      
    # writing rotated pages to new file
    pdfWriter.write(newFile)
  
    # closing the original pdf file object
    pdfFileObj.close()
      
    # closing the new pdf file object
    newFile.close()
      
  
def main():
  
    # original pdf file name
    origFileName = 'example.pdf'
     
    # new pdf file name
    newFileName = 'rotated_example.pdf'
      
    # rotation angle
    rotation = 270
      
    # calling the PDFrotate function
    PDFrotate(origFileName, newFileName, rotation)
      
if __name__ == "__main__":
    # calling the main function
    main()

Aquí puede ver cómo se ve la primera página de giratorio_ejemplo.pdf (imagen de la derecha) después de la rotación:
 

Rotating a pdf file

Algunos puntos importantes relacionados con el código anterior: 
 

  • Para la rotación, primero creamos un objeto lector de PDF del PDF original.
pdfWriter = PyPDF2.PdfFileWriter()
  • Las páginas giradas se escribirán en un nuevo PDF. Para escribir en archivos PDF, usamos el objeto de la clase PdfFileWriter del módulo PyPDF2.
for page in range(pdfReader.numPages):
        pageObj = pdfReader.getPage(page)
        pageObj.rotateClockwise(rotation)
        pdfWriter.addPage(pageObj)
  • Ahora, iteramos cada página del PDF original. Obtenemos el objeto de la página mediante el método getPage() de la clase de lector de PDF. Ahora, giramos la página con el método de la clase de objeto de página de la clase de objeto de página. Luego, agregamos una página al objeto de escritor de PDF usando el método addPage() de la clase de escritor de PDF al pasar el objeto de página girado.
newFile = open(newFileName, 'wb')
pdfWriter.write(newFile)
pdfFileObj.close()
newFile.close()
  • Ahora, tenemos que escribir las páginas PDF en un nuevo archivo PDF. En primer lugar, abrimos el nuevo objeto de archivo y escribimos páginas PDF en él usando el método write() del objeto de escritura de PDF. Finalmente, cerramos el objeto de archivo PDF original y el nuevo objeto de archivo.

3. Combinar archivos PDF
 

Python

# importing required modules
import PyPDF2
  
  
def PDFmerge(pdfs, output):
    # creating pdf file merger object
    pdfMerger = PyPDF2.PdfFileMerger()
  
    # appending pdfs one by one
    for pdf in pdfs:
        pdfmerger.append(pdf)
  
    # writing combined pdf to output pdf file
    with open(output, 'wb') as f:
        pdfMerger.write(f)
  
  
def main():
    # pdf files to merge
    pdfs = ['example.pdf', 'rotated_example.pdf']
  
    # output pdf file name
    output = 'combined_example.pdf'
  
    # calling pdf merge function
    PDFmerge(pdfs=pdfs, output=output)
  
  
if __name__ == "__main__":
    # calling the main function
    main()

El resultado del programa anterior es un PDF combinado , combine_example.pdf , obtenido al fusionar example.pdf y rotated_example.pdf .
 

  • Echemos un vistazo a los aspectos importantes de este programa: 
      
pdfMerger = PyPDF2.PdfFileMerger()
  • Para fusionar, usamos una clase preconstruida, PdfFileMerger del módulo PyPDF2. 
    Aquí, creamos un objeto pdfMerger de la clase de fusión de PDF
for pdf in pdfs:
        pdfmerger.append(open(focus, "rb"))
  • Ahora, agregamos el objeto de archivo de cada objeto de fusión de PDF a PDF usando el método append() .
with open(output, 'wb') as f:
        pdfMerger.write(f)
  • Finalmente, escribimos las páginas PDF en el archivo PDF de salida utilizando el método de escritura del objeto de fusión de PDF.

4. Dividir archivo PDF
 

Python

# importing the required modules
import PyPDF2
  
def PDFsplit(pdf, splits):
    # creating input pdf file object
    pdfFileObj = open(pdf, 'rb')
      
    # creating pdf reader object
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
      
    # starting index of first slice
    start = 0
      
    # starting index of last slice
    end = splits[0]
      
      
    for i in range(len(splits)+1):
        # creating pdf writer object for (i+1)th split
        pdfWriter = PyPDF2.PdfFileWriter()
          
        # output pdf file name
        outputpdf = pdf.split('.pdf')[0] + str(i) + '.pdf'
          
        # adding pages to pdf writer object
        for page in range(start,end):
            pdfWriter.addPage(pdfReader.getPage(page))
          
        # writing split pdf pages to pdf file
        with open(outputpdf, "wb") as f:
            pdfWriter.write(f)
  
        # interchanging page split start position for next split
        start = end
        try:
            # setting split end position for next split
            end = splits[i+1]
        except IndexError:
            # setting split end position for last split
            end = pdfReader.numPages
          
    # closing the input pdf file object
    pdfFileObj.close()
              
def main():
    # pdf file to split
    pdf = 'example.pdf'
      
    # split page positions
    splits = [2,4]
      
    # calling PDFsplit function to split pdf
    PDFsplit(pdf, splits)
  
if __name__ == "__main__":
    # calling the main function
    main()

La salida será tres nuevos archivos PDF con división 1 (página 0,1), división 2 (página 2,3), división 3 (página 4-fin) .
No se ha utilizado ninguna función o clase nueva en el programa Python anterior. Usando lógica e iteraciones simples, creamos las divisiones del PDF pasado de acuerdo con las divisiones de la lista pasada .
5. Agregar marca de agua a páginas PDF
 

Python

# importing the required modules
import PyPDF2
  
def add_watermark(wmFile, pageObj):
    # opening watermark pdf file
    wmFileObj = open(wmFile, 'rb')
     
    # creating pdf reader object of watermark pdf file
    pdfReader = PyPDF2.PdfFileReader(wmFileObj) 
      
    # merging watermark pdf's first page with passed page object.
    pageObj.mergePage(pdfReader.getPage(0))
      
    # closing the watermark pdf file object
    wmFileObj.close()
      
    # returning watermarked page object
    return pageObj
  
def main():
    # watermark pdf file name
    mywatermark = 'watermark.pdf'
     
    # original pdf file name
    origFileName = 'example.pdf'
      
    # new pdf file name
    newFileName = 'watermarked_example.pdf'
      
    # creating pdf File object of original pdf
    pdfFileObj = open(origFileName, 'rb')
      
    # creating a pdf Reader object
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  
    # creating a pdf writer object for new pdf
    pdfWriter = PyPDF2.PdfFileWriter()
      
    # adding watermark to each page
    for page in range(pdfReader.numPages):
        # creating watermarked page object
        wmpageObj = add_watermark(mywatermark, pdfReader.getPage(page))
          
        # adding watermarked page object to pdf writer
        pdfWriter.addPage(wmpageObj)
  
    # new pdf file object
    newFile = open(newFileName, 'wb')
      
    # writing watermarked pages to new file
    pdfWriter.write(newFile)
  
    # closing the original pdf file object
    pdfFileObj.close()
    # closing the new pdf file object
    newFile.close()
  
if __name__ == "__main__":
    # calling the main function
    main()

Así es como se ve la primera página del archivo PDF original (izquierda) y con marca de agua (derecha): 
 

 Watermarking the pdf file

  • Todo el proceso es el mismo que el ejemplo de rotación de página. La única diferencia es: 
     
wmpageObj = add_watermark(mywatermark, pdfReader.getPage(page))
  • El objeto de página se convierte en un objeto de página con marca de agua mediante la función add_watermark() .
  • Tratemos de entender la función add_watermark()
     
wmFileObj = open(wmFile, 'rb')
pdfReader = PyPDF2.PdfFileReader(wmFileObj) 
pageObj.mergePage(pdfReader.getPage(0))
wmFileObj.close()
return pageObj
  • En primer lugar, creamos un objeto lector de PDF de marca de agua.pdf . Para el objeto de página pasado, usamos la función mergePage() y pasamos el objeto de página de la primera página del objeto lector de PDF de marca de agua. Esto superpondrá la marca de agua sobre el objeto de página pasado.

Y aquí llegamos al final de este largo tutorial sobre cómo trabajar con archivos PDF en python. 
¡Ahora puede crear fácilmente su propio administrador de PDF!
Referencias: 
 

Este artículo es una contribución de Nikhil Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *