Clase: Unir, dividir y organizar PDFs con Python

Automatización simple de documentos

Programación con Python

¿Por qué trabajar con PDFs en Python?

Los archivos PDF aparecen todo el tiempo en contextos reales:

  • informes
  • tareas
  • certificados
  • escaneos
  • formularios
  • anexos

Objetivo de la clase

Al final de esta clase deberías poder:

  • abrir un archivo PDF desde Python
  • contar cuántas páginas tiene
  • unir varios PDFs en uno solo
  • extraer páginas específicas
  • dividir un PDF en varios archivos
  • rotar páginas
  • reorganizar páginas para crear un nuevo documento

La librería que vamos a usar

Usaremos la librería pypdf.

Es una herramienta muy útil para tareas básicas con archivos PDF.

Para instalarla, en terminal se puede escribir:

pip install pypdf

Idea clave

En esta clase trabajaremos principalmente con dos objetos:

  • PdfReader: sirve para leer un PDF
  • PdfWriter: sirve para construir un nuevo PDF

La idea general será:

  1. leer un archivo existente
  2. seleccionar páginas o documentos
  3. escribir un nuevo archivo PDF

Importar la librería

from pypdf import PdfReader, PdfWriter

Leer un PDF

Supongamos que tenemos un archivo llamado documento.pdf.

from pypdf import PdfReader

reader = PdfReader("documento.pdf")
print("Número de páginas:", len(reader.pages))

¿Qué hace este código?

  • abre el archivo PDF
  • guarda su contenido en reader
  • cuenta el número total de páginas

Acceder a una página específica

Las páginas se indexan desde 0.

Eso significa:

  • página 1 -> índice 0
  • página 2 -> índice 1
  • página 3 -> índice 2
from pypdf import PdfReader

reader = PdfReader("documento.pdf")
pagina_1 = reader.pages[0]

print("Se accedió correctamente a la primera página.")

Ejemplo mental

Si un PDF tiene 5 páginas, sus índices serán:

  • reader.pages[0]
  • reader.pages[1]
  • reader.pages[2]
  • reader.pages[3]
  • reader.pages[4]

Esto es importante para no confundirse al extraer páginas.

Unir dos PDFs

Supongamos que tenemos dos archivos:

  • parte1.pdf
  • parte2.pdf

Y queremos crear uno nuevo llamado unido.pdf.

from pypdf import PdfReader, PdfWriter

reader1 = PdfReader("parte1.pdf")
reader2 = PdfReader("parte2.pdf")

writer = PdfWriter()

for pagina in reader1.pages:
    writer.add_page(pagina)

for pagina in reader2.pages:
    writer.add_page(pagina)

with open("unido.pdf", "wb") as archivo_salida:
    writer.write(archivo_salida)

print("PDFs unidos correctamente.")

Unir varios PDFs

Ahora supongamos que queremos unir varios archivos de una lista.

from pypdf import PdfReader, PdfWriter

archivos = ["portada.pdf", "informe.pdf", "anexos.pdf"]

writer = PdfWriter()

for nombre_archivo in archivos:
    reader = PdfReader(nombre_archivo)
    for pagina in reader.pages:
        writer.add_page(pagina)

with open("documento_final.pdf", "wb") as salida:
    writer.write(salida)

print("Se creó el archivo documento_final.pdf")

¿Por qué este ejemplo es útil?

Porque se parece a una tarea real.

Por ejemplo:

  • primero una portada
  • luego un informe
  • al final unos anexos

Esto ya permite construir entregas automáticas.

Extraer solo algunas páginas

Supongamos que queremos sacar únicamente las páginas 2, 3 y 4 de un PDF.

Recuerda que en Python esas páginas corresponden a los índices:

  • 1
  • 2
  • 3
from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")
writer = PdfWriter()

for i in [1, 2, 3]:
    writer.add_page(reader.pages[i])

with open("paginas_2_a_4.pdf", "wb") as salida:
    writer.write(salida)

print("Se extrajeron las páginas seleccionadas.")

Extraer un rango de páginas

También podemos hacerlo con range().

Por ejemplo, si queremos las páginas 3 a 6, usamos los índices 2, 3, 4 y 5.

from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")
writer = PdfWriter()

for i in range(2, 6):
    writer.add_page(reader.pages[i])

with open("extraido.pdf", "wb") as salida:
    writer.write(salida)

print("Rango de páginas extraído.")

Crear un PDF solo con páginas pares

Esta idea es interesante porque combina conteo y selección.

from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")
writer = PdfWriter()

for i in range(len(reader.pages)):
    numero_pagina_real = i + 1
    if numero_pagina_real % 2 == 0:
        writer.add_page(reader.pages[i])

with open("paginas_pares.pdf", "wb") as salida:
    writer.write(salida)

print("Se creó un PDF con las páginas pares.")

Dividir un PDF en varios archivos

A veces no queremos unir, sino separar.

Por ejemplo, convertir cada página de un PDF en un archivo distinto.

from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")

for i in range(len(reader.pages)):
    writer = PdfWriter()
    writer.add_page(reader.pages[i])

    nombre_salida = f"pagina_{i+1}.pdf"
    with open(nombre_salida, "wb") as salida:
        writer.write(salida)

print("Cada página fue guardada como un PDF independiente.")

¿Cuándo sirve dividir un PDF?

Esto puede ser útil cuando:

  • cada página corresponde a una hoja distinta
  • quieres enviar solo una parte específica
  • estás organizando documentos escaneados
  • necesitas separar anexos

Rotar páginas

A veces un PDF está bien, pero alguna página quedó girada.

Podemos rotarla.

from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")
writer = PdfWriter()

for pagina in reader.pages:
    pagina.rotate(90)
    writer.add_page(pagina)

with open("rotado.pdf", "wb") as salida:
    writer.write(salida)

print("Todas las páginas fueron rotadas 90 grados.")

Nota importante sobre rotación

Los ángulos más comunes son:

  • 90
  • 180
  • 270

Por ejemplo:

pagina.rotate(180)

Esto gira la página completamente al revés.

Reordenar páginas

También podemos construir un nuevo PDF en el orden que queramos.

Por ejemplo, si un PDF tiene varias páginas y queremos guardarlas en este orden:

  • página 3
  • página 1
  • página 2

Entonces los índices serían:

  • 2
  • 0
  • 1
from pypdf import PdfReader, PdfWriter

reader = PdfReader("documento.pdf")
writer = PdfWriter()

orden = [2, 0, 1]

for i in orden:
    writer.add_page(reader.pages[i])

with open("reordenado.pdf", "wb") as salida:
    writer.write(salida)

print("PDF reorganizado correctamente.")

Ejemplo aplicado

Supongamos que tenemos estos archivos:

  • portada.pdf
  • informe.pdf
  • anexos.pdf

Queremos crear un archivo final así:

  1. todo portada.pdf
  2. páginas 1, 2 y 3 de informe.pdf
  3. todo anexos.pdf
from pypdf import PdfReader, PdfWriter

writer = PdfWriter()

portada = PdfReader("portada.pdf")
informe = PdfReader("informe.pdf")
anexos = PdfReader("anexos.pdf")

for pagina in portada.pages:
    writer.add_page(pagina)

for i in [0, 1, 2]:
    writer.add_page(informe.pages[i])

for pagina in anexos.pages:
    writer.add_page(pagina)

with open("entrega_final.pdf", "wb") as salida:
    writer.write(salida)

print("Archivo final creado con éxito.")

Error común

Un error muy frecuente es pensar que la página 1 se escribe como índice 1.

Pero no.

En Python:

  • la primera página es 0
  • la segunda página es 1

Por eso siempre hay que tener cuidado con los índices.

Ejercicio propuesto 1

Escribe un programa que:

  • abra un PDF llamado archivo.pdf
  • cuente cuántas páginas tiene
  • muestre ese número en pantalla

Ejercicio propuesto 2

Escribe un programa que:

  • abra archivo.pdf
  • cree un nuevo PDF con solo las páginas impares
  • guarde el resultado con el nombre impares.pdf

Ejercicio propuesto 3

Escribe un programa que:

  • abra archivo.pdf
  • rote todas sus páginas 180 grados
  • guarde el resultado como archivo_rotado.pdf