Geração do DANFE

2 respostas
J

Boa tarde pessoal.

Estou tentando gerar o DANFE a partir do XML.

Pesquisando na net eu consegui o seguinte código:

package br.com.progold.nfe;
import java.io.BufferedReader;  
import java.io.ByteArrayInputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.text.SimpleDateFormat;  
import java.util.HashMap;  
import java.util.Map;  
  
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
  
import net.sf.jasperreports.engine.JasperCompileManager;  
import net.sf.jasperreports.engine.JasperExportManager;  
import net.sf.jasperreports.engine.JasperFillManager;  
import net.sf.jasperreports.engine.JasperPrint;  
import net.sf.jasperreports.engine.JasperReport;  
import net.sf.jasperreports.engine.data.JRXmlDataSource;  
import net.sf.jasperreports.engine.design.JasperDesign;  
import net.sf.jasperreports.engine.xml.JRXmlLoader;  
  
import org.w3c.dom.Document;  
import org.w3c.dom.Node;  
  
public class GerandoDanfe {  
  
    public static void main(String[] args) {  
        try {  
            String fileXML = "/root/workspace/ProGold/web/ArquivosXML/enviNFe_Nota3996.xml";  
            String xml = lerXML(fileXML);  
            String logo = "";  
  
            byte[] pdf = getDanfe(xml, logo);  
              
            String nomeArquivo = "xml.pdf";  
            FileOutputStream fos = new FileOutputStream(nomeArquivo);  
            fos.write(pdf);  
            fos.close();  
        } catch (Exception e) {  
            error(e.toString());  
        }  
    }  
  
    private static String lerXML(String fileXML) throws IOException {  
        String linha = "";  
        StringBuilder xml = new StringBuilder();  
  
        BufferedReader in = new BufferedReader(new InputStreamReader(  
                new FileInputStream(fileXML)));  
        while ((linha = in.readLine()) != null) {  
            xml.append(linha);  
        }  
        in.close();  
  
        return xml.toString();  
    }  
      
    public static Document getXml(String xml) {  
        try {  
            /** 
             * Gera um objeto DOM do xml 
             */  
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
            DocumentBuilder docBuilder = dbf.newDocumentBuilder();  
            return docBuilder.parse(new ByteArrayInputStream(xml.getBytes()));  
        } catch (Exception e) {  
            error("Erro ao formatar a string em xml.");  
            return null;  
        }  
    }  
      
    public static Map<String, Object> getFaturas(Document doc) {  
        Map<String, Object> map = new HashMap<String, Object>();  
  
        for (int i = 0; i < doc.getElementsByTagName("dup").getLength(); i++) {  
            /** 
             * Seta uma duplicata 
             */  
            Node dup = doc.getElementsByTagName("dup").item(i);  
  
            /** 
             * Seta o numero 
             */  
            Node nDoc = dup.getChildNodes().item(0);  
            String numero = nDoc.getFirstChild().getNodeValue();  
            map.put("FAT_NUMERO" + (i + 1), numero);  
      
            /** 
             * Seta a data 
             */  
            Node nData = dup.getChildNodes().item(1);  
            String data = nData.getFirstChild().getNodeValue();  
      
            try {  
                map.put("FAT_VENCIMENTO" + (i + 1), new SimpleDateFormat("yyyy-MM-dd").parse(data));  
            } catch (Exception e) {  
                map.put("FAT_VENCIMENTO" + (i + 1), null);  
      
            }  
      
            /** 
             * Seta o valor 
             */  
            Node nValor = dup.getChildNodes().item(2);  
            String valor = nValor.getFirstChild().getNodeValue();  
            map.put("FAT_VALOR" + (i + 1), Double.parseDouble(valor));  
        }  
        return map;  
    }  
      
    public static byte[] getDanfe(String xml, String logo) {  
        byte[] pdf = null;  
        try {  
            /** 
             * Documento XML. 
             */  
            Document doc = getXml(xml);  
  
            String tipoImp = doc.getElementsByTagName("tpImp").item(0).getFirstChild().getNodeValue();  
            /** 
             * Local do relatorio jrxml 
             */  
            String urlDanfe = tipoImp.equals("1") ? "/root/retrato.jrxml" : "/root/retrato.jrxml";  
            JasperDesign jasperDesign = JRXmlLoader.load(urlDanfe);    
            JasperReport jasper = JasperCompileManager.compileReport(jasperDesign);  
  
            /** 
             * Fonte de Dados. 
             */  
            JRXmlDataSource ds = new JRXmlDataSource(doc, "/nfeProc/NFe/infNFe/det");  
      
            /** 
             * Parametros 
             */  
            Map<String, Object> param = getFaturas(doc);  
            param.put("Logo", logo);  
  
            /** 
             * Gerando o relatorio 
             */  
            JasperPrint print = JasperFillManager.fillReport(jasper, param, ds);  
  
            /** 
             * Exportando em pdf 
             */  
            pdf = JasperExportManager.exportReportToPdf(print);  
        } catch (Exception e) {  
            error(e.toString());  
            pdf = null;  
        }  
        return pdf;  
    }  
  
  
    /** 
     * Log ERROR. 
     * @param error 
     */  
    private static void error(String error) {  
        System.out.println("| ERROR: " + error);  
    }  
  
    /** 
     * Log INFO. 
     * @param info 
     */  
    private static void info(String info) {  
        System.out.println("| INFO: " + info);  
    }  
      
}

Na hora de testar o PDF foi gerado, mas quando eu tento abrir aparece que não foi possível abrir o PDF.

Alguém já teve problemas do tipo, ou tem idéia do que pode ser???

Grato

2 Respostas

J

jocabaldini,
eu tambem apanhei bastante ate fazer um danfe
via xml…
resolvi fazer de maneira diferente…
eu criei o jasper com os dados
da nota como parametros
e os itens como um list…

criei uma classe que recebia como parametro o xml da nota
pegava os dados da nota e jogava no map como parametros
e criei um list com os itens

JRBeanCollectionDataSource source =
new JRBeanCollectionDataSource(list);

onde o list tinha todos os campos para os itens
da nota

foi a maneira mais simples que encontrei para
desenvolver o danfe

J

jonas, teria como vc postar o código feito para que eu possa testar?

obrigado desde já.

Criado 7 de dezembro de 2012
Ultima resposta 10 de dez. de 2012
Respostas 2
Participantes 2