Trabajar con archivos PDF en Python: insertar, eliminar y reordenar páginas

Este artículo es el tercero de una serie sobre cómo trabajar con archivos PDF en Python: lectura y división de páginas, adición de imágenes y marcas de agua, inserción, eliminación y reordenación...

Este artículo es el tercero de una serie sobre cómo trabajar con archivos PDF en Python:

Introducción

Este artículo es la tercera parte de una pequeña serie sobre cómo trabajar con archivos PDF en Python. En los artículos anteriores dimos una introducción a la lectura de documentos PDF usando Python. Hasta ahora, ha aprendido a manipular archivos PDF existentes y a leer y extraer el contenido, tanto texto como imágenes. Además, hemos discutido la división de documentos en páginas individuales, así como la adición de marcas de agua y códigos de barras.

Ahora, en este artículo, daremos un paso más y demostraremos cómo reorganizar un documento PDF de diferentes maneras.

Eliminación de páginas con pdfrw

Eliminar páginas individuales de un archivo PDF es tan simple como lo siguiente:

  • Leer un PDF como un archivo de entrada
  • Escriba las páginas seleccionadas en un nuevo PDF como archivo de salida

El siguiente ejemplo elimina las dos primeras páginas de un documento PDF. Utilizando la biblioteca pdfrw, el archivo se lee primero con la ayuda de la clase PdfReader(). A excepción de la primera y la segunda página, cada página se agrega al archivo de salida mediante el método addpage() y, finalmente, se escribe en el disco.

La Figura 1 muestra el resultado al ejecutar el código en un archivo PDF de cuatro páginas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# !/usr/bin/python
# Remove the first two pages (cover sheet) from the PDF

from pdfrw import PdfReader, PdfWriter

input_file = "example.pdf"
output_file = "example-updated.pdf"

# Define the reader and writer objects
reader_input = PdfReader(input_file)
writer_output = PdfWriter()

# Go through the pages one after the next
for current_page in range(len(reader_input.pages)):
    if current_page > 1:
        writer_output.addpage(reader_input.pages[current_page])
        print("adding page %i" % (current_page + 1))

# Write the modified content to disk
writer_output.write(output_file)

Eliminar las dos primeras páginas de un PDF{.img-responsive}

Eliminación de páginas con PyMuPDF

La biblioteca PyMuPDF incluye varios métodos sofisticados que simplifican la eliminación de páginas de un archivo PDF. Te permite especificar una sola página (usando el método deletePage()), o un rango de números de página (usando el método deletePageRange()), o una lista con los números de página (usando el método select( ) método).

El siguiente ejemplo demostrará cómo usar una lista para seleccionar las páginas que se conservarán del documento original. Tenga en cuenta que las páginas que no se especifican no formarán parte del documento de salida. En nuestro caso, el documento de salida contiene solo la primera, segunda y cuarta página.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# !/usr/bin/python

# Recall that PyMuPDF is imported as fitz
import fitz

input_file = "example.pdf"
output_file = "example-rearranged.pdf"

# Define the pages to keep - 1, 2 and 4
file_handle = fitz.open(input_file)
pages_list = [0,1,3]

# Select the pages and save the output
file_handle.select(pages_list)
file_handle.save(output_file)

Insertar páginas con PyMuPDF

La biblioteca PyMuPDF también le permite insertar páginas. Proporciona los métodos newPage() para agregar páginas completamente en blanco, y insertPage() para agregar una página existente. El siguiente ejemplo muestra cómo agregar una página de un documento PDF diferente al final de otro.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# !/usr/bin/python

# Recall that PyMuPDF is imported as fitz
import fitz

original_pdf_path = "example.pdf"
extra_page_path = "extra-page.pdf"
output_file_path = "example-extended.pdf"

original_pdf = fitz.open(original_pdf_path)
extra_page = fitz.open(extra_page_path)

original_pdf.insertPDF(extra_page)
original_pdf.save(output_file_path)

División de páginas pares e impares con PyPDF2

El siguiente ejemplo usa PyPDF2 y lo hace tomando un archivo, separándolo en sus páginas pares e impares, guardando las páginas pares en el archivo par.pdf , y las páginas impares en odd.pdf.

Este script de Python comienza con la definición de dos archivos de salida, even.pdf y odd.pdf, así como sus objetos de escritor correspondientes pdf_writer_even y pdf_writer_odd. A continuación, en un bucle for, el script recorre todo el archivo PDF y lee una página tras otra. Las páginas con números de página pares se agregan al flujo pdf_writer_even usando addPage(), y los números impares se agregan al flujo pdf_writer_odd. Al final, los dos flujos se guardan en el disco en archivos separados, como se definió anteriormente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/python3

from PyPDF2 import PdfFileReader, PdfFileWriter

pdf_document = "example.pdf"
pdf = PdfFileReader(pdf_document)

# Output files for new PDFs
output_filename_even = "even.pdf"
output_filename_odd = "odd.pdf"

pdf_writer_even = PdfFileWriter()
pdf_writer_odd = PdfFileWriter()

# Get reach page and add it to corresponding
# output file based on page number
for page in range(pdf.getNumPages()):
    current_page = pdf.getPage(page)
    if page % 2 == 0:
        pdf_writer_odd.addPage(current_page)
    else:
        pdf_writer_even.addPage(current_page)

# Write the data to disk
with open(output_filename_even, "wb") as out:
     pdf_writer_even.write(out)
     print("created", output_filename_even)

# Write the data to disk
with open(output_filename_odd, "wb") as out:
     pdf_writer_odd.write(out)
     print("created", output_filename_odd)

Conclusión

Reescribir y reorganizar la estructura de un PDF es bastante fácil con las bibliotecas pdfrw, PyMuPDF y PyPDF2. Con solo unas pocas líneas de código Python, puede eliminar páginas, separarlas y agregar contenido nuevo.