{"id":50929041,"url":"https://github.com/fabyo/nfedanfe","last_synced_at":"2026-07-02T13:00:51.214Z","repository":{"id":365169817,"uuid":"1270833815","full_name":"fabyo/NFEDanfe","owner":"fabyo","description":"Gerador de DANFE para NF-e em C# usando QuestPDF.","archived":false,"fork":false,"pushed_at":"2026-06-24T23:38:32.000Z","size":2499,"stargazers_count":3,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T01:08:52.024Z","etag":null,"topics":["danfe","dotnet","landscape","nf-e","nfe","portrait","questpdf","xml"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fabyo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-16T05:07:11.000Z","updated_at":"2026-06-24T23:38:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fabyo/NFEDanfe","commit_stats":null,"previous_names":["fabyo/nfedanfe"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/fabyo/NFEDanfe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabyo%2FNFEDanfe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabyo%2FNFEDanfe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabyo%2FNFEDanfe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabyo%2FNFEDanfe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fabyo","download_url":"https://codeload.github.com/fabyo/NFEDanfe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabyo%2FNFEDanfe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35048062,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["danfe","dotnet","landscape","nf-e","nfe","portrait","questpdf","xml"],"created_at":"2026-06-17T02:04:02.543Z","updated_at":"2026-07-02T13:00:51.208Z","avatar_url":"https://github.com/fabyo.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Logo](https://raw.githubusercontent.com/fabyo/NFEDanfe/main/logo-200.png)\n\n[![NuGet](https://img.shields.io/nuget/v/NFEDanfe.svg)](https://www.nuget.org/packages/NFEDanfe)\n[![Downloads](https://img.shields.io/nuget/dt/NFEDanfe.svg)](https://www.nuget.org/packages/NFEDanfe)\n[![Build](https://github.com/fabyo/NFEDanfe/actions/workflows/ci.yml/badge.svg)](https://github.com/fabyo/NFEDanfe/actions/workflows/ci.yml)\n[![Publish](https://github.com/fabyo/NFEDanfe/actions/workflows/publish.yml/badge.svg)](https://github.com/fabyo/NFEDanfe/actions/workflows/publish.yml)\n[![Scorecard](https://github.com/fabyo/NFEDanfe/actions/workflows/scorecard.yml/badge.svg)](https://github.com/fabyo/NFEDanfe/actions/workflows/scorecard.yml)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13399/badge)](https://www.bestpractices.dev/projects/13399)\n[![GitHub stars](https://img.shields.io/github/stars/fabyo/NFEDanfe)](https://github.com/fabyo/NFEDanfe)\n[![License](https://img.shields.io/github/license/fabyo/NFEDanfe)](https://github.com/fabyo/NFEDanfe)\n\nBiblioteca .NET para gerar DANFE em PDF a partir de XML de NF-e autorizada.\n\nO projeto tem dois formatos de uso:\n\n- `NFEDanfe`: biblioteca para integração em sistemas .NET, APIs, workers e ERPs.\n- `NFEDanfe.Cli`: ferramenta de linha de comando para uso operacional e scripts.\n\n## Motivos da Troca do QuestPDF\n\nPara 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](MOTIVOS_TROCA_QUESTPDF.md).\n\n## Recursos\n\n- Compatível com .NET 8 e .NET 10 (multi-targeting).\n- Geração de DANFE em PDF 100% nativa, rápida e vetorial baseada em PDFsharp (livre de licenças comerciais restritivas).\n- DANFE em modo retrato e paisagem.\n- Seleção automática pelo campo `tpImp` do XML NF-e.\n- Override manual de orientação via `DanfeOptions.TipoImpressaoOverride`.\n- Parser seguro de XML NF-e com DTD proibido.\n- Validação de consistência de totais de produtos, descontos e valor da nota.\n- Paginação real de itens do DANFE com cabeçalhos de continuação automáticos.\n- Simulação de negrito inteligente (overstrike) que garante formatação perfeita mesmo em ambientes restritos a fontes regulares.\n- API pública simples com `DanfeGenerator` e `DanfeOptions` compatível com a API de referência.\n- Snapshot textual para regressão funcional.\n\n## Instalação Como Biblioteca\n\nQuando publicado no NuGet:\n\n```powershell\ndotnet add package NFEDanfe\n```\n\nUso básico:\n\n```csharp\nusing NFEDanfe;\n\nawait using FileStream output = File.Create(\"danfe.pdf\");\nDanfeGenerator.GenerateFromXml(\"nota-procNFe.xml\", output);\n```\n\nCom logo:\n\n```csharp\nusing NFEDanfe;\n\nbyte[] logo = await File.ReadAllBytesAsync(\"logo.png\");\n\nDanfeOptions options = new()\n{\n    LogoBytes = logo\n};\n\nawait using FileStream output = File.Create(\"danfe.pdf\");\nDanfeGenerator.GenerateFromXml(\"nota-procNFe.xml\", output, options);\n```\n\nForçar modo paisagem:\n\n```csharp\nusing NFEDanfe;\n\nDanfeOptions options = new()\n{\n    TipoImpressaoOverride = 2 // 1 = retrato, 2 = paisagem\n};\n\nawait using FileStream output = File.Create(\"danfe-paisagem.pdf\");\nDanfeGenerator.GenerateFromXml(\"nota-procNFe.xml\", output, options);\n```\n\nForçar modo retrato:\n\n```csharp\nusing NFEDanfe;\n\nDanfeOptions options = new()\n{\n    TipoImpressaoOverride = 1 // 1 = retrato, 2 = paisagem\n};\n\nawait using FileStream output = File.Create(\"danfe-retrato.pdf\");\nDanfeGenerator.GenerateFromXml(\"nota-procNFe.xml\", output, options);\n```\n\nCarregar modelo e gerar snapshot textual:\n\n```csharp\nusing NFEDanfe;\n\nvar model = DanfeGenerator.LoadFromXml(\"nota-procNFe.xml\");\nstring snapshot = DanfeSnapshot.CreateText(model);\n```\n\nGerar a partir de conteúdo XML em memória (String / Banco de Dados):\n\nSe 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:\n\n```csharp\nusing NFEDanfe;\n\nstring xmlContent = ObterXmlDoBancoDeDados(nfeId);\n\nawait using FileStream output = File.Create(\"danfe.pdf\");\nDanfeGenerator.GenerateFromXmlContent(xmlContent, output);\n```\n\n\n## Referência da API\n\n### Classe `DanfeGenerator` (Estática)\nResponsável por carregar o modelo de dados e gerar o arquivo PDF.\n\n| Método | Descrição |\n| --- | --- |\n| `GenerateFromXml(string xmlPath, Stream output, DanfeOptions? options = null)` | Gera o DANFE em PDF a partir do caminho de um arquivo XML. |\n| `GenerateFromXml(Stream xmlStream, Stream output, DanfeOptions? options = null)` | Gera o DANFE em PDF a partir de um Stream contendo o XML. |\n| `GenerateFromXmlContent(string xmlContent, Stream output, DanfeOptions? options = null)` | Gera o DANFE em PDF a partir de uma string contendo o conteúdo XML cru. |\n| `LoadFromXml(string xmlPath, DanfeOptions? options = null)` | Carrega e valida o modelo `DanfeModel` a partir do caminho de um arquivo XML. |\n| `LoadFromXml(Stream xmlStream, DanfeOptions? options = null)` | Carrega e valida o modelo `DanfeModel` a partir de um Stream contendo o XML. |\n| `LoadFromXmlContent(string xmlContent, DanfeOptions? options = null)` | Carrega e valida o modelo `DanfeModel` a partir de uma string contendo o conteúdo XML cru. |\n| `Generate(DanfeModel model, Stream output, DanfeOptions? options = null)` | Gera o DANFE em PDF a partir de um objeto `DanfeModel` previamente carregado. |\n\n### Classe `DanfeOptions`\nConfigurações opcionais para a geração do documento.\n\n| Propriedade | Tipo | Descrição | Valor Padrão |\n| --- | --- | --- | --- |\n| `LogoBytes` | `byte[]?` | Vetor de bytes contendo o logotipo da empresa emitente (PNG ou JPEG). | `null` |\n| `ValidateBeforeGenerate` | `bool` | Se `true`, valida as regras de negócio e integridade da nota antes de gerar. | `true` |\n| `EmitFooter` | `bool` | Se `true`, exibe a informação de rodapé \"NFEDanfe - impresso em...\". | `true` |\n| `TipoImpressaoOverride` | `int?` | Sobrescreve a orientação definida no XML (`1` = Retrato, `2` = Paisagem). Se `null`, respeita o XML. | `null` |\n| `Font` | `DanfeFont` | Enum para escolher a fonte (`Arial`, `Inter`, `Roboto`, `IbmPlexSans`). As fontes alternativas selecionam automaticamente seus arquivos Regular e Bold. | `DanfeFont.Arial` |\n| `CustomFontName` | `string?` | Sobrescreve o enum para utilizar o nome de qualquer fonte do sistema ou registrada sob demanda. | `null` |\n| `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` |\n\n### Customização de Fonte e Recomendações\n\nVocê pode escolher a fonte tipográfica utilizada para a renderização do DANFE passando a configuração via `DanfeOptions`:\n\n```csharp\nvar options = new DanfeOptions\n{\n    Font = DanfeFont.Inter // Opções: Arial, Inter, Roboto, IbmPlexSans\n};\n```\n\nCaso queira usar uma fonte específica instalada no sistema operacional, use a propriedade `CustomFontName`:\n\n```csharp\nvar options = new DanfeOptions\n{\n    CustomFontName = \"Liberation Sans\"\n};\n```\n\n\u003e [!WARNING]\n\u003e **Recomendação Legal (MOC/SEFAZ)**:\n\u003e 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).\n\u003e\n\u003e 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`.\n\n\n\n## Instalação Como CLI\n\nDurante desenvolvimento:\n\n```powershell\ndotnet run --project .\\NFEDanfe.Cli\\NFEDanfe.Cli.csproj -- .\\samples\\nota-exemplo-procNFe.xml\n```\n\nComo ferramenta local a partir do pacote gerado:\n\n```powershell\ndotnet pack .\\NFEDanfe.Cli\\NFEDanfe.Cli.csproj -c Release\ndotnet tool install --global --add-source .\\NFEDanfe.Cli\\bin\\Release NFEDanfe.Cli\n```\n\nDepois de instalada:\n\n```powershell\nnfedanfe .\\samples\\nota-exemplo-procNFe.xml --output .\\out\n```\n\nGerar com fonte específica (Arial, Inter, Roboto, IbmPlexSans ou fonte do sistema):\n\n```powershell\nnfedanfe .\\samples\\nota-exemplo-procNFe.xml --font inter --output .\\out\n```\n\nGerar com logo por caminho explícito:\n\n```powershell\nnfedanfe .\\nota-procNFe.xml --logo-path .\\minha-logo.png --output .\\out\n```\n\nGerar com busca automática por `logo.png`:\n\n```powershell\nnfedanfe .\\nota-procNFe.xml --logo\n```\n\nGerar snapshot textual junto com o PDF:\n\n```powershell\nnfedanfe .\\nota-procNFe.xml --snapshot\n```\n\nGerar DANFE mock de demonstração:\n\n```powershell\nnfedanfe --mock\n```\n\n## Logo Na CLI\n\nA opção recomendada é `--logo-path`, porque é explícita:\n\n```powershell\nnfedanfe .\\nota-procNFe.xml --logo-path .\\assets\\logo.png\n```\n\nA opção `--logo` também existe e procura automaticamente um arquivo chamado `logo.png`.\n\nLocais verificados pela CLI:\n\n- Diretório onde o comando foi executado.\n- Diretório do binário da ferramenta.\n- Diretórios pais desses caminhos, subindo alguns níveis.\n\nSe o arquivo não for encontrado, o DANFE é gerado sem logo.\n\n## Linux e Docker\n\nO projeto é compatível com Linux porque usa .NET, QuestPDF e Barcoder sem `System.Drawing`.\n\nExemplo Linux:\n\n```bash\ndotnet run --project ./NFEDanfe.Cli/NFEDanfe.Cli.csproj -- ./samples/nota-exemplo-procNFe.xml --output ./out\n```\n\nExemplo de publicação:\n\n```bash\ndotnet publish ./NFEDanfe.Cli/NFEDanfe.Cli.csproj -c Release -o ./publish\ndotnet ./publish/NFEDanfe.Cli.dll ./samples/nota-exemplo-procNFe.xml --output ./out\n```\n\n## Samples\n\nA pasta `samples/` contém XML público sanitizado para demonstração.\n\nA pasta `xml_testes/` é ignorada pelo Git e deve ser usada apenas para XMLs fiscais reais locais.\n\n## Empacotar\n\nGerar pacote NuGet da biblioteca:\n\n```powershell\ndotnet pack .\\NFEDanfe\\NFEDanfe.csproj -c Release\n```\n\nGerar pacote da CLI como `dotnet tool`:\n\n```powershell\ndotnet pack .\\NFEDanfe.Cli\\NFEDanfe.Cli.csproj -c Release\n```\n\n## Estrutura\n\n- `NFEDanfe`: biblioteca reutilizável.\n- `NFEDanfe.Cli`: CLI e exemplo real de consumo.\n- `samples`: exemplos públicos sanitizados.\n- `Barcode`: gerador de códigos de barras (Code 128 / QR Code).\n- `Blocks`: blocos visuais de desenho em baixo nível (canhoto, emitente, destinatário, etc.).\n- `Builder`: construtor fluente do layout do DANFE.\n- `Domain/Parser`: parser XML seguro.\n- `Layout`: orquestração gráfica do documento.\n- `Options`: opções de configuração do documento.\n- `Pagination`: paginação de grade de itens e divisão em múltiplas folhas.\n\n- [Histórico de alterações](CHANGELOG.md)\n\n## 🔗 Projetos relacionados\n\n| Projeto | Descrição |\n|---|---|\n| [NFeSchemaDownloader](https://github.com/fabyo/NFeSchemaDownloader) | Mantém os Schemas XML (XSD) da SEFAZ sempre atualizados automaticamente |\n| [NFEEmissor](https://github.com/fabyo/NFEEmissor) | Gera, assina e autoriza NF-e em homologação ou produção, com API stateless, CLI e pacotes NuGet |\n| [NFEConsulta](https://github.com/fabyo/NFEConsulta) | Consulta NF-e, valida XML e verifica status oficial da SEFAZ |\n\n### Ferramentas CLI\n\n- **NFEConsulta.Cli** → Consulta NF-e pela linha de comando.\n- **NFeSchemaDownloader.Cli** → Automação de download de Schemas.\n\n### Fluxo recomendado\n\n```text\nNFeSchemaDownloader (Mantém XSDs atualizados)\n   │\n   ▼\nNFEEmissor (Gera, assina e autoriza a NF-e)\n   │\n   ▼\nNF-e XML autorizado\n   │\n   ▼\nNFEConsulta (Valida XML via XSD e consulta SEFAZ)\n   │\n   ▼\nNFEDanfe (Gera o PDF final)\n```\n\n## 👨‍💻 Autor\n\nFabyo Guimarães Oliveira\n\n- LinkedIn: [https://www.linkedin.com/in/fabyo-guimaraes/](https://www.linkedin.com/in/fabyo-guimaraes/)\n- GitHub: https://github.com/fabyo\n\n## Licença\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabyo%2Fnfedanfe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabyo%2Fnfedanfe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabyo%2Fnfedanfe/lists"}