Automatización simple de documentos
Los archivos PDF aparecen todo el tiempo en contextos reales:
Al final de esta clase deberías poder:
Usaremos la librería pypdf.
Es una herramienta muy útil para tareas básicas con archivos PDF.
Para instalarla, en terminal se puede escribir:
En esta clase trabajaremos principalmente con dos objetos:
PdfReader: sirve para leer un PDFPdfWriter: sirve para construir un nuevo PDFLa idea general será:
Supongamos que tenemos un archivo llamado documento.pdf.
readerLas páginas se indexan desde 0.
Eso significa:
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.
Supongamos que tenemos dos archivos:
parte1.pdfparte2.pdfY 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.")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")Porque se parece a una tarea real.
Por ejemplo:
Esto ya permite construir entregas automáticas.
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:
También podemos hacerlo con range().
Por ejemplo, si queremos las páginas 3 a 6, usamos los índices 2, 3, 4 y 5.
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.")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.")Esto puede ser útil cuando:
A veces un PDF está bien, pero alguna página quedó girada.
Podemos rotarla.
Los ángulos más comunes son:
90180270Por ejemplo:
Esto gira la página completamente al revés.
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:
Entonces los índices serían:
Supongamos que tenemos estos archivos:
portada.pdfinforme.pdfanexos.pdfQueremos crear un archivo final así:
portada.pdfinforme.pdfanexos.pdffrom 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.")Un error muy frecuente es pensar que la página 1 se escribe como índice 1.
Pero no.
En Python:
01Por eso siempre hay que tener cuidado con los índices.
Escribe un programa que:
archivo.pdfEscribe un programa que:
archivo.pdfimpares.pdfEscribe un programa que:
archivo.pdfarchivo_rotado.pdf