danfse-brasil e uma biblioteca Python para gerar DANFSe em PDF ou HTML a partir do XML nacional da NFS-e. O projeto implementa o Documento Auxiliar da Nota Fiscal de Servico Eletronica seguindo o layout da Nota Tecnica 008/2026 SE/CGNFS-e e inclui compatibilidades pontuais da NT 009/2026 para campos RTC, IBS/CBS e CNPJ alfanumerico.
A biblioteca foi pensada para ERPs, sistemas fiscais, rotinas contabeis, portais de notas e backends Python que precisam converter XML da NFS-e Nacional em um PDF de DANFSe gerado localmente. O foco do projeto e entregar um renderizador previsivel, testavel e alinhado aos caminhos XML definidos pela documentacao tecnica.
Use esta biblioteca quando a sua aplicacao ja possui o XML da NFS-e Nacional e precisa gerar o documento auxiliar em PDF ou HTML. Alguns exemplos de uso:
- gerar DANFSe em um ERP ou sistema fiscal;
- anexar PDF de NFS-e em um portal de notas;
- criar rotinas de arquivo XML/PDF para escritorios contabeis;
- validar campos esperados antes de imprimir o documento auxiliar;
- depurar o layout em HTML antes de gerar o PDF final.
O danfse-brasil separa leitura do XML, modelo de dados, validacao e renderizacao. Essa estrutura permite usar a biblioteca tanto pela CLI quanto diretamente no codigo Python, sem acoplar o DANFSe a uma aplicacao especifica.
O pacote nao substitui a validacao fiscal feita pelo emissor, prefeitura, Ambiente de Dados Nacional ou processos internos de cada empresa. Ele gera o documento auxiliar a partir dos dados existentes no XML recebido.
A implementacao segue a documentacao oficial da NT 008:
Tambem existem compatibilidades pontuais com campos introduzidos ou ajustados pela NT 009:
https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-009-se-cgnfse-v1-0-1.pdf
O PDF e os campos foram validados por implementacao local e testes automatizados da biblioteca, mas esta versao ainda nao foi homologada por um validador oficial externo.
- Gera DANFSe em PDF via WeasyPrint.
- Gera HTML para depuracao, preview ou integracao propria.
- Le XML nacional da NFS-e e monta os blocos do DANFSe.
- Gera QR Code com URL publica de consulta pela chave de acesso.
- Respeita regras de supressao/reducao de blocos previstas na NT 008.
- Mantem CNPJ alfanumerico sem formatacao indevida.
- Expoe validador com
errorewarningpara campos ausentes, medidas e regras condicionais. - Inclui CLI
danfse-brasilpara uso direto no terminal.
O objetivo do projeto e reproduzir o DANFSe com os caminhos XML, descricoes, medidas, fontes e regras de supressao definidos na NT 008. A biblioteca nao inventa valores: quando uma tag exigida para um campo nao existe no XML, o campo e preenchido com -, conforme a nota 12 da tabela 2.4.5.
Isso significa que a biblioteca nao copia automaticamente dados entre grupos diferentes do XML. Exemplo: o nome do Prestador / Fornecedor e lido de NFSe/infNFSe/DPS/infDPS/prest/xNome. Se o XML possuir NFSe/infNFSe/emit/xNome, mas nao possuir prest/xNome, o DANFSe exibira - e o validador retornara um aviso.
Requisitos principais:
- Python 3.10+
uv- WeasyPrint
qrcode[pil]- No Windows, runtime nativo do WeasyPrint via MSYS2
- Fontes Arial e Microsoft Sans Serif instaladas no sistema
Use Python 3.10 ou superior.
Instale o uv:
pip install uvNo Windows, instale o MSYS2 e o runtime do WeasyPrint:
pacman -S --noconfirm mingw-w64-x86_64-pangoO pacote carrega por padrao o diretorio:
C:\msys64\mingw64\bin
Se o MSYS2 estiver em outro caminho, defina WEASYPRINT_DLL_DIRECTORIES apontando para o mingw64\\bin.
Instale as dependencias da biblioteca:
cd "C:\caminho\para\danfse-brasil"
uv syncPara instalar diretamente em outro projeto enquanto o pacote nao estiver publicado no PyPI:
pip install "danfse-brasil @ git+https://github.com/joaovmgs/danfse-brasil.git"Gerar PDF:
uv run danfse-brasil xml.xml --output danfse.pdfGerar HTML:
uv run danfse-brasil xml.xml --output danfse.htmlModo estrito de fontes:
uv run danfse-brasil xml.xml --output danfse.pdf --strict-fontsfrom pathlib import Path
from danfse_brasil import parse_danfse, render_danfse_pdf, validate_danfse_data
data = parse_danfse("xml.xml")
issues = validate_danfse_data(data)
if issues:
for issue in issues:
print(issue.code, issue.message)
else:
render_danfse_pdf(data, Path("danfse.pdf"))from danfse_brasil import parse_danfse, validate_danfse_data
data = parse_danfse("xml.xml")
issues = validate_danfse_data(data)
for issue in issues:
print(f"{issue.severity}: {issue.code}: {issue.message}")O repositorio inclui um script para gerar um PDF de exemplo e, quando o PyMuPDF estiver disponivel, renderizar a primeira pagina em PNG para revisao visual:
uv run --with pymupdf python scripts/visual_check.py xml.xmlSaida esperada:
tmp/pdfs/danfse-visual-check.pdftmp/pdfs/danfse-visual-check-page1.png
O script tambem valida que o PDF possui uma pagina em tamanho A4 aproximado. Avisos do validador nao bloqueiam a geracao; erros bloqueiam.
A NT 008 exige:
- Arial para titulos e labels
- Microsoft Sans Serif para conteudo dos demais campos
Se a fonte nao estiver instalada, a CLI avisa. Para checagem mais rigorosa, use --strict-fonts.
- Cabecalho do DANFSe e identificacao da NFS-e
- Dados da NFS-e
- Prestador / Fornecedor
- Tomador / Adquirente
- Destinatario da Operacao
- Intermediario da Operacao
- Servico Prestado
- Tributacao Municipal (ISSQN)
- Tributacao Federal (Exceto CBS)
- Tributacao IBS / CBS
- Valor Total da NFS-e
- Informacoes Complementares
- Canhoto opcional
- QR Code usando a URL publica da NFS-e com a chave de acesso
- Mensagem de homologacao quando
tpAmb == 2 - Campos ausentes preenchidos com
- - Descricoes oficiais para codigos normativos mapeados
- Municipios resolvidos por tabela local gerada da API oficial do IBGE
- Supressao/reducao de Tomador, Destinatario, Intermediario e Tributacao Municipal quando aplicavel
- Linhas opcionais do ISSQN suprimidas quando todos os campos da linha nao existem no XML
- Linha PIS/COFINS da Tributacao Federal impressa somente para competencia ate o fim do ano-calendario de 2026, conforme nota 6
- Informacoes Complementares montadas na ordem definida pela NT
- Validador de medidas, tamanhos maximos de campos e regras condicionais implementadas
- Validador com avisos para campos minimos ausentes no caminho XML normativo
A revisao visual do DANFSe deve considerar os seguintes pontos da NT 008/2026:
- Papel A4 em orientacao retrato, uma unica pagina.
- Borda externa e blocos posicionados conforme medidas em centimetros da tabela 2.4.5.
- Margem interna preservada entre textos, linhas, sombreamentos e borda externa.
- Logomarca oficial da NFS-e no cabecalho, sem fundo preto e sem invadir a margem.
- Titulo
DANFSe v2.0eDocumento Auxiliar da NFS-ecentralizados. - QR Code com a URL publica de consulta pela chave de acesso.
- Mensagem
NFS-e SEM VALIDADE JURIDICAapenas quandotpAmb == 2. - Labels em Arial e conteudo em Microsoft Sans Serif, respeitando os tamanhos minimos.
- Supressoes/reducoes dos blocos permitidos: Tomador, Destinatario, Intermediario, Tributacao Municipal e Canhoto.
- Campos sem tag normativa impressos como
-, sem fallback automatico entre grupos XML.
Limitacoes conhecidas:
- A biblioteca ainda nao possui homologacao em validador oficial externo.
- A validacao automatica confere constantes, tamanho A4, renderizacao e regras de dados, mas a comparacao fina com o Anexo I continua sendo uma revisao visual humana.
- A disponibilidade real de Arial e Microsoft Sans Serif depende do sistema operacional e do runtime do WeasyPrint.
- CNPJ alfanumerico e preservado sem formatacao quando nao for composto apenas por 14 digitos.
finNFSetambem e lido no caminhoNFSe/infNFSe/DPS/infDPS/finNFSe.tpNFSeCreditoetpNFSeDebitosao lidos e descritos quando informados.opSimpNac = 4e descrito comoOptante Pendente.regApIBSCBSSN,cAtvSN,vReceitaBrutaSNegTribSNsao extraidos quando existem no XML.gIBSCBSAjuste/vIBSegIBSCBSAjuste/vCBSsao preservados no modelo de dados.indFinale lido como indicador de uso ou consumo pessoal.imovel,bensMoveisegPgtoVinc/pgtosao identificados em campos de resumo/contagem no modelo de dados.- O grupo
vAjusteBCe considerado nos campos de deducoes/reducoes quando presente. - Quando os totalizadores antigos de IBS/CBS nao existem, os valores de
gTribSNpodem compor os totais exibidos.
Essas compatibilidades nao alteram o layout visual do DANFSe definido na NT 008 e nao autorizam fallback automatico entre emit e prest. Campos da NT 009 que nao possuem posicao propria no DANFSe NT 008 ficam disponiveis no modelo para validacao, auditoria ou uso por aplicacoes consumidoras.
validate_danfse_data retorna objetos ValidationIssue com:
code: codigo estavel da validacao.message: descricao do problema e, quando aplicavel, caminho XML esperado.severity:errorouwarning.
A CLI bloqueia a geracao somente quando existe severity == "error". Avisos sao impressos como diagnostico e o DANFSe continua sendo gerado.
Rodar testes:
uv run python -m unittest discover -s tests -vChecar compilacao:
uv run python -m compileall -q src tests- Nao use fallback entre grupos diferentes do XML para preencher informacoes.
- Dados de exemplo, caches e artefatos gerados devem ficar fora do controle de versao.
Este projeto e publicado com uma licenca de uso propria, incluida em LICENSE.
Uso comercial exige mencao visivel de que o produto, servico ou distribuicao utiliza danfse-brasil.
About sugerido para o GitHub:
Biblioteca Python para gerar DANFSe PDF/HTML a partir do XML nacional da NFS-e, seguindo a NT 008/2026 e compatibilidades NT 009/2026.
Website sugerido:
https://github.com/joaovmgs/danfse-brasil#readme
Topicos sugeridos:
danfse, nfse, nfs-e, nfse-nacional, nota-fiscal, nota-fiscal-servico, python, pdf, xml, weasyprint, rtc, ibs, cbs, brasil