O que você realmente precisa saber sobre linguagem python pdf
A maioria das pessoas quando busca por linguagem python pdf está num contexto específico: quer gerar documentos PDF a partir de scripts Python, ou então extrair texto de PDFs existentes para processamento. São duas vertentes completamente diferentes e a maioria dos tutoriais que você encontra na internet mistura as duas coisas sem aviso prévio. Eu já perdi duas horas tentando entender por que meu código não funcionava porque o tutorial que eu estava seguindo ia gerar PDFs e o que eu precisava era ler um. O caminho mais direto para quem está começando é a biblioteca ReportLab. Ela é o padrão do setor há mais de dez anos, tem documentação razoável, mas o_CUR_ e o_Paged_ são dois conceitos que todo mundo ignora no início e que causam dor de cabeça depois. Quando você cria um documento multipáginas e não domina a lógica de paginação manual, o ReportLab simplesmente quebra sem avisar. A exceção que ele joga é genérica demais pra ser útil. Eu resolvi isso usando um controle manual de Y position com uma verificação de margem inferior antes de cada bloco de texto. Sim, é chato. Funciona.
Como gerar PDFs com linguagem python pdf
Instalação: pip install reportlab. Não tenha ilusões, vai precisar de mais dependências depois. Se você for trabalhar com fontes TrueType em português, prepare-se para lidar com encoding issues que não aparecem no primeiro teste. O problema é que as fontes padrão do ReportLab não cobrem todos os caracteres acentuados de forma consistente em todas as plataformas. A solução que eu uso é carregar uma fonte como a DejaVuSans explicitamente e nunca confiar no fallback automático.
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('DejaVu', 'DejaVuSans.ttf'))
c = canvas.Canvas('meu_documento.pdf', pagesize=A4)
width, height = A4
c.setFont('DejaVu', 11)
y = height - 50
for linha in range(20):
c.drawString(50, y, f'Linhas {linha+1} do documento')
y -= 25
if y 50:
c.showPage()
y = height - 50
c.save()
Esse código gera um PDF com aproximadamente 3 segundos de processamento em uma máquina comum. Não é rápido, mas é previsível. O tempo varia conforme a complexidade dos gráficos e a quantidade de páginas. Se você precisa gerar centenas de PDFs em lote, considere usar PDFKit com wkhtmltopdf por baixo. O fluxo muda completamente: você escreve HTML com CSS e converte. A qualidade visual é muito superior, especialmente para tabelas e layouts complexos.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Extraindo texto de PDFs com Python
Se o seu objetivo é o oposto — ler PDFs ao invés de criá-los — o ecossistema é mais fragmentado. O PyPDF2 (agora chamado PyPDF) lê estrutura básica e funciona para documentos simples. Mas você vai esbarrar em limitações sérias logo nos primeiros arquivos com layouts complexos. A ordem de extração de texto pode vir embaralhada quando o PDF usa colunas ou tabelas. O texto extraído perde formatação completamente. E arquivos escaneados são simplesmente ignorados, porque não há conteúdo textual para extrair. A alternativa que eu recomendo é o pdfplumber. Ele usa o pdfminer.six por baixo mas adiciona uma camada de conveniência que faz diferença real. A extração de tabelas com pdfplumber é significativamente mais precisa do que com PyPDF2. O problema é performance: pdfplumber é mais lento. Para um PDF de 50 páginas, o tempo de processamento pode ser de 8 a 12 segundos contra 2 segundos do PyPDF2. Vale o investimento se você precisa de estrutura de tabelas.
import pdfplumber
with pdfplumber.open('arquivo.pdf') as pdf:
for pagina in pdf.pages[:5]:
texto = pagina.extract_text()
tabelas = pagina.extract_tables()
print(f'Página: {pagina.page_number}')
print(f'Texto: {texto[:200] if texto else "Nenhum"}')
for t in tabelas:
print(t)
Problemas práticos que ninguém conta
O maior problema que eu encontro na prática com linguagem python pdf não está na geração nem na extração. Está na consistência entre ambientes. Um PDF gerado no Linux pode renderizar diferentes de um gerado no Windows quando aberto no mesmo leitor. Fontes faltando, margens deslocadas, imagens rasterizadas de forma diferente. Isso acontece porque os sistemas operacionais têm pools de fontes distintos e o ReportLab consulta o sistema para resolver referências. Minha recomendação, depois de testar várias abordagens: registre todas as fontes explicitamente usando caminhos absolutos para arquivos .ttf. Nunca use nomes de fonte genéricos como 'Helvetica' ou 'Times-Roman' sem registrar a versão exata que você quer. Se o deploy for em Docker, inclua os arquivos de fonte no container. Se for em Windows Server, instale as fontes no sistema antes de rodar o script. Gaste 15 minutos resolvendo isso no início e economiza horas de debugging depois.
Outro ponto negligenciado: o tamanho do arquivo. PDFs gerados com ReportLab tendem a ser grandes quando incluem imagens. O padrão é embutir as imagens sem compressão agressiva. Se você precisa enviar PDFs por email ou upload, aplique compressão JPEG nas imagens antes de incorporá-las. Reduzir uma imagem de 3MB para 300KB antes de colocar no PDF pode diminuir o arquivo final em 60 a 70%. Isso é especialmente relevante quando você gera PDFs dinamicamente com gráficos gerados por Matplotlib. Não existe uma solução única de linguagem python pdf que cubra todos os casos. Se você precisa apenas gerar recibos simples, ReportLab resolve em uma tarde. Se precisa extrair dados de milhares de notas fiscais em PDF, pdfplumber com tratamento de erros é o caminho. Se o requisito é layout editorial de alta qualidade, esqueça Python puro e use HTML com PDFKit. Cada abordagem tem trade-offs reais que aparecem só quando o projeto sai do tutorial e vai para produção. O que funciona em um caso quase nunca é o ideal para o outro.