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
- Gerador de XML: https://imextecnologia.github.io/tributacao/
- Painel de tributos por estado: https://imextecnologia.github.io/tributacao/tributos.html
Código
imextecnologia
/
tributacao
tributacao
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
-
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 emxml/(veja Busca automática do PDF). - Leitura com IA – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.
-
Comparação – os valores são comparados com o XML do mês anterior (em
xml/) e o que mudou fica destacado. - 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:
- Front-end estático (HTML, CSS e JavaScript) hospedado no GitHub Pages.
- 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.
- 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.
- 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.
-
Scripts Node em
scripts/para buscar o PDF, gerar o XML e montar os assets. PDFs e XMLs de cada mês ficam versionados empdf/exml/, eexemplos/traz um par de referência.
Para rodar localmente:
node scripts/gerar-arquivos.js
npx http-server -p 5500
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)