Biblioteca .NET para gerar DANFSe (PDF) a partir do XML da NFSe Nacional (DPS/NFSe), sem depender de endpoint externo, permitindo alto volume, baixa latência e customização completa de layout.
Status: operacional em produção nos cenários do autor.
A biblioteca é open source e contribuições são fortemente incentivadas para ampliar compatibilidade com variações reais de XML e regras municipais.
- ✅ Geração de HTML e PDF da DANFSe localmente
- ✅ Sem chamadas externas (ideal para alto volume)
- ✅ Layout HTML totalmente customizável
- ✅ Observabilidade: warnings padronizados para campos ausentes/fallbacks
- ✅ Testes de regressão de layout (golden tests)
- ✅ Compatível com .NET Standard / .NET Framework / .NET moderno
Via NuGet:
dotnet add package Direction.NFSe.Danfeusing Direction.NFSe.Danfe;
var xml = File.ReadAllText("nfse.xml");
var danfe = new DanfeService(new DanfeOptions
{
// Opcional: diretório base para templates e dados
// BasePath = AppContext.BaseDirectory,
// Opcional: template customizado
// TemplatePath = @"C:\meu-layout\Danfe.html"
});
DanfeResult result = danfe.Generate(
xml,
DanfeEnvironment.Production
);
File.WriteAllBytes("danfse.pdf", result.PdfBytes);- Como no XML não vem uma informação se a NFSe está cancelada, você é que tem que informar via parâmetro como no exemplo abaixo:
using Direction.NFSe.Danfe;
var xml = File.ReadAllText("nfse.xml");
var danfe = new DanfeService();
DanfeResult result = danfe.Generate(
xml,
DanfeEnvironment.Production,
true // Informa que é uma NFSe CANCELADA
);
File.WriteAllBytes("danfse.pdf", result.PdfBytes);- O repositório não tem a logo de todos os municípios. Você pode criar a do seu município obedecendo o padrão de 400x400 pixels e colocando na pasta "Assets\Logos".
- Você deve ainda modificar o arquivo municipios.csv, localizando seu município e complementando as informações de logo_path e logo_name, como no exemplo abaixo para Recife:
2611606,Recife,-8.04666,-34.8771,1,26,2531,81,America/Sao_Paulo,Assets\Logos\logoRecife.png,Prefeitura do Recife<br>Secretaria de Finanças<br>faleconosco@recife.pe.gov.brConsole.WriteLine(result.Html);
foreach (var warning in result.Warnings)
{
Console.WriteLine($"{warning.Code}: {warning.Message} ({warning.Path})");
}Exemplo de warning retornado:
NFSE_FIELD_MISSING: Campo vLiq ausente; usando '-' (infNFSe.valores.vLiq)
Esses warnings facilitam:
- diagnóstico de problemas no XML
- abertura de issues
- contribuição da comunidade
DanfeResult result = danfe.Generate(
nfseSchema,
DanfeEnvironment.Production
);using var stream = File.OpenRead("nfse.xml");
DanfeResult result = danfe.Generate(
stream,
DanfeEnvironment.RestrictedProduction
);Em vez de bool isProd, a biblioteca utiliza:
DanfeEnvironment.Production
DanfeEnvironment.RestrictedIsso melhora legibilidade, evita erros e facilita evolução futura.
O template HTML padrão está em:
src/Danfe/Assets/Templates/Danfe.html
Você pode:
- editar o template padrão (fork)
- fornecer um template próprio via
DanfeOptions.TemplatePath - propor melhorias via PR mantendo compatibilidade de placeholders
A biblioteca gera warnings sempre que:
- um campo relevante do XML estiver ausente
- ocorrer fallback (
"-",0,00,string.Empty) - um município não for encontrado
- um placeholder não for resolvido no template
Códigos de warning padronizados:
NFSE_FIELD_MISSINGMUNICIPIO_NOT_FOUNDTEMPLATE_PLACEHOLDER_EMPTY
O projeto utiliza golden tests para evitar regressões visuais:
- snapshot do HTML normalizado
- validação básica do PDF (sanity check)
Para rodar os testes:
dotnet testdotnet restore
dotnet build -c Releasedotnet test -c Releasedotnet format
npm run formatContribuições são muito bem-vindas, especialmente para:
- novos layouts municipais
- variações reais de XML
- validações adicionais
- melhorias de desempenho
- testes adicionais
Veja CONTRIBUTING.md.
MIT. Veja LICENSE.