Direction.NFSe.Danfe
0.2.5
dotnet add package Direction.NFSe.Danfe --version 0.2.5
NuGet\Install-Package Direction.NFSe.Danfe -Version 0.2.5
<PackageReference Include="Direction.NFSe.Danfe" Version="0.2.5" />
<PackageVersion Include="Direction.NFSe.Danfe" Version="0.2.5" />
<PackageReference Include="Direction.NFSe.Danfe" />
paket add Direction.NFSe.Danfe --version 0.2.5
#r "nuget: Direction.NFSe.Danfe, 0.2.5"
#:package Direction.NFSe.Danfe@0.2.5
#addin nuget:?package=Direction.NFSe.Danfe&version=0.2.5
#tool nuget:?package=Direction.NFSe.Danfe&version=0.2.5
Direction.NFSe.Danfe
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.
Principais recursos
- ✅ 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
Instalação
Via NuGet:
dotnet add package Direction.NFSe.Danfe
Uso básico (API recomendada)
Gerando a DANFSe a partir do XML
using 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);
Gerando a DANFSe CANCELADA a partir do XML
- 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);
Para inserir logos do seu município
- 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.br
Acessando HTML e warnings
Console.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
Overloads disponíveis
A partir de NFSeSchema
DanfeResult result = danfe.Generate(
nfseSchema,
DanfeEnvironment.Production
);
A partir de Stream
using var stream = File.OpenRead("nfse.xml");
DanfeResult result = danfe.Generate(
stream,
DanfeEnvironment.RestrictedProduction
);
Ambientes
Em vez de bool isProd, a biblioteca utiliza:
DanfeEnvironment.Production
DanfeEnvironment.Restricted
Isso melhora legibilidade, evita erros e facilita evolução futura.
Customização de layout
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
Observabilidade e warnings
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
Testes e regressão de layout
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 test
Desenvolvimento
Build
dotnet restore
dotnet build -c Release
Testes
dotnet test -c Release
Formatação
dotnet format
npm run format
Contribuindo
Contribuiçõ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.
Licença
MIT. Veja LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- NReco.PdfGenerator (>= 1.2.1)
- QRCoder (>= 1.7.0)
-
.NETStandard 2.0
- NReco.PdfGenerator (>= 1.2.1)
- QRCoder (>= 1.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 0.2.5 | 102 | 2/4/2026 | |
| 0.2.4 | 100 | 1/28/2026 | |
| 0.2.3 | 96 | 1/26/2026 | |
| 0.2.2 | 104 | 1/15/2026 | |
| 0.2.1 | 160 | 1/13/2026 | |
| 0.2.0 | 96 | 1/12/2026 | |
| 0.1.9 | 97 | 1/12/2026 | |
| 0.1.8 | 93 | 1/12/2026 | |
| 0.1.7 | 93 | 1/12/2026 | |
| 0.1.6 | 105 | 1/8/2026 | |
| 0.1.5 | 102 | 1/8/2026 | |
| 0.1.4 | 102 | 1/7/2026 | |
| 0.1.3 | 289 | 12/16/2025 | |
| 0.1.2 | 464 | 12/16/2025 | |
| 0.1.1 | 460 | 12/16/2025 | |
| 0.1.0 | 458 | 12/16/2025 |