Biblioteca em .NET 6 / C# para geração do DANFSe (Documento Auxiliar da Nota Fiscal de Serviço Eletrônica) em formato PDF. Esta biblioteca foi desenvolvida em conformidade estrita com as especificações visuais e regras de negócio da Nota Técnica SE/CGNFS-e nº 008.
- Os PDF's dos DANFSe's resultantes ainda não foram comparados com documentos reais gerados pela RFB, pois o formato ainda não está disponível para download/consulta.
A partir de 15 de julho de 2026, a RFB deixará de disponibilizar o DANFSe via API, tornando o desenho e geração do DANFSe de responsabilidade do emissor.
Este pacote efetua a montagem visual da nota sem depender de motores baseados em HTML, gerando o arquivo com coordenadas usando o PDFsharp.
- Sem dependência de binários externos: Geração baseada diretamente no PDFsharp 6.x.
- Conformidade Estrita com a Nota Técnica 008: Respeito rigoroso às fontes, margens, espessuras de bordas e coordenadas exigidas no padrão nacional.
- Logotipo Customizado: Permite enviar a logomarca personalizada do prestador que substitui a marca oficial da NFS-e no cabeçalho respeitando a área delimitada de
4,00 cm x 1,16 cm. - Marca d'água "TESTE": Parâmetro para forçar marca d'água diagonal de teste para homologações visuais internas.
- Stateless: A entrada (XML) e a saída (PDF) são tratadas inteiramente em memória (
byte[]).
NFSe.DANFSe.v2/
│
├── .github/workflows/ # Fluxos de Integração Contínua (GitHub Actions)
│ └── dotnet.yml # Pipeline de build e testes automáticos do CI
│
├── src/ # Projeto Principal (Class Library net6.0)
│ ├── Helpers/ # Formatadores, Resolvers e Utils
│ │ ├── Formatters.cs # Máscaras de CPF, CNPJ, Telefone, CEP e Enums da NT
│ │ ├── IbgeResolver.cs # Resolução de Municípios e UFs baseado em código IBGE
│ │ └── EmbeddedFontResolver.cs # Registro de fontes customizadas no PDFsharp 6.x
│ ├── Models/ # Modelo de dados tipado correspondente ao XML
│ │ ├── DanfseModel.cs # Estrutura de dados populada a partir da NFS-e
│ │ └── NfseSchemaValues.cs # Valores constantes do Schema Nacional da NFS-e
│ ├── Rendering/ # Motor de Renderização PDF
│ │ ├── DanfsePdfRenderer.cs # Geração, desenho do grid e aplicação de lógicas de layout
│ │ ├── DanfseLayoutRegistry.cs # Registro centralizado de coordenadas e metadados dos campos do DANFE
│ │ └── QrCodeVectorDrawer.cs # Desenho vetorial de QR Code
│ └── Resources/ # Recursos embutidos
│ ├── Fonts/ # Fontes LiberationSans (Regular, Bold, Italic)
│ └── Images/ # Logomarca NFS-e nacional horizontal
│
├── Tests/ # Projeto de Testes Unitários (XUnit net6.0)
│ ├── Samples/ # Arquivos XML e logos fictícios de exemplo (higienizados)
│ │ ├── danfse-normal.xml # XML higienizado com dados de teste
│ │ ├── danfse-cancelamento.xml # XML higienizado com evento de cancelamento
│ │ ├── danfse-substituida.xml # XML higienizado com evento de substituição
│ │ ├── danfse-terceiros.xml # XML higienizado com dados de nota emitida por terceiros
│ │ └── logo-alternative.png # Logotipo abstrato gerado para testes locais
│ ├── XmlParserTests.cs # Testes do leitor e processador do XML da NFS-e
│ └── DanfseGenerationTests.cs # Testes de geração do PDF a partir dos Samples relativos
│
└── NFSe.DANFSe.v2.slnx # Arquivo de Solução Visual Studio (formato moderno)
Para adicionar o pacote ao seu projeto, execute o comando abaixo no terminal do seu projeto:
dotnet add package NFSe.DANFSe.v2Se preferir compilar manualmente a partir do código-fonte, execute:
dotnet buildA biblioteca recebe como entrada o modelo populado DanfseModel, o array de bytes da logomarca do prestador (opcional) e uma flag para forçar marca d'água de teste (opcional):
using System.IO;
using NFSe.DANFSe.v2.Models;
using NFSe.DANFSe.v2.Rendering;
// 1. Instanciar ou desserializar os dados do XML no DanfseModel
DanfseModel model = CarregarDadosDoXml("danfse-normal.xml");
// 2. Opcional: Ler logotipo customizado do prestador (se informado, substitui a logo padrão)
byte[] customLogoBytes = File.ReadAllBytes("logo-prestador.png");
// 3. Gerar o DANFSe em PDF
byte[] pdfBytes = DanfsePdfRenderer.GeneratePdf(model, customLogoBytes, forceTestWatermark: false);
// 4. Salvar ou transmitir o array de bytes do PDF
File.WriteAllBytes("DANFSe_Gerado.pdf", pdfBytes);O projeto de testes unitários lê os arquivos XML e de imagens fictícios de amostra fornecidos no diretório Tests/Samples por meio de caminhos relativos ao executável e gera os respectivos PDFs de verificação dentro do diretório Output/ (na raiz do projeto) para análise visual.
Execute o comando abaixo:
dotnet testOs seguintes cenários de DANFSe são validados:
- DANFSe Normal com todos os blocos preenchidos. 🚩
- DANFSe Normal com Logomarca Personalizada (validação uso de logomarca personalizada). 🚩
- DANFSe sem Tomador/Destinatário/Intermediário (validação das linhas mínimas de
0.40 cme textos centralizados). - DANFSe Cancelado (validação da marca d'água
CANCELADA). - DANFSe Substituído (validação da marca d'água
SUBSTITUÍDA). - DANFSe em Homologação (validação do cabeçalho em vermelho
NFS-e SEM VALIDADE JURÍDICA).
🚩 Utilizando o parâmetro forceTestWatermark: true para imprimir a palavra TESTE.
- Layout Orientado a Metadados (
DanfseLayoutRegistry): Todas as coordenadas (X, Y), dimensões (largura, altura), alinhamentos de texto e rótulos dos campos do DANFE são definidos declarativamente na classeDanfseLayoutRegistry. O renderizador consome esses metadados via função auxiliarDrawMetadataField, o que desacopla a lógica visual do posicionamento físico e facilita ajustes finos futuros. - Desenho por Coordenadas Dinâmicas: Diferente de soluções rígidas por grid estático, a classe
DanfsePdfRenderercalcula as posiçõesYdinamicamente conforme os blocos anteriores aumentam, diminuem ou são omitidos (como Tomador ou Tributação Municipal). - Parser de XML com Namespaces Dinâmicos: A leitura de tags em
DanfseXmlParser.csé realizada por meio de namespaces resolvidos dinamicamente em tempo de execução, tornando o parser altamente resiliente a variações de versão de schemas da NFS-e (v1.00, v1.01, etc.). - Corretude de Buffer no PDFsharp: Para carregar imagens a partir de streams usando o PDFsharp 6, o stream de bytes deve ser instanciado de forma pública:
Isso evita problemas de
new MemoryStream(logoBytes, 0, logoBytes.Length, false, true); // publiclyVisible = true
UnauthorizedAccessExceptionnas APIs internas do PDFsharp ao acessar buffers de imagem em nuvem ou ambiente web.
Este projeto é distribuído sob a licença BSD 3-Clause. Veja o arquivo LICENSE.txt para mais detalhes.