DEV Community

Fabio Nobre
Fabio Nobre

Posted on

Deixei a IA ler o PDF de tributos dos combustíveis por mim todo mês

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥

Esta é uma submissão para o Hacktoberfest Open-Source AI Challenge: Week 3, "Slow and Steady".

O que eu construí

Todo mês a Fecombustíveis publica um PDF com a carga tributária estadual dos combustíveis: PMPF, alíquota de ICMS, PIS/COFINS, por produto e por estado. E todo mês alguém precisa abrir esse PDF, conferir número por número e transformar aquilo no XML TransparenciaTributos que o sistema de emissão fiscal consome.

Esse "alguém" era eu. Então construí o tributacao: um site estático que pega o PDF do mês, usa IA para extrair os valores por combustível e UF, compara com o XML do mês anterior e gera novos blocos de vigência só para os combustíveis cujos valores mudaram.

Além do XML, ele oferece:

  • Exportação para Excel, para quem prefere conferir em planilha;
  • Uma página pública com os tributos por estado, para consulta rápida;
  • Checagens de consistência: o site sinaliza valores que não fecham (PMPF × alíquota vs. ICMS, e PMPF × 9,25% vs. PIS/COFINS no caso do GNV), para a revisão humana focar onde importa.

Os produtos ANP mapeados são gasolina C, gasolina premium, etanol hidratado, diesel S-500, diesel S-10 e GNV. O que não está mapeado fica intocado no XML.

Demo

Código

Transparência de Tributos – Combustíveis

Site estático (GitHub Pages) que gera todo mês o XML TransparenciaTributos a partir do PDF "Carga tributária estadual" da Fecombustíveis.

Site: https://imextecnologia.github.io/tributacao/ · Tributos por estado: https://imextecnologia.github.io/tributacao/tributos.html

Como funciona

  1. Busca do PDF – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em pdf/ e já gera o XML do mês em xml/ (veja Busca automática do PDF).
  2. Leitura com IA – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.
  3. Comparação – os valores são comparados com o XML do mês anterior (em xml/) e o que mudou fica destacado.
  4. Geração – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão Também é possível baixar uma planilha…

Como eu construí

A arquitetura é propositalmente simples, para não ter servidor para manter:

  1. Front-end estático (HTML, CSS e JavaScript) hospedado no GitHub Pages.
  2. Extração com IA: o PDF é enviado ao Google Gemini, que devolve os valores estruturados por combustível e estado. PDF tabular de órgão público é exatamente o tipo de documento em que regex quebra a cada mudança de layout, e um modelo multimodal lida bem com isso.
  3. Diff inteligente: em vez de regerar tudo, o script compara com o XML do mês anterior e cria vigências novas apenas onde houve alteração. Isso mantém o histórico limpo e facilita a auditoria.
  4. Automação com GitHub Actions: um workflow roda a cada 8 horas, verifica se saiu PDF novo, gera o XML, atualiza os dados do painel e manda alerta por e-mail e Discord quando algo muda. Os segredos de alerta são opcionais; sem eles o workflow roda do mesmo jeito.
  5. Scripts Node em scripts/ para buscar o PDF, gerar o XML e montar os assets. PDFs e XMLs de cada mês ficam versionados em pdf/ e xml/, e exemplos/ traz um par de referência.

Para rodar localmente:

node scripts/gerar-arquivos.js
npx http-server -p 5500
Enter fullscreen mode Exit fullscreen mode

Uma lição sobre chave de API em site estático

Num site 100% estático, a chave do Gemini acaba visível no código-fonte da página. A mitigação que adotei e documentei no README é restringir a chave por HTTP referrer e somente à Generative Language API. Se você for copiar a ideia, faça isso antes de publicar.

Por que a inovação aberta importa?

Sendo transparente: o modelo que uso hoje (Gemini) é fechado. O que é aberto aqui é todo o resto, e é justamente isso que torna o projeto útil:

  • O código é público. Qualquer posto, distribuidora ou software house que precise do mesmo XML pode usar, auditar ou adaptar.
  • Os dados são públicos e versionados. Cada PDF e cada XML gerado ficam no repositório, então dá para ver exatamente o que mudou de um mês para o outro e quando.
  • A camada de IA é substituível. A extração é uma etapa isolada do pipeline. Trocar o Gemini por um modelo open-weight rodando localmente é o próximo passo natural, e eliminaria de vez o problema da chave exposta.

Tributação é assunto de interesse público. Uma ferramenta que traduz um PDF oficial em dados estruturados deveria ser aberta, verificável e fácil de reproduzir.

A recompensa da preguiça

Antes: baixar o PDF, abrir lado a lado com o XML do mês passado, conferir estado por estado, editar vigências na mão e torcer para não ter errado uma casa decimal.

Agora: o GitHub Actions percebe o PDF novo sozinho, gera o XML, e eu só recebo um aviso no Discord. Minha parte é revisar os valores que o próprio site destacou como inconsistentes. A IA faz o trabalho chato; eu fico com a decisão.

Top comments (0)