Ireport vários relatorios

2 respostas
J

Bom dia,

Tenho uma dúvida sobre um um relatorio que eu criei.

Desenvolvi uma nota eletronica no ireport, toda cheia dos retangulos e formas pra separar os campos, como uma nota eletronica tem.
Porém hoje ela funcina perfeitamente com uma nota por vez. Eu trabalho com a conexão de dados por uma lista e não direta a um banco e gostaria de saber se existe como mandar várias listas para imprimir várias notas eletronicas em um único PDF.

Obrigado!

2 Respostas

J

Pessoal, fiz um codigo aqui porém não tem jeito de funcionar, simplesmente parece que o arquivo quando criado ficar corrompido ou algo do tipo e estou precisando muito disso!

Gostaria muito da ajuda de vces!

Visualização e criação do PDF, onde ocorre a montagem e possívelmente o erro

public void visualizaPDF(List<JasperPrint> jasperPrints) {
        byte[] arquivo = new byte[0];
        JasperPrint impressaoTotal = new JasperPrint();
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            List<JRPrintPage> listaRel = new ArrayList<JRPrintPage>();
            CamposRelDacte camposRel = new CamposRelDacte();
            ArrayList<CamposRelDacte> camposR = new ArrayList<CamposRelDacte>();
            for (int i = 0; i < jasperPrints.size(); i++) {
                JasperPrint jasper = jasperPrints.get(i);
                camposRel = new CamposRelDacte();
                camposRel.setJasper(jasper);
                camposR.add(camposRel);
            }

            for (int i = 0; i < camposR.size(); i++) {
                listaRel = camposR.get(i).getJasper().getPages();
                for (JRPrintPage jRPrintPage : listaRel) {
                    impressaoTotal.addPage(jRPrintPage);
                }
            }
            
             arquivo = JasperExportManager.exportReportToPdf(impressaoTotal);
             HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
             response.setContentType("application/pdf");
             response.setContentLength(arquivo.length);
             OutputStream saida = response.getOutputStream();
             saida.write(arquivo, 0, arquivo.length);
             saida.write(arquivo, 0, arquivo.length);
             saida.flush();
             saida.close();

Montagem e ligação dos dados para o relatorio, retornando um JasperPrint

public JasperPrint  criaRelatorioDacte(String relatorio, Map<String, Object> map, List<Object> listaDados) {
        try {
            byte[] arquivo = new byte[0];
            FacesContext context = FacesContext.getCurrentInstance();
            InputStream isJasper = new FileInputStream(getClass().getResource("/RelCooperados/" + relatorio + ".jasper").toString().replace("file:", "").replace("\\", "/"));
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(isJasper);


            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(listaDados, false));
            return jasperPrint ;
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro ao visualizar relatório.", ex.getMessage()));
            return null;
        }
    }

Também fiz da seguinte forma

public void geraPDF(byte[] arquivo) throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.setContentType("application/pdf");
        response.setContentLength(arquivo.length);
        OutputStream saida = response.getOutputStream();
        saida.write(arquivo, 0, arquivo.length);
        saida.flush();
        saida.close();
    }

e Chamada fica igual ao outro, so que retorna um byte[]

public byte[] criaRelatorioDacte(String relatorio, Map<String, Object> map, List<Object> listaDados) {
        try {
            byte[] arquivo = new byte[0];
            FacesContext context = FacesContext.getCurrentInstance();
            InputStream isJasper = new FileInputStream(getClass().getResource("/RelCooperados/" + relatorio + ".jasper").toString().replace("file:", "").replace("\\", "/"));
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(isJasper);


            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(listaDados, false));
            arquivo = JasperExportManager.exportReportToPdf(jasperPrint);
            //JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, ConexaoTeste.Conecta());
            return arquivo;
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro ao visualizar relatório.", ex.getMessage()));
            return null;
        }
    }

a Contatenação do arquivo byte[] fica assim:

byte[] arquivos = null;
if (arquivos == null) {
                            arquivos = funcao.criaRelatorioDacte("Dacte", map, funcao.getTags(tags));
                        } else {
                            byte[] arq = funcao.criaRelatorioDacte("Dacte", map, funcao.getTags(tags));
                            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                            outputStream.write(arquivos);
                            outputStream.write(arq);

                            arquivos = outputStream.toByteArray();
                        }

Essa ultima opçao funciona, mas só imprime um relatorio dentro do pdf, no caso o ultimo, se tiver 5, somente o 5º vai ser impresso, os outros 4 simplesmente não aparece

Alguem tem alguma solução para exportar vários relatorios em um único PDF???

Obrigado

J

Bom dia,

Alguém por favor consegue me dar uma ajuda nisso, estou precisando muito disso…

Obrigado!

Criado 25 de abril de 2014
Ultima resposta 26 de abr. de 2014
Respostas 2
Participantes 1