nfse-br/danfse

Gerador de DANFSe Nacional (NFS-e padrão SPED) a partir de XML validado via XSD oficial

Maintainers

Package info

github.com/fabianosfbr/danfse-generator-php

pkg:composer/nfse-br/danfse

Statistics

Installs: 9

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.2 2026-02-04 14:55 UTC

This package is not auto-updated.

Last update: 2026-04-02 14:14:20 UTC


README

Biblioteca PHP para gerar DANFSe Nacional (PDF) a partir de um XML de NFS-e Nacional (SPED), com:

  • validação contra o XSD oficial;
  • parsing com namespace SPED;
  • renderização do PDF com TCPDF.

Requisitos

  • PHP 8.1+
  • Extensões: dom, libxml

Instalação

1) Via Packagist (recomendado)

composer require nfse-br/danfse

Depois:

composer update

Orientação de uso

  • Danfse::gerar(string $xml): string retorna o binário do PDF (o usuário decide se escreve em disco ou faz stream/download).
  • Danfse::gerarParaArquivo(string $xml, string $outputPdf): void escreve o PDF em disco.
  • Danfse::gerarDeArquivo(string $xmlPath, string $outputPdf): void conveniência (lê o XML do arquivo e escreve o PDF).

Configuração

Por padrão, a biblioteca já inclui o XSD em resources/xsd/ e valida o XML automaticamente.

Se você precisar apontar para outro XSD (ex.: outra versão), use o validador diretamente:

use NfseDanfse\Validator\NfseXsdValidator;

$validator = new NfseXsdValidator('/caminho/para/NFSe_v1.00.xsd');
$validator->validateXml($xmlString);

Uso (em outro projeto)

Gerar PDF binário (string) a partir do XML (string)

<?php
require __DIR__ . '/vendor/autoload.php';

use NfseDanfse\Danfse;

$xml = file_get_contents(__DIR__ . '/nfse.xml');
$pdfBinary = (new Danfse())->gerar($xml);

file_put_contents(__DIR__ . '/danfse.pdf', $pdfBinary);

Parsing e renderização separadas (uso avançado)

Útil quando você quer inspecionar/alterar os dados antes do PDF:

use NfseDanfse\Parser\DanfseXmlParser;
use NfseDanfse\Pdf\DanfsePdfRenderer;
use NfseDanfse\Validator\NfseXsdValidator;

$xml = file_get_contents(__DIR__ . '/nfse.xml');

(new NfseXsdValidator())->validateXml($xml);

$data = DanfseXmlParser::fromXmlString($xml)->parse();

$pdfBinary = (new DanfsePdfRenderer())->renderToString($data);

Uso com Laravel

Instalação

No seu projeto Laravel:

composer require nfse-br/danfse

Controller retornando download sem escrever em disco

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use NfseDanfse\Danfse;

class DanfseController extends Controller {
    public function gerar(Request $request) {
        $request->validate([
            'xml' => ['required', 'file', 'mimes:xml,txt'],
        ]);

        $xml = file_get_contents($request->file('xml')->getRealPath());
        $pdfBinary = (new Danfse())->gerar($xml);

        return response($pdfBinary, 200, [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'attachment; filename=\"danfse.pdf\"',
        ]);
    }
}

Controller (alternativa) gravando em disco e baixando

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use NfseDanfse\Danfse;

class DanfseController extends Controller {
    public function gerar(Request $request) {
        $request->validate([
            'xml' => ['required', 'file', 'mimes:xml,txt'],
        ]);

        $xml = file_get_contents($request->file('xml')->getRealPath());

        $outputDir = storage_path('app/danfse');
        if (!is_dir($outputDir)) {
            mkdir($outputDir, 0777, true);
        }

        $outputPdf = $outputDir . '/danfse-' . now()->format('YmdHis') . '.pdf';
        (new Danfse())->gerarParaArquivo($xml, $outputPdf);

        return response()->download($outputPdf)->deleteFileAfterSend(true);
    }
}

Artisan Command (XML em arquivo → PDF em storage/app)

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use NfseDanfse\Danfse;

class GerarDanfse extends Command {
    protected $signature = 'danfse:gerar {xml : Caminho do XML} {--out= : Caminho do PDF de saída}';
    protected $description = 'Gera DANFSe (PDF) a partir de um XML de NFS-e Nacional';

    public function handle(): int {
        $xmlPath = $this->argument('xml');
        $outputPdf = $this->option('out') ?: storage_path('app/danfse.pdf');

        (new Danfse())->gerarDeArquivo($xmlPath, $outputPdf);

        $this->info('PDF gerado em: ' . $outputPdf);
        return self::SUCCESS;
    }
}

Exemplo pronto

Este repositório inclui um exemplo completo utilizando o XML de amostra:

php examples/gerar-danfse.php

Testes

composer test

Licença

MIT