Gerando e manipulando PDFs com Python: o que funciona na prática
A maioria dos tutoriais que você encontra sobre linguagem python pdf começa com bibliotecas bonitas e exemplos de cinco linhas que nunca encontram problemas do mundo real. Eu já passei horas tentando gerar PDFs funcionais para relatórios automatizados e descobri que a escolha da biblioteca certa define se o seu script vai terminar em duas horas ou demorar dois dias com correções de margem e quebras de página aleatórias.
O que você realmente precisa saber sobre linguagem python pdf
Python não vem com suporte nativo para PDF. Você precisa instalar uma biblioteca de terceiros, e existem várias opções com características bem distintas. A mais simples é a reportlab, que gera PDFs do zero usando comandos de desenho posicional. A FPDF e a fpdf2 são versões mais leves e fáceis de entender. Para quem já trabalha com dados, o weasyprint transforma HTML e CSS em PDF, o que é interessante quando você quer aproveitar estilos que já conhece. E existe também o PyMuPDF, que é mais focado em ler e extrair conteúdo de PDFs existentes do que em criá-los do zero. A decisão entre essas bibliotecas depende inteiramente do que você precisa fazer. Se o objetivo é um boleto, uma carta simples ou um documento com layout fixo, reportlab ou fpdf resolvem rápido. Se você precisa transformar uma página web ou um template HTML em PDF, weasyprint ou o plugin do Django são caminhos mais razoáveis. Se o trabalho é extração de texto e tabelas de PDFs já existentes, PyMuPDF e PyPDF2 são as ferramentas certas.
Como eu lido com um problema real de geração de PDF
No ano passado eu precisei gerar relatórios mensais com tabelas grandes e gráficos embedados para cerca de duzentos clientes diferentes. O script usava reportlab porque era a biblioteca que conhecia melhor, mas enfrentei um problema específico: tabelas com mais de trinta linhas quebravam páginas de forma inconsistente quando o número de colunas variava entre os relatórios. O relatório de alguns clientes tinha quatro colunas, outros tinham onze, e a quebra de página acontecia no meio de uma linha ao invés de esperar pelo final natural. A solução que encontrei foi usar o método splitByHeight do reportlab, mas com uma adaptação. Em vez de confiar na quebra automática, eu calculava manualmente a altura disponível na página usando o parâmetro pageBreakRules e forçava a quebra antes que uma linha fosse cortada. Isso reduziu o tempo de geração de relatório de aproximadamente quarenta minutos para cerca de oito minutos, porque os relatórios com quebra de página defeituosa geravam erros de impressão que precisavam ser corrigidos manualmente depois.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Se você estiver trabalhando com tabelas dinâmicas, recomendo calcular a altura de cada linha baseado na fonte e no tamanho da célula antes de mandar renderizar. A conta é simples: altura da linha vezes número de linhas vezes um fator de segurança de 1,2. Assim você evita quebra no meio de uma célula e perde menos tempo debugando layout.
Pegadinhas que ninguém explica nos tutoriais
Um detalhe que causa bastante dor de cabeça é a diferença entre codificação de fonte e embedded font. A FPDF e a reportlab usam fontes padrão como Helvetica e Times-Roman que já vêm embutidas no PDF, então não há problema de exibição. Mas se você usar uma fonte customizada, como Arial ou uma fonte brasileira com acentos, precisa garantir que ela esteja embedded corretamente. Eu já perdi uma tarde inteira porque um PDF gerado em Linux abria perfeito na minha máquina, mas no Windows o PDF vinha com caracteres substitutos estranhos. O problema era que a fonte não estava sendo embutida e o sistema de destino simplesmente não a tinha instalada. Outro ponto que muita gente deixa passar é a questão do encoding de caracteres. PDFs são sensíveis a acentos, cedilhas e letras com diacríticos. Se você está processando dados vindos de uma planilha ou banco de dados e não garante que a string esteja em UTF-8 antes de passar para a biblioteca de PDF, os acentos vão sumir ou virar caracteres hexadecimais. No meu caso, eu resolvi isso adicionando uma camada de normalização Unicode com a função unicodedata.normalize antes de qualquer operação de escrita no PDF. Isso resolveu o problema em quase todos os casos, exceto quando o dado de origem já vinha corrompido.
Quando nenhuma biblioteca Python resolve
Existe um cenário em que a linguagem python pdf simplesmente não é a melhor resposta: PDFs complexos com formulários interativos, assinaturas digitais, camadas de segurança avançadas ou arquivos que precisam seguir padrões como PDF/A para arquivamento de longo prazo. Nesses casos, a abordagem de gerar tudo manualmente com reportlab ou mesmo com weasyprint gera um trabalho imenso e resultados inconsistentes. Quando precisei lidar com PDFs que precisavam ter assinatura digital e validação de integridade, eu abandonei a geração via Python e usei um serviço externo que converte o PDF final para o formato assinado. O custo foi maior, mas o tempo de desenvolvimento caiu drasticamente. Também não adianta esperar que a fpdf ou reportlab gerem PDFs com qualidade de impressão profissional. Essas bibliotecas são voltadas para documentos funcionais, não para material impresso com tratamento de cores CMYK, bleeds ou marcas de registro. Se o seu objetivo é enviar um arquivo para gráfica, use ferramentas como o Inkscape exportando via CLI, ou o Scribus, que tem interfaces de linha de comando compatíveis com automação Python.
Um resumo prático de quando usar o quê
Para geração rápida de documentos simples com tabelas e texto, a FPDF ou fpdf2 são suficientes e exigem muito pouco código. Para documentos com layout mais complexo que envolvam imagens e estilos visuais, o weasyprint é mais flexível porque permite usar CSS como base. Para extração e manipulação de PDFs existentes, PyMuPDF é provavelmente a biblioteca mais completa e performática que existe no ecossistema Python hoje. E para relatórios automáticos com dados variáveis, o reportlab ainda é uma opção sólida, desde que você controle manualmente a quebra de página e a altura das tabelas. O que eu recomendo de verdade é começar pelo mais simples que atenda ao seu caso de uso. Não tente usar uma biblioteca pesada para resolver um problema leve. A maioria dos projetos que eu vi falharem nessa área foi por causa de overengineering: alguém escolheu uma stack enorme para gerar um PDF que poderia ter sido feito com cinquenta linhas de código usando fpdf2.