Automatizar

Unir y dividir PDFs con Python

Cómo combinar varios PDFs en uno solo, extraer páginas concretas o partir un PDF en varios, con Python y pypdf. Para dejar de hacerlo a mano con herramientas online.

Combinar varios PDFs en uno, sacar solo unas páginas, o partir un documento grande en pedazos son tareas que la gente hace subiendo archivos a webs dudosas (con el riesgo de privacidad que eso implica). Con Python lo haces en tu propia máquina, sin subir nada a ningún lado, y de forma repetible.

La librería es pypdf:

pip install pypdf

Un apunte: esta librería antes se llamaba PyPDF2 y verás mucho código viejo con ese nombre. Hoy el proyecto se unificó en pypdf (sin el 2), que es el que se mantiene. Si sigues un tutorial antiguo que importa PyPDF2, usa pypdf en su lugar.

Unir varios PDFs en uno

from pypdf import PdfWriter

archivos = ["capitulo1.pdf", "capitulo2.pdf", "capitulo3.pdf"]

escritor = PdfWriter()
for archivo in archivos:
    escritor.append(archivo)

with open("libro_completo.pdf", "wb") as salida:
    escritor.write(salida)

print("PDFs unidos.")

append va agregando cada PDF completo al final, en el orden de la lista. El orden de la lista es el orden en que quedarán, así que ordénala como quieras el resultado. El "wb" (escritura binaria) es obligatorio: los PDFs no son texto, son binarios.

Si quieres unir todos los PDFs de una carpeta sin nombrarlos uno a uno:

from pathlib import Path
from pypdf import PdfWriter

escritor = PdfWriter()
for archivo in sorted(Path("mis_pdfs").glob("*.pdf")):
    escritor.append(str(archivo))

with open("unido.pdf", "wb") as salida:
    escritor.write(salida)

El sorted() asegura un orden predecible (alfabético); sin él, el orden podría ser aleatorio.

Extraer páginas concretas

Para sacar solo algunas páginas a un PDF nuevo:

from pypdf import PdfReader, PdfWriter

lector = PdfReader("documento.pdf")
escritor = PdfWriter()

# Extraer las páginas 1 a 3 (recuerda: se cuentan desde 0)
for i in range(0, 3):
    escritor.add_page(lector.pages[i])

with open("paginas_1_a_3.pdf", "wb") as salida:
    escritor.write(salida)

El detalle que confunde a todos: las páginas se cuentan desde 0. La página 1 del documento es pages[0], la página 2 es pages[1], y así. Por eso range(0, 3) te da las tres primeras páginas (índices 0, 1 y 2).

Dividir un PDF en páginas sueltas

Para partir un PDF y guardar cada página como archivo independiente:

from pypdf import PdfReader, PdfWriter

lector = PdfReader("documento.pdf")

for i, pagina in enumerate(lector.pages, start=1):
    escritor = PdfWriter()
    escritor.add_page(pagina)
    with open(f"pagina_{i}.pdf", "wb") as salida:
        escritor.write(salida)

print(f"Dividido en {len(lector.pages)} archivos.")

Esto genera pagina_1.pdf, pagina_2.pdf, etc., uno por cada página del original. El enumerate(..., start=1) numera los archivos desde 1 para que sea legible, aunque internamente las páginas sigan contándose desde 0.

Saber cuántas páginas tiene un PDF

Un dato útil que necesitarás a menudo:

from pypdf import PdfReader

lector = PdfReader("documento.pdf")
print(f"El PDF tiene {len(lector.pages)} páginas.")

Un aviso sobre PDFs protegidos

Si un PDF está protegido con contraseña, pypdf no podrá leerlo directamente y lanzará un error. Si conoces la contraseña, puedes desbloquearlo:

lector = PdfReader("protegido.pdf")
if lector.is_encrypted:
    lector.decrypt("la_contraseña")

Con esto tienes el control total sobre tus PDFs sin depender de webs externas: unir, extraer, dividir y contar. Combínalo con el artículo de enviar correos con Python y podrías, por ejemplo, unir varios reportes en un PDF y enviarlo automáticamente, todo en un solo script.


¿Necesitas rotar páginas, añadir marcas de agua o extraer el texto de un PDF? Escríbeme desde contacto y lo cubrimos.

← Más de Automatizar