[RESOLVIDO] Problemas na exibição do relatorio com JasperReport em aplicação JAVA EE

2 respostas Resolvido
javawebjasperireportjava
N

Olá pessoal, preciso muito de uma ajudinha de vocês.

No meu trabalho, estou desenvolvendo uma aplicação Java EE, com web service REST (Jersey), Hibernate e JQuery no front-end.
Todas as minhas requisições do sistema usam o ajax e estou com dificuldade em gerar o relatório e exibi-lo na tela para o usuário (seja abrindo no browser ou download).

Gostaria de saber a melhor maneira de fazer isso, já vi alguns locais dizendo que não é possivel abrir o PDF recebido pelo Ajax.

Eu possuo alguns filtros que o usuário pode escolher para gerar o relatório e passo esses filtros através de um POST para o web service que me retorna assim (creio que está certo essa parte):

File relatorio = gerarRelatorioExtratoVendas(movimentos, usuarioLogado, filtros); ResponseBuilder response = Response.ok(relatorio); response.type("application/pdf"); response.header("Content-Disposition", "attachment; filename=" + relatorio.getName()); return response.build();

Agora preciso recebê-lo e mostrar para o usuário, estou salvando em uma pasta temporária do sistema.

Aguardo o retorno.
Obrigada desde já.

2 Respostas

V

Pra gerar relatórios eu uso o iReport pra construir e pra retornar pra tela por download utilizo mais o menos assim:

getHttpResponse().setContentType("application/pdf");
getHttpResponse().addHeader("Content-Disposition", "attachment;filename=NomeQueSairaParaoUsuario.pdf");

JasperExportManager.exportReportToPdfStream(jasperPrint, getHttpResponse().getOutputStream());

super.context().renderResponse();
super.context().responseComplete();
N
Solucao aceita

[RESOLVIDO]

Pessoal, consegui resolver. Vou postar aqui para caso alguém tenha a mesma dúvida.

No web service tenho o seguinte método:

@POST
@Consumes("application/json")
@Produces("application/pdf")
@Path("/faturamento")
public Response relatorioFaturamentoResumido(FiltrosFaturamento filtros) {
// ... código anterior
Map parametros = new HashMap();
List lista = new ArrayList();
File relatorio = RelatoriosHelper.gerarPdfRelatorioFaturamentoResumido(parametros, lista);
ResponseBuilder response = Response.ok(relatorio);
response.type("application/pdf");
response.header("Content-Disposition", "attachment; filename=relatorio.pdf");
return response.build();		
}

Método gerarPdfRelatorioFaturamento

public static File gerarPdfRelatorioFaturamentoResumido(Map parametros, List dados) {
File fileJrxml = new File(ClassLoaders.getResource("caminho/Relatorio_FaturamentoResumido.jrxml").getFile());
// cria arquivo na pasta temporária do sistema operacional utilizado.
File file = File.createTempFile("relatorio", ".pdf");
OutputStream saida = new FileOutputStream(file);
GeradorDeRelatorios gerador = new GeradorDeRelatorios();
gerador.geraRelatorioPdf(fileJrxml.getPath(), parametros, dados, saida);
return file;
}

Método geraRelatorioPdf (padrão para gerar todos os relatórios do sistema)

public void geraRelatorioPdf(String jrxml, Map parametros, List<? extends Object> fields, OutputStream saida) throws JRException {
    JasperReport jasper = JasperCompileManager.compileReport(jrxml);
    JRBeanCollectionDataSource dados = new JRBeanCollectionDataSource(fields);
    JasperPrint print = JasperFillManager.fillReport(jasper, parametros, dados);
    JasperExportManager.exportReportToPdfStream(print, saida);
}

Os trechos acima correspondem ao back-end e o trecho abaixo é a chamada XmlHttpRequest no front-end para a recuperação do arquivo e download no browser do usuário.
Obs: no meu caso tenho alguns filtros, por isso estou enviando parametros no método xhr.send().

function gerarRelatorio() {
		var xhr = new XMLHttpRequest();
		xhr.open("POST", "../ws/relatorios/faturamento", true);		
		xhr.setRequestHeader("Content-Type", "application/json");
		xhr.responseType = 'blob';		
		xhr.send(getFiltros());	
		xhr.onload = function() {
			if(this.status == 200) {
				var blob = new Blob([this.response], {type: "application/pdf"});
				var a = document.createElement("a");
				a.style = "display: none";
				document.body.appendChild(a);
				var url = window.URL.createObjectURL(blob);
				a.href = url;
				a.download = "relatorio.pdf";
				a.click();
				window.URL.revokeObjectURL(url);
			} else {
				console.log("Erro");
			}
		}
	}

É isso pessoal. Agora deu certinho o download dos meus relatórios.
Tive apenas um probleminha pra abri-los com o firefox, mas só fiz o download, abri com outro leitor de PDF e deu tudo certo.

Criado 1 de agosto de 2018
Ultima resposta 2 de ago. de 2018
Respostas 2
Participantes 2