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