DEV Community

Felipe
Felipe

Posted on

O maldito ReportLab

Como foi migrar um relatório criado com o ReportLab para o Jinja2 e WeasyPrint.


Tudo começou com uma demanda de correção nos valores informados em alguns relatórios em PDF, gerados por processos (DAGS) dentro do Apache Airflow.

O Airflow funciona como uma aplicação web, onde existe um painel onde podemos ativar e desativar as DAGS (grafos acíclicos). São basicamente processos que podemos ativar e desativar quando bem quisermos.

Por fora, esse projeto era bem simples. Cada DAG verificava se existia um novo pedido de relatório na aplicação em produção e dava início à sua criação com todos os dados necessários e, no final, jogava tudo em um bucket do S3.

O Grande Problema

Os valores informados nos relatórios estavam inconsistentes, incrivelmente errados, errados para mais, e todos esses valores eram valores monetários (dinheiro). Um puta problemão.

A grande questão se deu dentro do ReportLab. Todo o bloco de código que o envolvia me atormentava, pois ele era e ainda é muito complicado de entender. Mesmo olhando a documentação (talvez eu não tenha olhado direito, mas também não tinha tempo para estudar um negócio totalmente novo).

A IA como meu socorrista

Provavelmente esse foi meu uso mais consciente da IA. Sim, como os macacos faziam antes, dentro de um chat. Ele me ajudou a melhorar queries de SQL/MySQL e adicionar regras nelas para resolver a questão com os valores.

Hoje, no dia 16 de agosto de 2026, a forma mais fácil e rápida de usar IA como dev é dentro do seu terminal, simples assim. Os famosos agentes editam, criam e geram imagens, SVGs rapidamente dentro do seu projeto. PS: uso muito o CODEX e o pobre do ANTIGRAVITY do Google.

Todo o problema inicial era viável de ser resolvido só com o banco e as queries, mas houve um pedido de incremento de um resumo no relatório.

Alguma solução?

Nesse ponto eu entendi a diferença entre montar e renderizar um PDF. Em pacotes/libs/bibliotecas como o ReportLab, você constrói o PDF como um Lego. Calculando o espaçamento, seja em pixel ou milímetro, fazendo o append de algum componente visual e a lógica maluca para montar tabelas junto a mais uma grande quantidade de problemas.

Agora, renderizar um PDF é outro mundo; transformar aquele HTML que você escreve quase todo dia em um documento pronto é surreal. Algumas ferramentas deixam tudo tão simples; tudo deveria ser assim.

Renderizar é exatamente o que seu navegador faz quando você usa o atalho de impressão (CTRL + P).

Conclusão:

Criei bem rápido um novo repositório só para teste do WeasyPrint e do Jinja2. Usei o próprio chat de IA para me ajudar a replicar com certa exatidão em HTML o relatório anterior e com as marcações do Jinja2. E dito e feito: em um dia (dia completo) e mais uma noite, eu tinha replicado o PDF com certa exatidão e com o mesmo comportamento. Agora, graças a Deus, com os valores corretos.

No fim, eu acho que é isso. No meu caso, vou sempre optar por soluções simples, pois o simples, quase todas as vezes, vai ser superior e te poupar tempo.

Até a próxima!

Alguns links que podem ser úteis:
openai/codex

Google Antigravity

ReportLab

Jinja - Documentation (3.1.x)

First Steps - WeasyPrint

Top comments (0)