Gerando o PDF (DANFS-e) via linha de comando (Integração com outras linguagens)
É possível solicitar a geração do PDF via linha de comando, permitindo a geração do PDF em outras linguagens como PHP, Python, Node.JS…
Pré-requisitos
- Servidor Windows ou Linux;
- Java versão 1.8 a 21;
- Espaço em disco: 50 MB;
- Licença de uso (para produção apenas).
Preparando o ambiente
- Crie um novo diretório (EX: “C:\nfse-tools\” ou “/opt/nfse-tools/”), chamada daqui pra frente de ‘nfse-tools‘;
- Extraia o conteúdo do ZIP da NFS-e Nacional, e copie todos os arquivos da pastas \WEB-INF\lib para a pasta ‘nfse-tools‘;
- Extraia o conteúdo da API core (l2s-core.jar) e copie todos os arquivos da pastas \WEB-INF\lib para a pasta ‘nfse-tools‘;
- Copie o arquivo de licença (se já tiver) para a pasta ‘nfse-tools‘;
- Crie um BAT (Windows) ou SH (Linux) na pasta ‘nfse-tools‘ com o conteúdo apresentado no final deste texto;
Testando a geração via linha de comando
- Salve o XML da NFS-e em disco;
- Defina o nome do PDF temporário a ser gerado;
- E execute a linha de comando para .SH (Windows) ou .BAT (Linux):
- Linux:
/opt/nfse-tools/danfse.sh ‘/tmp/nota1.xml’ ‘/tmp/nota1.pdf’ - Windows:
c:\nfse-tools\danfse.bat “C:\temp\nota1.xml” “C:\temp\nota1.pdf”
- Linux:
- Observe se o arquivo PDF foi gerado, e o utilize em caso de sucesso.
danfse.sh (Linux)
!/bin/bash
cd "$(dirname "$0")"
java -Dorg.jcp.xml.dsig.secureValidation=false -cp commons-logging-1.1.1.jar:commons-digester-2.1.jar:commons-collections-3.2.2.jar:commons-beanutils-1.7.0.jar:itext-4.2.1.jar:barcode4j.jar:xmldsig.jar:zxing-core-1.7.jar:zxing-core-3.5.3.jar:bcprov-jdk15on-155.jar:xmlsec-1.5.2.jar:l2s-core.jar:l2s-icp.jar:l2s-nfse-nacional.jar:jasperreports-5.0.0.jar:. br.com.l2software.api.nfsenacional.Main DANFSE $1 $2
danfse.bat (Windows)
@echo off
cd /d "%~dp0"
java -Dorg.jcp.xml.dsig.secureValidation=false -cp commons-logging-1.1.1.jar;commons-digester-2.1.jar;commons-collections-3.2.2.jar;commons-beanutils-1.7.0.jar;itext-4.2.1.jar;barcode4j.jar;xmldsig.jar;zxing-core-1.7.jar;zxing-core-3.5.3.jar;bcprov-jdk15on-155.jar;xmlsec-1.5.2.jar;l2s-core.jar;l2s-icp.jar;l2s-nfse-nacional.jar;jasperreports-5.0.0.jar;. br.com.l2software.api.nfsenacional.Main DANFSE %1 %2
Código para outras linguagens
Após criar o ambiente, basta executar o código na sua linguagem de programação (DICA: Utiliza alguma IA para traduzir para sua linguagem de programação).
Código PHP
$script = '/opt/nfse-tools/danfse.sh';
$pdfOutput = tempnam(sys_get_temp_dir(), 'nfse') . '.pdf';
$xmlOutput = tempnam(sys_get_temp_dir(), 'nfse') . '.xml';
file_put_contents($xmlOutput, $nfseXml);
$command = "$script " . escapeshellarg($xmlOutput) . ' ' . escapeshellarg($pdfOutput);
// Execute command
$output = shell_exec($command);
if(!file_exists($pdfOutput)) {
die("Falha ao tentar gerar o PDF da NFS-e: '{$nfseXml}'.");
}
print "PDF gerado: $pdfOutput ";
Código Node.JS
const script = '/opt/nfse-tools/danfse.sh';
const xmlOutput = createTempFileWithExtension('.xml');
const pdfOutput = createTempFileWithExtension('.pdf');
// Escreve o XML no arquivo temporário
await fs.writeFile(xmlOutput, nfseXml, 'utf8');
// Escapa os argumentos para shell
const escapedXmlOutput = `"${xmlOutput}"`;
const escapedPdfOutput = `"${pdfOutput}"`;
const command = `${script} ${escapedXmlOutput} ${escapedPdfOutput}`;
// Executa o comando
const { stdout, stderr } = await execPromise(command);
if (stderr) {
console.error(`Erro: ${stderr}`);
}
// Verifica se o PDF foi gerado
try {
await fs.access(pdfOutput);
console.log(`PDF gerado: ${pdfOutput}`);
return pdfOutput;
} catch (err) {
throw new Error(`Falha ao tentar gerar o PDF da NFS-e: '${nfseXml}'.`);
}
Dicas e solução de problemas
- Permissões: Confira se o usuário que executa o código (PHP/Node/Python…) tem PERMISSÃO de leitura do XML, e leitura/escrita da pasta onde será gerado o PDF.
- Instalação do Java: Confirme se o Java está instalado no servidor;
- Versão do Java: Confirme se o Java padrão do usuário está definido para um versão compatível. Se necessário utilize o caminho absoluto do Java.