Análisis Profundos

Cómo convertir páginas PDF a imágenes: una guía práctica

koboshiCo-founder
·10 min de lectura
Cómo convertir páginas PDF a imágenes: una guía práctica
Resumen

Las páginas PDF no siempre encajan donde las necesitas. Esta guía explica cuándo convertir PDF a imágenes, las compensaciones de cada enfoque, métodos nativos de cada sistema operativo y ejemplos de código en cinco lenguajes.

Un desarrollador frontend recibe un PDF de directrices de marca de 40 páginas y necesita incluir tres páginas específicas en un tablero de Figma. Un ingeniero de soporte quiere pegar un diagrama de una hoja de datos en un hilo de Slack. Un abogado necesita adjuntar una página de un contrato firmado a un correo sin enviar el archivo completo.

PDF está diseñado para documentos de diseño fijo. La web, los editores de imágenes y las aplicaciones de chat están diseñados para píxeles. Convertir una página PDF en una imagen cierra esa brecha, pero el método que elijas cambia la calidad de salida, el tamaño del archivo y el control que conservas.

Por qué PDF es a la vez excelente y molesto para esto

PDF almacena páginas como una secuencia de comandos de dibujo: colocar este glifo, dibujar este vector, renderizar esta imagen en este tamaño. Eso lo hace independiente de la resolución y visualmente consistente. También significa que un PDF no es una imagen. Para convertirlo en una, algo debe renderizar esos comandos sobre un lienzo rasterizado.

Las ventajas:

  • El texto y los vectores permanecen nítidos a cualquier nivel de zoom porque se describen matemáticamente, no se almacenan como píxeles.
  • Un solo PDF puede contener cientos de páginas en un archivo.
  • Las fuentes, los perfiles de color y las anotaciones viajan con el documento.

Las desventajas:

  • Los lectores de PDF no coinciden en el renderizado. La misma página puede verse ligeramente diferente en Adobe Acrobat, Preview, Chrome o una biblioteca headless.
  • Los PDF escaneados son solo imágenes envueltas en contenedores PDF, así que "convertirlos" significa volver a codificarlos, lo que puede añadir artefactos o aumentar el tamaño.
  • Los PDF complejos con transparencias, capas o formularios interactivos pueden aplanarse de forma impredecible.
  • Las dimensiones de página varían. Una página US Letter a 72 DPI mide 612 por 792 píxeles. A 300 DPI, 2550 por 3300. Si no especificas la resolución, puedes obtener algo inutilizable.

A qué suelen convertirse los PDF

La mayoría de las tareas de conversión se agrupan en uno de estos tres formatos de salida. Cada uno cumple una función distinta.

FormatoIdeal paraCompromiso
JPGFotos, vistas previas, archivos adjuntos de correo, galerías webCon pérdida, pero archivos pequeños
PNGCapturas de pantalla, diagramas, cualquier cosa que necesite transparenciaSin pérdida, más grande que JPG para fotos
WebPWeb moderna, aplicaciones, donde el ancho de banda importaMás pequeño que JPG/PNG, ligeramente menos universal

Luego están las dimensiones prácticas:

  • Página única vs. lote. Una página es sencilla. Una carpeta de facturas requiere automatización.
  • DPI. 150 DPI es suficiente para miniaturas. 300 DPI es el estándar para impresión y OCR. 600 DPI es excesivo a menos que examines detalles finos.
  • Espacio de color. RGB es seguro para pantallas. Los PDF en CMYK convertidos a RGB pueden desplazar los colores si la conversión es simple.

Cómo elegir el enfoque adecuado

La herramienta adecuada depende de lo que estés optimizando.

Conversión rápida en el navegador

Si solo necesitas una página como JPG, PNG o WebP y el archivo no es tan sensible como para requerir un servidor, un conversor basado en navegador es la opción más rápida. Nuestras herramientas PDF a JPG, PDF a PNG y PDF a WebP renderizan el PDF localmente. El archivo nunca abandona tu dispositivo, lo cual importa para contratos, identificaciones y registros médicos.

Trabajo por lotes en línea de comandos

Para carpetas de PDF o pipelines de CI, una herramienta de línea de comandos gana. Obtienes salida repetible, control de DPI y scripting.

Conversión dentro de una aplicación

Cuando la conversión forma parte de un producto, llamar a una biblioteca suele ser más limpio que ejecutar una herramienta CLI mediante shell. Elimina una dependencia externa y te da manejo de errores coherente con el resto de tu código.

Conversión en Windows

Adobe Acrobat

  1. Abre el PDF y ve a la página que necesitas.
  2. Elige Archivo > Exportar a > Imagen > JPEG/PNG/TIFF.
  3. Establece la resolución de salida en el diálogo de exportación.
  4. Guarda.

Acrobat ofrece salida confiable, pero no es gratuito ni scriptable sin el SDK de pago.

PDF-XChange Editor

Una alternativa más ligera con una versión gratuita. Archivo > Exportar > Exportar páginas como imágenes te permite elegir formato, DPI y rango de páginas.

PowerShell con pdftoppm

Instala Poppler para Windows, luego usa pdftoppm desde PowerShell:

pdftoppm -jpeg -r 300 input.pdf output

Esto produce output-1.jpg, output-2.jpg, y así sucesivamente, una por página, a 300 DPI.

Para PNG con fondos transparentes:

pdftoppm -png -r 300 input.pdf output

Para una sola página:

pdftoppm -jpeg -r 300 -f 1 -l 1 input.pdf output

Los flags -f y -l establecen la primera y última página.

PowerShell con ImageMagick

ImageMagick puede renderizar PDF, pero en Windows suele delegar en Ghostscript por debajo:

magick -density 300 input.pdf[0] output.jpg

El [0] significa la primera página. Sin él, ImageMagick puede intentar producir una imagen de varios fotogramas.

Conversión en macOS

Preview

  1. Abre el PDF en Preview.
  2. Selecciona la miniatura de la página que deseas.
  3. Elige Archivo > Exportar, selecciona el formato y establece la resolución.

Preview es rápido y privado, pero maneja una página a la vez.

Terminal con sips

macOS incluye sips, pero no renderiza bien el texto de PDF. Úsalo solo para PDF que ya sean mapas de bits:

sips -s format jpeg input.pdf --out output.jpg

Para un renderizado real de PDF, instala Poppler mediante Homebrew:

brew install poppler
pdftoppm -jpeg -r 300 input.pdf output

Acción rápida de Automator

Puedes construir un servicio de clic derecho en Automator que ejecute pdftoppm sobre cualquier PDF seleccionado. Esto es útil si conviertes páginas con regularidad y no quieres recordar los flags.

Conversión en Linux

Poppler suele ser la mejor opción en Linux.

sudo apt install poppler-utils

pdftoppm -jpeg -r 300 input.pdf output
pdftoppm -png -r 300 input.pdf output

Para salida WebP, convierte primero a PNG y luego usa cwebp:

pdftoppm -png -r 300 input.pdf temp
cwebp temp-1.png -o output.webp

Conversión por lotes

Si tienes una carpeta de PDF y quieres una imagen por primera página:

for f in *.pdf; do
    pdftoppm -jpeg -r 300 -f 1 -l 1 "$f" "${f%.pdf}"
done

ImageMagick

ImageMagick funciona en Linux, pero suele ser más lento para PDF porque rasteriza a través de Ghostscript:

magick -density 300 input.pdf[0] -quality 90 output.jpg

Establece -density antes de leer el PDF. Colocarlo después no servirá.

Conversión con código

TypeScript / Node.js

Usa pdfjs-dist para renderizar páginas en un canvas, luego exporta a datos de imagen.

import * as pdfjsLib from "pdfjs-dist"
import { createCanvas } from "canvas"
import fs from "fs"

async function pdfPageToPng(
  pdfPath: string,
  pageNumber: number,
  outputPath: string,
  scale: number = 2
) {
  const data = new Uint8Array(fs.readFileSync(pdfPath))
  const pdf = await pdfjsLib.getDocument({ data }).promise
  const page = await pdf.getPage(pageNumber)

  const viewport = page.getViewport({ scale })
  const canvas = createCanvas(viewport.width, viewport.height)
  const context = canvas.getContext("2d")

  await page.render({ canvasContext: context, viewport }).promise

  const buffer = canvas.toBuffer("image/png")
  fs.writeFileSync(outputPath, buffer)

  await pdf.destroy()
}

await pdfPageToPng("input.pdf", 1, "output.png", 2)

El valor scale se mapea aproximadamente a DPI: un scale de 2 a 72 DPI da una salida de 144 DPI. Para 300 DPI, usa un scale de aproximadamente 4.17.

En el navegador, nuestro conversor PDF a PNG realiza el mismo paso de renderizado en canvas sin enviar el archivo a ningún sitio.

PHP

PHP puede ejecutar pdftoppm mediante shell o usar bibliotecas como spatie/pdf-to-image, que envuelve ImageMagick:

<?php

use Spatie\PdfToImage\Pdf;

$pdf = new Pdf('input.pdf');
$pdf->setPage(1)
    ->setOutputFormat('png')
    ->saveImage('output.png');

Si prefieres no añadir una dependencia, llama directamente a Poppler:

<?php

function pdfPageToPng(string $input, int $page, string $output, int $dpi = 300): void {
    $cmd = sprintf(
        'pdftoppm -png -r %d -f %d -l %d %s %s',
        $dpi,
        $page,
        $page,
        escapeshellarg($input),
        escapeshellarg($output)
    );
    exec($cmd);
}

pdfPageToPng('input.pdf', 1, 'output', 300);

Esto escribe output-1.png. Añade tu propio manejo de errores antes de usarlo en producción.

Go

Go no tiene un renderizador de PDF integrado, pero github.com/gen2brain/go-fitz envuelve MuPDF:

package main

import (
	"image/jpeg"
	"os"

	"github.com/gen2brain/go-fitz"
)

func main() {
	doc, err := fitz.New("input.pdf")
	if err != nil {
		panic(err)
	}
	defer doc.Close()

	img, err := doc.Image(0)
	if err != nil {
		panic(err)
	}

	out, err := os.Create("output.jpg")
	if err != nil {
		panic(err)
	}
	defer out.Close()

	if err := jpeg.Encode(out, img, &jpeg.Options{Quality: 90}); err != nil {
		panic(err)
	}
}

go-fitz devuelve imágenes a la resolución de renderizado por defecto del PDF. Consulta la documentación de la biblioteca si necesitas control de DPI.

Java

Apache PDFBox es la opción estándar para trabajar con PDF en Java.

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PdfToImage {
    public static void main(String[] args) throws IOException {
        try (PDDocument document = PDDocument.load(new File("input.pdf"))) {
            PDFRenderer renderer = new PDFRenderer(document);
            BufferedImage image = renderer.renderImageWithDPI(0, 300);
            ImageIO.write(image, "png", new File("output.png"));
        }
    }
}

Dependencia de Maven:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>3.0.2</version>
</dependency>

renderImageWithDPI recibe un índice de página basado en cero y un valor de DPI.

Python

Python lo hace sencillo con pymupdf o pdf2image.

Con pymupdf:

import fitz

doc = fitz.open("input.pdf")
page = doc[0]

mat = fitz.Matrix(2, 2)
pix = page.get_pixmap(matrix=mat)
pix.save("output.png")

El Matrix controla la escala. Para aproximadamente 300 DPI desde un PDF de 72 DPI, usa fitz.Matrix(300/72, 300/72).

Con pdf2image, que envuelve Poppler:

from pdf2image import convert_from_path

images = convert_from_path("input.pdf", dpi=300, first_page=1, last_page=1)
images[0].save("output.jpg", "JPEG", quality=90)

pdf2image es conveniente, pero requiere que Poppler esté instalado en el sistema.

Errores comunes

  • Olvidar el DPI. El renderizado por defecto de PDF suele ser 72 o 96 DPI. A esa resolución, el texto se ve borroso. Especifica siempre el DPI de salida si la calidad importa.
  • Ignorar el espacio de color. Un PDF en CMYK convertido a RGB sin un perfil puede verse desvaído o sobresaturado.
  • Volver a codificar PDF escaneados. Si el PDF ya es un escaneo JPEG, convertirlo a PNG no recuperará detalle perdido. Solo hará el archivo más grande.
  • Sustitución de fuentes. Los servidores headless a veces carecen de las fuentes incrustadas en el PDF. El renderizador las sustituye y el diseño se rompe. Incrustar fuentes al crear el PDF evita esto.
  • Numeración de páginas desfasada. Las APIs de código suelen usar índices de página basados en cero. Las herramientas de línea de comandos suelen usar índices basados en uno.

Qué usar en cada caso

  • Uso personal puntual: Preview en macOS, un lector de PDF en Windows, o un conversor de navegador.
  • Procesamiento por lotes en servidor: pdftoppm o pdf2image.
  • Dentro de un producto: Apache PDFBox para Java, pymupdf para Python, pdfjs-dist para TypeScript.
  • Archivos sensibles a la privacidad: Usa una herramienta basada en navegador para que el PDF nunca abandone el dispositivo.

Si quieres el camino más rápido sin instalar nada, nuestros conversores PDF a JPG, PDF a PNG y PDF a WebP se ejecutan completamente en el navegador.

Más publicaciones del blog para leer