Skip to content

fabyo/NFEDanfe

Repository files navigation

Logo

CI CodeQL OpenSSF Scorecard OpenSSF Best Practices Dependabot NuGet Downloads License .NET GitHub Stars

Biblioteca .NET para gerar DANFE em PDF a partir de XML de NF-e autorizada.

O projeto tem dois formatos de uso:

  • NFEDanfe: biblioteca para integração em sistemas .NET, APIs, workers e ERPs.
  • NFEDanfe.Cli: ferramenta de linha de comando para uso operacional e scripts.

Motivos da Troca do QuestPDF

Para entender as motivações de arquitetura e licenciamento que levaram à substituição do QuestPDF pelo PDFsharp nesta nova versão, acesse a página detalhada dos Motivos da Troca do QuestPDF para o PDFsharp.

Recursos

  • Compatível com .NET 8 e .NET 10 (multi-targeting).
  • Geração de DANFE em PDF 100% nativa, rápida e vetorial baseada em PDFsharp (livre de licenças comerciais restritivas).
  • DANFE em modo retrato e paisagem.
  • Seleção automática pelo campo tpImp do XML NF-e.
  • Override manual de orientação via DanfeOptions.TipoImpressaoOverride.
  • Parser seguro de XML NF-e com DTD proibido.
  • Validação de consistência de totais de produtos, descontos e valor da nota.
  • Paginação real de itens do DANFE com cabeçalhos de continuação automáticos.
  • Simulação de negrito inteligente (overstrike) que garante formatação perfeita mesmo em ambientes restritos a fontes regulares.
  • API pública simples com DanfeGenerator e DanfeOptions compatível com a API de referência.
  • Snapshot textual para regressão funcional.

Instalação Como Biblioteca

Quando publicado no NuGet:

dotnet add package NFEDanfe

Uso básico:

using NFEDanfe;

await using FileStream output = File.Create("danfe.pdf");
DanfeGenerator.GenerateFromXml("nota-procNFe.xml", output);

Com logo:

using NFEDanfe;

byte[] logo = await File.ReadAllBytesAsync("logo.png");

DanfeOptions options = new()
{
    LogoBytes = logo
};

await using FileStream output = File.Create("danfe.pdf");
DanfeGenerator.GenerateFromXml("nota-procNFe.xml", output, options);

Forçar modo paisagem:

using NFEDanfe;

DanfeOptions options = new()
{
    TipoImpressaoOverride = 2 // 1 = retrato, 2 = paisagem
};

await using FileStream output = File.Create("danfe-paisagem.pdf");
DanfeGenerator.GenerateFromXml("nota-procNFe.xml", output, options);

Forçar modo retrato:

using NFEDanfe;

DanfeOptions options = new()
{
    TipoImpressaoOverride = 1 // 1 = retrato, 2 = paisagem
};

await using FileStream output = File.Create("danfe-retrato.pdf");
DanfeGenerator.GenerateFromXml("nota-procNFe.xml", output, options);

Carregar modelo e gerar snapshot textual:

using NFEDanfe;

var model = DanfeGenerator.LoadFromXml("nota-procNFe.xml");
string snapshot = DanfeSnapshot.CreateText(model);

Gerar a partir de conteúdo XML em memória (String / Banco de Dados):

Se você possui o conteúdo XML salvo no banco de dados como uma string, você pode gerá-lo diretamente em memória sem precisar criar um arquivo físico:

using NFEDanfe;

string xmlContent = ObterXmlDoBancoDeDados(nfeId);

await using FileStream output = File.Create("danfe.pdf");
DanfeGenerator.GenerateFromXmlContent(xmlContent, output);

Referência da API

Classe DanfeGenerator (Estática)

Responsável por carregar o modelo de dados e gerar o arquivo PDF.

Método Descrição
GenerateFromXml(string xmlPath, Stream output, DanfeOptions? options = null) Gera o DANFE em PDF a partir do caminho de um arquivo XML.
GenerateFromXml(Stream xmlStream, Stream output, DanfeOptions? options = null) Gera o DANFE em PDF a partir de um Stream contendo o XML.
GenerateFromXmlContent(string xmlContent, Stream output, DanfeOptions? options = null) Gera o DANFE em PDF a partir de uma string contendo o conteúdo XML cru.
LoadFromXml(string xmlPath, DanfeOptions? options = null) Carrega e valida o modelo DanfeModel a partir do caminho de um arquivo XML.
LoadFromXml(Stream xmlStream, DanfeOptions? options = null) Carrega e valida o modelo DanfeModel a partir de um Stream contendo o XML.
LoadFromXmlContent(string xmlContent, DanfeOptions? options = null) Carrega e valida o modelo DanfeModel a partir de uma string contendo o conteúdo XML cru.
Generate(DanfeModel model, Stream output, DanfeOptions? options = null) Gera o DANFE em PDF a partir de um objeto DanfeModel previamente carregado.

Classe DanfeOptions

Configurações opcionais para a geração do documento.

Propriedade Tipo Descrição Valor Padrão
LogoBytes byte[]? Vetor de bytes contendo o logotipo da empresa emitente (PNG ou JPEG). null
ValidateBeforeGenerate bool Se true, valida as regras de negócio e integridade da nota antes de gerar. true
EmitFooter bool Se true, exibe a informação de rodapé "NFEDanfe - impresso em...". true
TipoImpressaoOverride int? Sobrescreve a orientação definida no XML (1 = Retrato, 2 = Paisagem). Se null, respeita o XML. null
Font DanfeFont Enum para escolher a fonte (Arial, Inter, Roboto, IbmPlexSans). As fontes alternativas selecionam automaticamente seus arquivos Regular e Bold. DanfeFont.Arial
CustomFontName string? Sobrescreve o enum para utilizar o nome de qualquer fonte do sistema ou registrada sob demanda. null
CustomXmlEncoding System.Text.Encoding? Força a leitura do XML com um Encoding específico (ex: Encoding.UTF8), ignorando o cabeçalho original. Apenas para métodos que recebem Stream ou path. null

Customização de Fonte e Recomendações

Você pode escolher a fonte tipográfica utilizada para a renderização do DANFE passando a configuração via DanfeOptions:

var options = new DanfeOptions
{
    Font = DanfeFont.Inter // Opções: Arial, Inter, Roboto, IbmPlexSans
};

Caso queira usar uma fonte específica instalada no sistema operacional, use a propriedade CustomFontName:

var options = new DanfeOptions
{
    CustomFontName = "Liberation Sans"
};

Warning

Recomendação Legal (MOC/SEFAZ): O Manual de Orientação do Contribuinte (MOC) da Nota Fiscal Eletrônica (NF-e) estabelece que a fonte padrão recomendada para a impressão do DANFE é a Arial (ou Courier/Times New Roman em caso de impressão de caracteres).

A fonte padrão é Arial, quando instalada no sistema. Em ambientes sem Arial, o projeto usa Roboto como fallback multiplataforma. Inter, Roboto e IBM Plex Sans somente são selecionadas explicitamente por Font ou FontConfig.

Instalação Como CLI

Durante desenvolvimento:

dotnet run --project .\NFEDanfe.Cli\NFEDanfe.Cli.csproj -- .\samples\nota-exemplo-procNFe.xml

Como ferramenta local a partir do pacote gerado:

dotnet pack .\NFEDanfe.Cli\NFEDanfe.Cli.csproj -c Release
dotnet tool install --global --add-source .\NFEDanfe.Cli\bin\Release NFEDanfe.Cli

Depois de instalada:

nfedanfe .\samples\nota-exemplo-procNFe.xml --output .\out

Gerar com fonte específica (Arial, Inter, Roboto, IbmPlexSans ou fonte do sistema):

nfedanfe .\samples\nota-exemplo-procNFe.xml --font inter --output .\out

Gerar com logo por caminho explícito:

nfedanfe .\nota-procNFe.xml --logo-path .\minha-logo.png --output .\out

Gerar com busca automática por logo.png:

nfedanfe .\nota-procNFe.xml --logo

Gerar snapshot textual junto com o PDF:

nfedanfe .\nota-procNFe.xml --snapshot

Gerar DANFE mock de demonstração:

nfedanfe --mock

Logo Na CLI

A opção recomendada é --logo-path, porque é explícita:

nfedanfe .\nota-procNFe.xml --logo-path .\assets\logo.png

A opção --logo também existe e procura automaticamente um arquivo chamado logo.png.

Locais verificados pela CLI:

  • Diretório onde o comando foi executado.
  • Diretório do binário da ferramenta.
  • Diretórios pais desses caminhos, subindo alguns níveis.

Se o arquivo não for encontrado, o DANFE é gerado sem logo.

Linux e Docker

O projeto é compatível com Linux porque usa .NET, QuestPDF e Barcoder sem System.Drawing.

Exemplo Linux:

dotnet run --project ./NFEDanfe.Cli/NFEDanfe.Cli.csproj -- ./samples/nota-exemplo-procNFe.xml --output ./out

Exemplo de publicação:

dotnet publish ./NFEDanfe.Cli/NFEDanfe.Cli.csproj -c Release -o ./publish
dotnet ./publish/NFEDanfe.Cli.dll ./samples/nota-exemplo-procNFe.xml --output ./out

Samples

A pasta samples/ contém XML público sanitizado para demonstração.

A pasta xml_testes/ é ignorada pelo Git e deve ser usada apenas para XMLs fiscais reais locais.

Empacotar

Gerar pacote NuGet da biblioteca:

dotnet pack .\NFEDanfe\NFEDanfe.csproj -c Release

Gerar pacote da CLI como dotnet tool:

dotnet pack .\NFEDanfe.Cli\NFEDanfe.Cli.csproj -c Release

Estrutura

  • NFEDanfe: biblioteca reutilizável.

  • NFEDanfe.Cli: CLI e exemplo real de consumo.

  • samples: exemplos públicos sanitizados.

  • Barcode: gerador de códigos de barras (Code 128 / QR Code).

  • Blocks: blocos visuais de desenho em baixo nível (canhoto, emitente, destinatário, etc.).

  • Builder: construtor fluente do layout do DANFE.

  • Domain/Parser: parser XML seguro.

  • Layout: orquestração gráfica do documento.

  • Options: opções de configuração do documento.

  • Pagination: paginação de grade de itens e divisão em múltiplas folhas.

  • Histórico de alterações

🔗 Projetos relacionados

Projeto Descrição
NFeSchemaDownloader Mantém os Schemas XML (XSD) da SEFAZ sempre atualizados automaticamente
NFEEmissor Gera, assina e autoriza NF-e em homologação ou produção, com API stateless, CLI e pacotes NuGet
NFEConsulta Consulta NF-e, valida XML e verifica status oficial da SEFAZ

Ferramentas CLI

  • NFEConsulta.Cli → Consulta NF-e pela linha de comando.
  • NFeSchemaDownloader.Cli → Automação de download de Schemas.

Fluxo recomendado

NFeSchemaDownloader (Mantém XSDs atualizados)
   │
   ▼
NFEEmissor (Gera, assina e autoriza a NF-e)
   │
   ▼
NF-e XML autorizado
   │
   ▼
NFEConsulta (Valida XML via XSD e consulta SEFAZ)
   │
   ▼
NFEDanfe (Gera o PDF final)

👨‍💻 Autor

Fabyo Guimarães Oliveira

Licença

MIT.

About

Biblioteca moderna, rápida, flexível e de alto desempenho para geração de DANFE de NF-e em C#.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

 
 
 

Contributors