Análises Profundas

Como converter páginas de PDF em imagens: um guia prático

koboshiCo-founder
·10 min de leitura
Como converter páginas de PDF em imagens: um guia prático
Resumo

As páginas de PDF nem sempre se encaixam onde você precisa. Este guia aborda quando converter PDF em imagens, os compromissos de cada abordagem, os métodos nativos dos sistemas operacionais e exemplos de código em cinco linguagens.

Um desenvolvedor frontend recebe um PDF de diretrizes de marca de 40 páginas e precisa inserir três páginas específicas em um quadro do Figma. Um engenheiro de suporte quer colar um diagrama de um datasheet em uma conversa do Slack. Um advogado precisa anexar a página de um contrato assinado a um e-mail sem enviar o arquivo inteiro.

O PDF foi feito para documentos com layout fixo. A web, editores de imagem e aplicativos de mensagens funcionam com pixels. Converter uma página de PDF em imagem preenche essa lacuna, mas o método escolhido altera a qualidade do resultado, o tamanho do arquivo e o nível de controle que você mantém.

Por que o PDF é ótimo e irritante para isso

O PDF armazena páginas como um fluxo de comandos de desenho: posicione esse glifo, desenhe esse vetor, renderize essa imagem nesse tamanho. Isso o torna independente de resolução e visualmente consistente. Também significa que um PDF não é uma imagem. Para transformá-lo em uma, algo precisa renderizar esses comandos em uma tela rasterizada.

As vantagens:

  • Texto e vetores permanecem nítidos em qualquer nível de zoom porque são descritos matematicamente, não armazenados como pixels.
  • Um único PDF pode conter centenas de páginas em um só arquivo.
  • Fontes, perfis de cor e anotações acompanham o documento.

As dificuldades:

  • Leitores de PDF renderizam de formas diferentes. A mesma página pode parecer ligeiramente distinta no Adobe Acrobat, Preview, Chrome ou em uma biblioteca headless.
  • PDFs digitalizados são apenas imagens dentro de um container PDF, então "convertê-los" significa reencodar, o que pode adicionar artefatos ou inchá-los.
  • PDFs complexos com transparência, camadas ou formulários interativos podem ser achatados de forma imprevisível.
  • As dimensões das páginas variam. Uma página US Letter a 72 DPI tem 612 por 792 pixels. A 300 DPI, tem 2550 por 3300. Se você não especificar a resolução, pode obter algo inutilizável.

No que as pessoas realmente convertem PDFs

A maioria das tarefas de conversão se encaixa em um dos três formatos de saída. Cada um tem uma função diferente.

FormatoIdeal paraCompromisso
JPGFotos, prévias, anexos de e-mail, galerias webCom perda, mas arquivos pequenos
PNGCapturas de tela, diagramas, qualquer coisa que precise de transparênciaSem perda, maior que JPG para fotos
WebPWeb moderna, aplicativos, qualquer lugar onde a banda importeMenor que JPG/PNG, ligeiramente menos universal

Depois, há as dimensões práticas:

  • Página única vs. lote. Uma página é fácil. Uma pasta de faturas exige automação.
  • DPI. 150 DPI é suficiente para miniaturas. 300 DPI é o padrão para impressão e OCR. 600 DPI é exagero, a menos que você vá ampliar detalhes finos.
  • Espaço de cor. RGB é seguro para telas. PDFs CMYK convertidos para RGB podem sofrer mudanças de cor se a conversão for ingênua.

Escolhendo a abordagem certa

A ferramenta certa depende do que você está otimizando.

Conversão rápida no navegador

Se você só precisa de uma página como JPG, PNG ou WebP e o arquivo não é sensível a ponto de exigir um servidor, um conversor baseado no navegador é o caminho mais rápido. Nossas ferramentas PDF para JPG, PDF para PNG e PDF para WebP renderizam o PDF localmente. O arquivo nunca sai do seu dispositivo, o que importa para contratos, documentos de identidade e prontuários médicos.

Trabalho em lote pela linha de comando

Para pastas de PDFs ou pipelines de CI, uma ferramenta de linha de comando é superior. Você obtém saída repetível, controle de DPI e scriptabilidade.

Conversão dentro de uma aplicação

Quando a conversão faz parte de um produto, chamar uma biblioteca geralmente é mais limpo do que executar uma ferramenta CLI via shell. Isso remove uma dependência externa e oferece tratamento de erros consistente com o restante da base de código.

Convertendo no Windows

Adobe Acrobat

  1. Abra o PDF e vá até a página desejada.
  2. Escolha Arquivo > Exportar para > Imagem > JPEG/PNG/TIFF.
  3. Defina a resolução de saída na caixa de diálogo de exportação.
  4. Salve.

O Acrobat produz resultados confiáveis, mas não é gratuito e não é scriptável sem o SDK pago.

PDF-XChange Editor

Uma alternativa mais leve com uma camada gratuita. Arquivo > Exportar > Exportar páginas como imagens permite escolher o formato, o DPI e o intervalo de páginas.

PowerShell com pdftoppm

Instale o Poppler para Windows e use o pdftoppm pelo PowerShell:

pdftoppm -jpeg -r 300 input.pdf output

Isso produz output-1.jpg, output-2.jpg e assim por diante, uma por página, a 300 DPI.

Para PNG com fundos transparentes:

pdftoppm -png -r 300 input.pdf output

Para uma única página:

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

As flags -f e -l definem a primeira e a última página.

PowerShell com ImageMagick

O ImageMagick pode renderizar PDFs, mas no Windows geralmente delega isso ao Ghostscript:

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

O [0] significa a primeira página. Sem ele, o ImageMagick pode tentar produzir uma imagem com vários quadros.

Convertendo no macOS

Preview

  1. Abra o PDF no Preview.
  2. Selecione a miniatura da página desejada.
  3. Escolha Arquivo > Exportar, selecione o formato e defina a resolução.

O Preview é rápido e privado, mas lida com uma página por vez.

Terminal com sips

O macOS inclui o sips, mas ele não renderiza texto de PDF bem. Use-o apenas para PDFs que já são bitmaps:

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

Para renderização real de PDF, instale o Poppler via Homebrew:

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

Ação rápida do Automator

Você pode criar um serviço de clique com o botão direito no Automator que executa o pdftoppm em qualquer PDF selecionado. Isso é útil se você converte páginas com frequência e não quer decorar as flags.

Convertendo no Linux

O Poppler geralmente é a melhor escolha no Linux.

sudo apt install poppler-utils

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

Para saída WebP, converta primeiro para PNG e depois use o cwebp:

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

Conversão em lote

Se você tem uma pasta de PDFs e quer uma imagem por primeira página:

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

ImageMagick

O ImageMagick funciona no Linux, mas geralmente é mais lento para PDFs porque rasteriza via Ghostscript:

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

Defina -density antes de ler o PDF. Colocá-lo depois não ajuda.

Convertendo com código

TypeScript / Node.js

Use o pdfjs-dist para renderizar páginas em um canvas e depois exportar para dados de imagem.

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)

O valor scale mapeia aproximadamente para DPI: um scale de 2 a 72 DPI resulta em saída de 144 DPI. Para 300 DPI, use um scale de aproximadamente 4.17.

No navegador, nosso conversor PDF para PNG executa o mesmo passo de renderização no canvas sem enviar o arquivo a lugar nenhum.

PHP

O PHP pode chamar o pdftoppm via shell ou usar bibliotecas como spatie/pdf-to-image, que envolve o ImageMagick:

<?php

use Spatie\PdfToImage\Pdf;

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

Se preferir não adicionar uma dependência, chame o Poppler diretamente:

<?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);

Isso escreve output-1.png. Adicione sua própria verificação de erros antes de usar em produção.

Go

Go não tem um renderizador de PDF embutido, mas o github.com/gen2brain/go-fitz envolve o 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)
	}
}

O go-fitz retorna imagens na resolução padrão de renderização do PDF. Consulte a documentação da biblioteca se precisar de controle de DPI.

Java

O Apache PDFBox é a escolha padrão para trabalhar com PDF em 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"));
        }
    }
}

Dependência do Maven:

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

O renderImageWithDPI recebe um índice de página baseado em zero e um valor de DPI.

Python

Python facilita isso com pymupdf ou pdf2image.

Com 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")

O Matrix controla o scale. Para aproximadamente 300 DPI a partir de um PDF de 72 DPI, use fitz.Matrix(300/72, 300/72).

Com pdf2image, que envolve o 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)

O pdf2image é conveniente, mas exige que o Poppler esteja instalado no sistema.

Armadilhas comuns

  • Esquecer o DPI. A renderização padrão de PDF geralmente é 72 ou 96 DPI. Nessa resolução, o texto fica borrado. Sempre especifique o DPI de saída se a qualidade importa.
  • Ignorar o espaço de cor. Um PDF CMYK convertido para RGB sem um perfil pode parecer desbotado ou super-saturado.
  • Reencodar PDFs digitalizados. Se o PDF já é um scan JPEG, convertê-lo para PNG não recuperará detalhes perdidos. Apenas aumentará o tamanho do arquivo.
  • Substituição de fontes. Servidores headless às vezes não têm as fontes embutidas no PDF. O renderizador substitui e o layout quebra. Embutir fontes ao criar o PDF evita isso.
  • Erro de numeração de páginas por um. APIs de código geralmente usam índices de página baseados em zero. Ferramentas de linha de comando geralmente usam base um.

O que usar em cada caso

  • Uso pessoal pontual: Preview no macOS, um leitor de PDF no Windows ou um conversor no navegador.
  • Processamento em lote em servidor: pdftoppm ou pdf2image.
  • Dentro de um produto: Apache PDFBox para Java, pymupdf para Python, pdfjs-dist para TypeScript.
  • Arquivos sensíveis à privacidade: use uma ferramenta baseada no navegador para que o PDF nunca saia do dispositivo.

Se você quer o caminho mais rápido sem instalar nada, nossos conversores PDF para JPG, PDF para PNG e PDF para WebP funcionam inteiramente no navegador.

Mais posts do blog