Convertir PDF a Imágenes con Python
Convertir páginas de PDF en imágenes PNG o JPEG es útil para previsualizaciones, procesamiento con OCR y generación de miniaturas. Python ofrece pdf2image (basado en poppler) y PyMuPDF (fitz).
Opción 1: pdf2image + poppler
pip install pdf2image pillow
# Poppler (backend):
# Windows: https://github.com/oschwartz10612/poppler-windows (extraer en C:/poppler)
# macOS: brew install poppler
# Linux: apt install poppler-utils
Conversión básica de PDF a PNG
from pdf2image import convert_from_path
from pathlib import Path
def pdf_a_png(pdf_path, carpeta_salida="paginas", dpi=150):
Path(carpeta_salida).mkdir(exist_ok=True)
paginas = convert_from_path(pdf_path, dpi=dpi)
rutas = []
for i, pagina in enumerate(paginas, 1):
ruta = f"{carpeta_salida}/pagina_{i:03d}.png"
pagina.save(ruta, "PNG")
rutas.append(ruta)
print(f" Página {i}/{len(paginas)}: {ruta}")
print(f"Convertidas {len(paginas)} páginas")
return rutas
pdf_a_png("documento.pdf", dpi=200)
Solo algunas páginas
from pdf2image import convert_from_path
# Páginas 2-5 (first_page y last_page son 1-indexed)
paginas = convert_from_path("informe.pdf", dpi=150,
first_page=2, last_page=5)
for i, pag in enumerate(paginas, 2):
pag.save(f"pagina_{i}.jpg", "JPEG", quality=85)
print(f"Exportadas {len(paginas)} páginas")
Exportar a JPEG con calidad ajustable
from pdf2image import convert_from_path
def pdf_a_jpeg(pdf_path, carpeta, dpi=150, calidad=85):
from pathlib import Path
Path(carpeta).mkdir(exist_ok=True)
paginas = convert_from_path(pdf_path, dpi=dpi, fmt="jpeg")
for i, pag in enumerate(paginas, 1):
pag.save(f"{carpeta}/pagina_{i:03d}.jpg", "JPEG", quality=calidad)
print(f"Exportadas {len(paginas)} páginas a JPEG (calidad={calidad})")
pdf_a_jpeg("catalogo.pdf", "miniaturas", dpi=100, calidad=75)
Opción 2: PyMuPDF (fitz) — Más rápido, sin poppler
pip install pymupdf
Conversión con PyMuPDF
import fitz # PyMuPDF
def pdf_a_imagenes_fitz(pdf_path, carpeta_salida="paginas", dpi=150):
from pathlib import Path
Path(carpeta_salida).mkdir(exist_ok=True)
doc = fitz.open(pdf_path)
zoom = dpi / 72 # 72 DPI base de PDF
mat = fitz.Matrix(zoom, zoom)
rutas = []
for i, pagina in enumerate(doc):
pixmap = pagina.get_pixmap(matrix=mat)
ruta = f"{carpeta_salida}/pagina_{i+1:03d}.png"
pixmap.save(ruta)
rutas.append(ruta)
print(f" Página {i+1}/{doc.page_count}")
doc.close()
return rutas
pdf_a_imagenes_fitz("documento.pdf", dpi=200)
Miniatura de la primera página
import fitz
from PIL import Image
import io
def miniatura_pdf(pdf_path, salida, ancho=300):
doc = fitz.open(pdf_path)
pagina = doc[0]
zoom = ancho / pagina.rect.width
pixmap = pagina.get_pixmap(matrix=fitz.Matrix(zoom, zoom))
img = Image.open(io.BytesIO(pixmap.tobytes("png")))
img.save(salida)
doc.close()
print(f"Miniatura: {salida} ({img.width}x{img.height}px)")
miniatura_pdf("informe.pdf", "miniatura.jpg")
Extraer imágenes embebidas en el PDF
import fitz
from pathlib import Path
def extraer_imagenes_pdf(pdf_path, carpeta_salida="imagenes"):
Path(carpeta_salida).mkdir(exist_ok=True)
doc = fitz.open(pdf_path)
contador = 0
for num_pag, pagina in enumerate(doc):
for img_index, img in enumerate(pagina.get_images()):
xref = img[0]
imagen = doc.extract_image(xref)
ext = imagen["ext"]
datos = imagen["image"]
ruta = f"{carpeta_salida}/img_pag{num_pag+1}_{img_index+1}.{ext}"
with open(ruta, "wb") as f:
f.write(datos)
contador += 1
doc.close()
print(f"Extraídas {contador} imágenes en {carpeta_salida}/")
extraer_imagenes_pdf("catalogo.pdf")
Comparativa pdf2image vs PyMuPDF
| Característica | pdf2image | PyMuPDF (fitz) |
|---|---|---|
| Dependencia extra | poppler | No |
| Velocidad | Media | Alta |
| Calidad | Excelente | Excelente |
| Imágenes embebidas | No | Sí |
| Páginas en memoria | Todas | Una a una |
Recurso Adicional
Para convertir PDF a JPG, PNG o WebP sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones de documento que siguen este tema: