wmixvideo / nfe

Nota Fiscal Eletrônica em Java.
Apache License 2.0
648 stars 377 forks source link

Gerar Danfe a partir do Xml da nota #121

Closed fincatto closed 6 years ago

fincatto commented 8 years ago

Dado um XML, gerar um Danfe padronizado.

klutzer commented 8 years ago

Eu tenho um jrxml (Jasper/iReport) da DANFe, que modifiquei de um outro projeto, porém não está atualizado, mas pode ser útil pelo menos para não começar o layout do zero.. Interessa?

clarelspies commented 8 years ago

Será que o ideal não seria gerar uma página em html/css com elemento page para gerar a impressão?

klutzer commented 8 years ago

Vocês que sabem, mas acredito que um PDF seria tranquilo e teria boa parte do layout pronto.. é uma ideia..

fincatto commented 8 years ago

Ajuda sim Érico, muito obrigado! Quanto ao layout html, podemos fazer "exportadores" distintos em que o usuário solicita o tipo que ele deseja, mas, por hora, precisamos do PDF.

On Fri, Apr 15, 2016 at 2:29 PM, Érico Knapp Lutzer < notifications@github.com> wrote:

Vocês que sabem, mas acredito que um PDF seria tranquilo e teria boa parte do layout pronto.. é uma ideia..

— You are receiving this because you authored the thread. Reply to this email directly or view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-210555865

klutzer commented 8 years ago

danfe.pdf

Este é o PDF que ele gera no outro projeto (descontinuado)

klutzer commented 8 years ago

122

waldandrade commented 8 years ago

Bom dia Pessoal ... a biblioteca já está gerando DANFE?

fincatto commented 8 years ago

Ainda não conseguimos algum desenvolvedor pra fazer a feature. Se tiver interesse, seria ótimo! []s

On Tue, May 3, 2016 at 11:27 AM, waldandrade notifications@github.com wrote:

Bom dia Pessoal ... a biblioteca já está gerando DANFE?

— You are receiving this because you authored the thread. Reply to this email directly or view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-216545946

waldandrade commented 8 years ago

hummm rapaz ... eu tenho mais que interesse, tenho necessidade ... kkkkkk

Preciso apenas de instruções de como trabalhar com o repositório de vocês. Não creio que seja só sair dando commit kkkkkk

waldandrade commented 8 years ago

Existe alguma coisa contra apenas integrar a biblioteca a outra biblioteca já existente?

waldandrade commented 8 years ago

Encontrei esse link do JAVAC.

http://www.javac.com.br/jc/posts/list/1790-jrxml-danfe-nfe-v310-resolvido.page

tsinterative commented 8 years ago

Olá pessoal, vou colaborar com o projeto, eu tenho um ERP que gera a NFe com o DANFE atualizado da versão 3.10, meu sistema era em java mas toda a lógica de emissão da NFe estava em uma dll compilada no Delphi 7, lá eu usava o componente da ACBr pra gerar a nota. O sistema funciona, mas eu perco a vantagem da multiplataforma. O meu DANFE tem uma label que traz os dados do meu sistema, então alteram pra incluir a personalização de vocês, ele funciona baseado no conteúdo do xml.

Vou deixar aqui minha classe do emissor de NFe pra servir de referencia no uso do DANFE, qualquer dúvida me procurem, assim que possível vou testar o projeto no meu sistema e submeto algumas coisas pra colaborar.

`package system.core.nfe;

import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map;

import javafx.application.Platform; import javafx.concurrent.Task; import javafx.scene.Cursor;

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail.EmailAttachment; import org.apache.commons.mail.HtmlEmail; import org.controlsfx.dialog.Dialog.Actions; import org.w3c.dom.Document;

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.view.JasperViewer;

import br.inf.portalfiscal.nfe.schema.consstatserv.TRetConsStatServ; import system.core.SystemController; import application.controller.MainController; import application.entities.DoctoFiscal; import application.helpers.Configurations; import application.model.DoctoFiscalDAO; import application.model.ServidorModel;

public class EmissorNFe extends SystemController{

private String pathNFe;

static{
    Runtime.getRuntime().load(new File("resources/EmissorNFe.dll").getAbsolutePath());
}

private native boolean PreparaAmbiente(Object[] configs);
private native TRetConsStatServ StatusWebService();
private native boolean GerarNFe(int iNrDoctoFiscal);
private native boolean CancelarNFe(int iNrDoctoFiscal);

private boolean setConfig(){

    ServidorModel server = Configurations.getDefaultServer();

    Object[] params = {
            server.getHostname(),                              // IP 
            server.getDatabase(),                              // Instancia
            toString(MainController.loggedEnterprise.getId()), // Empresa Ativa
    };

    return PreparaAmbiente(params);

}

public void assinaXML(){

}

public TRetConsStatServ ConsultaStatusServico(){

    TRetConsStatServ status = new TRetConsStatServ();

    //Inicializa/ Verifica configurações
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (isConfigured)
        status = StatusWebService();

    //devolve o resultado
    return status;
}

public boolean geraNFe(DoctoFiscal doctoFiscal) throws Exception{

    /*-- prepara o ambiente para geração da NFe --*/
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (!isConfigured)
        return false;

    mensagemUsuario("Gerando NFe...");

    return GerarNFe(doctoFiscal.getId());

}

public boolean cancelaNFe(DoctoFiscal doctoFiscal) throws Exception{

    /*-- prepara o ambiente para geração da NFe --*/
    boolean isConfigured = setConfig();

    //Executa a consulta do Status;
    if (!isConfigured)
        return false;

    mensagemUsuario("Cancelando NFe...");

    return CancelarNFe(doctoFiscal.getId());

}

public void geraPDF(final DoctoFiscal doctoFiscal) throws Exception{

    mensagemUsuario("Gerando PDF...");

    Task<Object> task = new Task<Object>(){

        @Override
        protected Object call() throws Exception {

            //Muda o cursor
            MainController.primaryStage.getScene().setCursor(Cursor.WAIT);

            //Executa tarefa
            String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();

            pathNFe = pathNFe + "/EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) + "/PDF/";

            OutputStream out = new FileOutputStream(pathNFe + doctoFiscal.getChaveNFe() + ".pdf");

            JasperPrint relatorio = geraDanfe(doctoFiscal);
            JasperExportManager.exportReportToPdfStream(relatorio, out); 

            //Depois que a Thread encerrar executa ações na interface
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {

                        mensagemUsuario("");
                        sendNFeMail(doctoFiscal);

                    } catch (Exception e) {

                            new Throwable(e);
                    }
                }
            });

            //Retorna para o cursor default
            MainController.primaryStage.getScene().setCursor(Cursor.DEFAULT);

            return null;
        }

    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();     

}

private JasperPrint geraDanfe(DoctoFiscal doctoFiscal) throws Exception{

    InputStream imgInputStream = null;

    byte[] bLogo = MainController.loggedEnterprise.getLogo();

    if (bLogo != null){
        imgInputStream = new ByteArrayInputStream(bLogo);           
    }

    Document doc = getXml(doctoFiscal.getxMLNFe());

    Map<String, Object> param = getFaturas(doc); 
    param.put("Logo", imgInputStream);

    JasperPrint danfe = null;

    try{
        JRXmlDataSource ds = new JRXmlDataSource(doc,  
                    "/nfeProc/NFe/infNFe/det");  

        JasperReport report = JasperCompileManager
                    .compileReport(getClass().getResourceAsStream("/application/view/danfeR.jrxml"));

        danfe = JasperFillManager.fillReport(report, param, ds);
    }catch(Exception e){
        throw e;
    }

    return danfe;
}

public void imprimeDanfe(DoctoFiscal doctoFiscal) throws Exception{

    if (!doctoFiscal.getxMLNFe().isEmpty()){

        previewDanfe(doctoFiscal);

        if (doctoFiscal.getDataImpressao() == null){

            doctoFiscal.setDataImpressao(new Date());
            doctoFiscal.setUsuarioImpr(MainController.loggedUser);

            new DoctoFiscalDAO().save(doctoFiscal);
        }
    }

}

private 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) {    
        mensagemErro("Erro ao formatar a string em xml.");    
        return null;    
    }    
} 

private 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  
         */    
        org.w3c.dom.Node dup = doc.getElementsByTagName("dup").item(i);    

        /**  
         * Seta o numero  
         */    
        org.w3c.dom.Node nDoc = dup.getChildNodes().item(0);    
        String numero = nDoc.getFirstChild().getNodeValue();    
        map.put("FAT_NUMERO" + (i + 1), numero);  

        /**  
         * Seta a data  
         */    
        org.w3c.dom.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  
         */    
        org.w3c.dom.Node nValor = dup.getChildNodes().item(2);    
        String valor = nValor.getFirstChild().getNodeValue();    
        map.put("FAT_VALOR" + (i + 1), Double.parseDouble(valor));    
    }   

    return map;    
}    

private void previewDanfe(final DoctoFiscal doctoFiscal) {  

    mensagemUsuario("Gerando preview...");

    Task<Object> task = new Task<Object>(){

        @Override
        protected Object call() throws Exception {

            //Muda o cursor
            MainController.primaryStage.getScene().setCursor(Cursor.WAIT);

            //Executa tarefa

            try{

                JasperPrint relat = geraDanfe(doctoFiscal);
                JasperViewer.viewReport(relat, false);

            } catch (Exception e){
                exceptionMessage(e.getCause());
            }
            //Depois que a Thread encerrar executa ações na interface
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {

                        mensagemUsuario("");

                    } catch (Exception e) {

                            new Throwable(e);
                    }
                }
            });

            //Retorna para o cursor default
            MainController.primaryStage.getScene().setCursor(Cursor.DEFAULT);

            return null;
        }

    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();     

}  

public void sendNFeMail(DoctoFiscal doctoFiscal) throws Exception {

    if (!doctoFiscal.getTerceiro().isEnviaNfeEmail()){
        mensagemInfo("O terceiro não está configurado para receber a NFe por email.");
        return;
    }

    if (mensagemConfirmacao("Gostaria de enviar a NFe por email?") != Actions.YES)
        return;

    HtmlEmail email = new HtmlEmail();
    email.setHostName(MainController.configAmbiente.getServidorSMTP());
    email.setSmtpPort(MainController.configAmbiente.getPortaSMTP());
    email.setAuthenticator(new DefaultAuthenticator(MainController.configAmbiente.getEmail(), MainController.configAmbiente.getSenhaEmail()));
    email.setStartTLSRequired(MainController.configAmbiente.isUsaSSL());
    email.setStartTLSEnabled(MainController.configAmbiente.isUsaSSL());
    email.setFrom(MainController.configAmbiente.getEmail(), MainController.loggedEnterprise.getDescricao());
    email.setSubject("Entrega da NFe nº " + doctoFiscal.getNumeroDocto());

    String emails = "";

    email.addTo(doctoFiscal.getTerceiro().getEmailPrincipal(), doctoFiscal.getTerceiro().getRazaoSocial());
    emails += doctoFiscal.getTerceiro().getEmailPrincipal();

    if (doctoFiscal.getTerceiro().getEmailCopia() != null){
        if (!doctoFiscal.getTerceiro().getEmailCopia().trim().equals("")){
            email.addCc(doctoFiscal.getTerceiro().getEmailCopia(), doctoFiscal.getTerceiro().getRazaoSocial());
            emails += ", " + doctoFiscal.getTerceiro().getEmailCopia();
        }
    }

    //Mensagem no formato HTML
    String msgHtml = "<html>";
    msgHtml       += "    <head>";
    msgHtml       += "    </head>";
    msgHtml       += "    <body>";
    msgHtml       += "        <p>" + doctoFiscal.getTerceiro().getRazaoSocial() + "</p>";
    msgHtml       += "        <p>Entrega da NFe nº " + doctoFiscal.getNumeroDocto() + " com a chave " + doctoFiscal.getChaveNFe() + ".</p>" ;
    msgHtml       += "        <p>Veja o XML em anexo, ou fa&ccedil;a a consulta de autenticidade no portal nacional da NF-e <www.nfe.fazenda.gov.br/portal> ou no site da Sefaz.</p></br>";
    msgHtml       += "        <p><http://www.tsinterative.com.br></p>";
    msgHtml       += "        <p>Conhe&ccedil;a o Sistema de Gest&atilde;o Empresarial que integra sua empresa e seus parceiros de neg&oacute;cios com simplicidade.</p>";
    msgHtml       += "        <p>O BlueWind Enterprise <http://www.tsinterative.com.br> &eacute; um sistema f&aacute;cil de usar que atende totalmente as necessidades das empresas com baixo custo.</p>";
    msgHtml       += "        <p>Ligue para a TS Interative e tenha maiores informa&ccedil;&otilde;es (11) 4052-9002/ (11) 95287-1588 ou acesse o site da TS Interative.</p>";
    msgHtml       += "    </body>";
    msgHtml       += "</html>";

    email.setHtmlMsg(msgHtml);

    String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();
    pathNFe = pathNFe + "EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) ;

    EmailAttachment attachment = new EmailAttachment();

    //XML
    String CaminhoXML = pathNFe + "/Envio e Resposta/" + doctoFiscal.getArquivoXML();

    File xml = new File(CaminhoXML); 

    if (!xml.exists()){
        mensagemAlerta(CaminhoXML + " parace ser um caminho inválido, a mensagem não pode ser enviada.");
        return;
    }

    attachment = new EmailAttachment();
    attachment.setPath(CaminhoXML);
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    email.attach(attachment);

    //PDF
    String CaminhoPDF = pathNFe + "/PDF/" + doctoFiscal.getChaveNFe() + ".pdf";

    File pdf = new File(CaminhoPDF); 

    if (!pdf.exists()){

        if (mensagemConfirmacao(CaminhoPDF + " parace ser um caminho inválido, Deseja enviar apenas o XML. Confirma ?") != Actions.YES)
            return;

    }else{
        attachment = new EmailAttachment();
        attachment.setPath(CaminhoPDF);
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        email.attach(attachment);
    }

    email.send();

    mensagemInfo("Email enviado com sucesso para " + emails);

}

public void sendNFeCancMail(DoctoFiscal doctoFiscal) throws Exception {

    if (!doctoFiscal.getTerceiro().isEnviaNfeEmail()){
        mensagemInfo("O terceiro não está configurado para receber a NFe por email.");
        return;
    }

    if (mensagemConfirmacao("Desejar enviar o protocolo de cancelmanto da NFe por e-mail?") != Actions.YES)
        return;

    HtmlEmail email = new HtmlEmail();
    email.setHostName(MainController.configAmbiente.getServidorSMTP());
    email.setSmtpPort(MainController.configAmbiente.getPortaSMTP());
    email.setAuthenticator(new DefaultAuthenticator(MainController.configAmbiente.getEmail(), MainController.configAmbiente.getSenhaEmail()));
    email.setStartTLSRequired(MainController.configAmbiente.isUsaSSL());
    email.setStartTLSEnabled(MainController.configAmbiente.isUsaSSL());
    email.setFrom(MainController.configAmbiente.getEmail(), MainController.loggedEnterprise.getDescricao());
    email.setSubject("Protocolo de Cancelamento da NFe nº " + doctoFiscal.getNumeroDocto());

    String emails = "";

    email.addTo(doctoFiscal.getTerceiro().getEmailPrincipal(), doctoFiscal.getTerceiro().getRazaoSocial());
    emails += doctoFiscal.getTerceiro().getEmailPrincipal();

    if (doctoFiscal.getTerceiro().getEmailCopia() != null){
        if (!doctoFiscal.getTerceiro().getEmailCopia().trim().equals("")){
            email.addCc(doctoFiscal.getTerceiro().getEmailCopia(), doctoFiscal.getTerceiro().getRazaoSocial());
            emails += ", " + doctoFiscal.getTerceiro().getEmailCopia();
        }
    }

    //Mensagem no formato HTML
    String msgHtml = "<html>";
    msgHtml       += "    <head>";
    msgHtml       += "    </head>";
    msgHtml       += "    <body>";
    msgHtml       += "        <p>" + doctoFiscal.getTerceiro().getRazaoSocial() + "</p>";
    msgHtml       += "        <p>Protocolo de Cancelamento da NFe nº " + doctoFiscal.getNumeroDocto() + " com a chave " + doctoFiscal.getChaveNFe() + ".</p>" ;
    msgHtml       += "        <p>Veja o XML em anexo, ou fa&ccedil;a a consulta de autenticidade no portal nacional da NF-e <www.nfe.fazenda.gov.br/portal> ou no site da Sefaz.</p></br>";
    msgHtml       += "        <p><http://www.tsinterative.com.br></p>";
    msgHtml       += "        <p>Conhe&ccedil;a o Sistema de Gest&atilde;o Empresarial que integra sua empresa e seus parceiros de neg&oacute;cios com simplicidade.</p>";
    msgHtml       += "        <p>O BlueWind Enterprise <http://www.tsinterative.com.br> &eacute; um sistema f&aacute;cil de usar que atende totalmente as necessidades das empresas com baixo custo.</p>";
    msgHtml       += "        <p>Ligue para a TS Interative e tenha maiores informa&ccedil;&otilde;es (11) 4052-9002/ (11) 95287-1588 ou acesse o site da TS Interative.</p>";
    msgHtml       += "    </body>";
    msgHtml       += "</html>";

    email.setHtmlMsg(msgHtml);

    String pathNFe = (MainController.configAmbiente.getTipoAmbienteNFe() == 0) ? MainController.configAmbiente.getPathNFeHom() : MainController.configAmbiente.getPathNFeProd();
    pathNFe = pathNFe + "EMP" + zeroEsquerda(MainController.loggedEnterprise.getId(),3) ;

    EmailAttachment attachment = new EmailAttachment();

    //XML
    String CaminhoXML = pathNFe + "/NFeCan/" + doctoFiscal.getChaveNFe() + "-can.xml";

    File xml = new File(CaminhoXML); 

    if (!xml.exists()){
        mensagemAlerta(CaminhoXML + " parace ser um caminho inválido, a mensagem não pode ser enviada.");
        return;
    }

    attachment = new EmailAttachment();
    attachment.setPath(CaminhoXML);
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    email.attach(attachment);

    //PDF
    String CaminhoPDF = pathNFe + "/PDF/" + doctoFiscal.getChaveNFe() + ".pdf";

    File pdf = new File(CaminhoPDF); 

    if (!pdf.exists()){

        if (mensagemConfirmacao(CaminhoPDF + " parace ser um caminho inválido, Deseja enviar apenas o XML. Confirma ?") != Actions.YES)
            return;

    }else{
        attachment = new EmailAttachment();
        attachment.setPath(CaminhoPDF);
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        email.attach(attachment);
    }

    email.send();

    mensagemInfo("Email enviado com sucesso para " + emails);

}

} `

danfeR.jrxml.zip

felipewmartins commented 8 years ago

Olá pessoal, Essa issue foi finalizada?

fincatto commented 8 years ago

Ainda não.

On Tue, May 17, 2016 at 9:48 PM, Felipe Martins notifications@github.com wrote:

Olá pessoal, Essa issue foi finalizada?

— You are receiving this because you authored the thread. Reply to this email directly or view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-219896090

felipewmartins commented 8 years ago

:+1: Eu gostaria de trabalhar nela @fincatto :)

fincatto commented 8 years ago

Ótimo @felipewmartins, fique a vontade! Nossa política de código é ter o menor acoplamento possível e usar o mínimo de dependências externas possíveis também.Também gostamos de ter uma boa cobertura de testes. Se precisar de ajuda ou tiver alguma dúvida, estamos a disposição. Att, Diego

felipewmartins commented 8 years ago

Bacana @fincatto ! Eu pensei em montar um layout padrão a partir da documentação da receita, utilizando o Ireport. O que você acha dessa abordagem?

fincatto commented 8 years ago

Parece interessante! Tenho pouca experiência com PDF, então o @flppsilva está encarregado deste. Nossa única preocupação é adicionar o mínimo de dependência possível e testes. Mas acho que o caminho é esse mesmo!

klutzer commented 8 years ago

Lembrando que já existe um modelo da DANF-e no pacote de resources do projeto (criado com iReport). Talvez daria pra partir dele..

Abraço!

felipewmartins commented 8 years ago

Sim @klutzer estou aproveitando ele :smile: Abraço!

felipewmartins commented 8 years ago

Pessoal, Não estou conseguindo colocar a fonte Courier New na geração do pdf do danfe. Pelo que li na documentação ela é o padrão a ser utilizado. Alguém tem alguma dica sobre como carregar essa fonte diretamente na compilação do jasper?

flppsilva commented 8 years ago

A fonte não aparece no teu editor? Ou quando tu executa ele troca pra outra? Talvez pra essa fonte tenhas que adicionar mais essa dependência: http://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-fonts/6.0.0

felipewmartins commented 8 years ago

@flppsilva Ela aparece sim. O problema é no momento em que o danfe é exportado para PDF. Eu até havia inserido essa dependência, mas notei que ela só contem fontes DejaVu.

flppsilva commented 8 years ago

Então deve ser teu sistema operacional que não contém a fonte. Se for linux tens que instalar o pacote de fontes da microsoft.

felipewmartins commented 8 years ago

Vou fazer o teste no windows, para ver se o problema é esse mesmo.

tsinterative commented 8 years ago

@felipewmartins pra fonte ser utilizada na compilação precisa incluir ela dentro do jar do jasperreports-fonts

gyowanny commented 8 years ago

Existe também a opção de adicionar as fontes em "$JAVA_HOME/jre/lib/fonts", conforme documentação do JasperReports.

fincatto commented 8 years ago

Ter que colocar uma fonte em lugar especifico torna pouco prático o uso. Há alguma outra alternativa? Alguma outra biblioteca para gerar esse pdf, talvez?

On Mon, May 30, 2016 at 9:52 AM, Gyowanny Pessatto Queiroz < notifications@github.com> wrote:

Existe também a opção de adicionar as fontes em "$JAVA_HOME/jre/lib/fonts", conforme documentação do JasperReports.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-222486198, or mute the thread https://github.com/notifications/unsubscribe/AADj8LYzPkStkO4PB-qyVrUxYxulafBdks5qGt1wgaJpZM4IHxbz .

felipewmartins commented 8 years ago

Pois é @fincatto estive procurando alternativas. Vi algo sobre o DynamicReports, mas não achei ele muito prático para montar um report.

gyowanny commented 8 years ago

Neste blog, que é mais antigo mas talvez lhe dê umas dicas: http://javaskeleton.blogspot.com.br/2010/12/embedding-fonts-into-pdf-generated-by.html Basicamente é um arquivo properties.

felipewmartins commented 8 years ago

@gyowanny Bacana! Vou testar esse procedimento! Valeu.

waldandrade commented 8 years ago

To acompanhando o caso, mas não acho que entendi direito o problema .... Uso jasper desde 2010 e nunca tive esse tipo de impedimento, seguindo as documentações.

2016-05-30 10:27 GMT-03:00 Gyowanny Pessatto Queiroz < notifications@github.com>:

Neste blog, que é mais antigo mas talvez lhe dê umas dicas: http://javaskeleton.blogspot.com.br/2010/12/embedding-fonts-into-pdf-generated-by.html Basicamente é um arquivo properties.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-222492679, or mute the thread https://github.com/notifications/unsubscribe/ALSmmRPs2eUjIgaIOOnug_4l57_XYiXgks5qGuXWgaJpZM4IHxbz .

Waldney Souza de Andrade compengi engenharia & sistemas waldney.andrade@gmail.com waldney.andrade@gmail.com

+55(84)8894-3405 +55(84)9447-7354

jefperito commented 8 years ago

São para casos aonde a fonte o Jasper não possui creio eu, tem que instalar de maneira externa.

higomatos commented 8 years ago

Olá,

O Manual orienta:

7.7 Padrões de Caracteres (Tipos de Fontes) Todos os caracteres deverão estar impressos na fonte Times New Roman ou na fonte Courier New. A impressão dos dados variáveis feitas por Impressoras de Impacto (Matricial e de Linha) deverá estar entre 10 e 17 CPP (Caracteres por Polegada).

Ou seja, pode ser Courier ou Times, mas gostaria de levantar algumas questões:

1 - Que licenças estas fontes tem? Podem ser utilizadas livremente dentro deste projeto sem legalmente oferecer riscos?

2 - A renderização da fonte é realmente um problema deste projeto?

Em relação ao item 2 eu acredito que poderíamos apenas informar ao usuário que adotamos Courier New (como está sendo feito) mas que o servidor da aplicação deverá fornecer a fonte. Assim abstraímos este "problema" que no meu ponto de vista não deveria ser tratado no âmbito desta library.

Aqui onde trabalho quando precisamos de fontes específicas para o jasper nós empacotamos todas num JAR (bem fácil e efetuado na própria IDE do Jasper) e colocamos este JAR nas dependências do projeto para que não tenha um acoplamento direto as fontes instaladas no servidor.

2016-05-30 14:08 GMT-03:00 Jeferson Viana Perito notifications@github.com:

São para casos aonde a fonte o Jasper não possui creio eu, tem que instalar de maneira externa.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-222529149, or mute the thread https://github.com/notifications/unsubscribe/AG74HdJpSK7WJi9llvjRLjDpbzrVrmTwks5qGxmhgaJpZM4IHxbz .

Higo Soares Matos +55 86 99934-3237 - TIM +55 86 98882-3796 - OI

klutzer commented 8 years ago

Seria interessante se conseguirmos definir esta geração da DANF-e utilizando as bibliotecas do Jasper (iReport), pois o mesmo caso vai ocorrer pra DANF-e NFC-e que vamos ter que implementar também, e com os dois modelos criados, a forma de gerar o PDF, ou até mesmo abrir um JFrame (em caso de aplicação desktop), seria exatamente a mesmo para ambos os casos..

Como estou mais envolvido com as implementações pertinentes à NFC-e, é provável que nos próximos dias eu já esteja fabricando o layout e a geração da DANF-e NFC-e aqui no projeto também.

felipewmartins commented 8 years ago

O Layout do danfe está bacana. Só estou tendo problemas mesmo é com a geração do PDF.

higomatos commented 8 years ago

@felipewmartins esta atividade está sendo executada em qual branch? Como podemos testar e contribuir? O que já foi feito?

felipewmartins commented 8 years ago

Bom dia @higomatos Estou trabalhando em um branch no meu fork. Já montei o layout do danfe e estou vendo uma solução para aquele problema da geração do pdf. O @fincatto pode criar um branch no repositório principal e eu submeter um PR para esse branch, para que você possa contribuir também.

fincatto commented 8 years ago

Bom dia amigos. Segue branch solicitado: https://github.com/wmixvideo/nfe/tree/danfe Att, Diego

2016-06-02 8:33 GMT-03:00 Felipe Martins notifications@github.com:

Bom dia @higomatos https://github.com/higomatos Estou trabalhando em um branch no meu fork. Já montei o layout do danfe e estou vendo uma solução para aquele problema da geração do pdf. O @fincatto https://github.com/fincatto pode criar um branch no repositório principal e eu submeter um PR para esse branch, para que você possa contribuir também.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-223266195, or mute the thread https://github.com/notifications/unsubscribe/AADj8LGa15wlvfJDlfZbtMegPyiCu60aks5qHr-egaJpZM4IHxbz .

felipewmartins commented 8 years ago

@fincatto Você consegue ir fazendo testes na funcionalidade? Ou quem esteja utilizando a lib em algum projeto. Vai ajudar bastante pra ajustes e melhorias.

Abraço.

fincatto commented 8 years ago

Podemos iniciar alguns testes sim, mas antes precisamos que as exceções não sejam "engolidas" pela lib (NFDanfeReport.java). Outra coisa interessante é garantir que os recursos abertos sejam fechados, usando try-with-resources (NFGeraDanfeTest.java). Isso vai facilitar os testes pois saberemos o que realmente ocorre. Att, Diego

2016-06-13 11:16 GMT-03:00 Felipe Martins notifications@github.com:

@fincatto https://github.com/fincatto Você consegue ir fazendo testes na funcionalidade? Ou quem esteja utilizando a lib em algum projeto. Vai ajudar bastante pra ajustes e melhorias.

Abraço.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wmixvideo/nfe/issues/121#issuecomment-225593987, or mute the thread https://github.com/notifications/unsubscribe/AADj8LYoUq1c2dbUQ-Ch-MpW76XpWUxpks5qLWY_gaJpZM4IHxbz .

felipewmartins commented 8 years ago

Verdade @fincatto Farei os ajutes necessários!

clarelspies commented 8 years ago

Olá galera, em que parte desta tarefa vocês estão? E como posso contribuir para a conclusão dela?

felipewmartins commented 8 years ago

Opa @clarel Ela já está gerando um modelo de danfe, mas que pode ser melhorado com ajuste de layout. Acredito que seria bacana implementar outro modelos de danfe existentes na legislação.

klutzer commented 8 years ago

Estou concluindo a DANFe NFCe, porém aguardo a implementação de vocês para adequar a NFDanfeReport gerando também DANFe do modelo 65

Obs.: Utilizei ZXing para gerar o QRCode

felipewmartins commented 8 years ago

Estou readequando o layout, para tratar de acordo com o Bean da NF. Seguindo orientações do @klutzer . Breve estarei liberando o layout.

fincatto commented 8 years ago

Pessoal, o branche Danfe está quebrando, pelo uso de uma fonte não disponível para todos os SOs. Alguém está verificando isso? Está ficando meio feio la na home.

rafaelTartigrado commented 8 years ago

Pessoal, como está o andamento deste trabalho?

klutzer commented 8 years ago

@felipewmartins você chegou a mudar o relatório para pegar os dados dos objetos (JRBeanCollectionDataSource) ao invés do XML?

Caso não tenha evoluído, vou começar a lidar nisso agora, criando um subrelatório separado para os itens e ajustando a classe NFDanfeReport pra ficar ok com ambos os modelos

higomatos commented 8 years ago

@klutzer observei que vc fez um commit "Fonte da DANF-e NF-e alterada para SansSerif (mesma da NFC-e)" porém acredito que está em desacordo com o Manual de Orientação do Contribuinte versão 6.0.0 que informa o seguinte:

7.7 Padrões de Caracteres (Tipos de Fontes) Todos os caracteres deverão estar impressos na fonte Times New Roman ou na fonte Courier New.

Eu entendi que a ideia seria compatibilizar porém se a fonte está em desacordo com o Manual acredito que deveremos reverter a mudança.