JasperReports retornando relatório no browser, to Quase lá!

5 respostas
K

Boa tarde caros amigos do GUJ, estou quase conseguindo retornar os relaatórios do JasperReports no browser, na verdade eles ja são retornados só o browser não os abre.
Por exemplo, em pdf, visualizei pelo firebug o conteúdo retornado:

%PDF-1.4
%âãÏÓ
3 0 obj
<</Filter/DCTDecode/Type/XObject/Length 9834/BitsPerComponent 8/Height 196/ColorSpace/DeviceRGB/Subtype/Image/Width 166>>stream
ÿØÿà�JFIF��H�H��ÿÛ�C� aaaa ÿÛ�C
ÿÀ��Ä�¦�ÿÄ���������������a ÿÄ�X�a

O mesmo acontece para os formatos doc e xls, só que os retornos são diferentes logicamente.

Sabem me dizer o que está faltando?

if ( acao.equals("1") ){
        		    RequestDispatcher dispatcher = 
        				request.getRequestDispatcher("/ReportRender");
        		 
        		    // preenchemos o servlet que renderiza o formato a ser gerado pelo relatorio
        		    String pathReport = sc.getRealPath("/Relatorios/"+nomeRelatorio);
        		    
        		    request.setAttribute("pathJasperFile", pathReport);
        		    request.setAttribute("paramMap", parametros);
        		    request.setAttribute("con",con.getCon());
        		    request.setAttribute("type",ConstantesCartao.TYPE_PDF);
        		    request.setAttribute("nameReport", NameRep);
        		    
        		    if (dispatcher != null) dispatcher.forward(request, response);
        		    
        		    response.setContentType("application/pdf");

ReportRender

package objects.servlets;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import util.ConstantesCartao;
import util.ExportaRelatorio;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;

public class ReportRender  extends HttpServlet {
	 
	protected void doGet(HttpServletRequest request,HttpServletResponse   
              response) throws ServletException, IOException {
	    String caminho = (String) request.getAttribute("pathJasperFile");	
	    String type = (String) request.getAttribute("type");
	    String [] strArray = caminho.split("cartaoRezende");
	    
	    String caminhoRelativo = strArray[1];
	    
	    String name = (String) request.getAttribute("nameReport");
	    
		ServletOutputStream servletOutputStream = response.getOutputStream();
		ExportaRelatorio exporter = new ExportaRelatorio(name);
		InputStream reportStream = getServletConfig().getServletContext()
		.getResourceAsStream(caminhoRelativo);		
	
		HashMap parameterMap = (HashMap) request.getAttribute("paramMap");
		Connection con = (Connection)request.getAttribute("con");
		
		try{
			if ( type.equals( ConstantesCartao.TYPE_PDF ) ){
				JasperRunManager.runReportToPdfStream(reportStream,
				servletOutputStream, parameterMap, con);
				response.setContentType("application/pdf");
				servletOutputStream.flush();
				servletOutputStream.close();
			} else if ( type.equals( ConstantesCartao.TYPE_XLS ) ) {
				JasperPrint jp = JasperFillManager.fillReport(
						 caminho , parameterMap,
				         con);
				exporter.geraXLS(jp,servletOutputStream);
				response.setContentType("application/xls");
			} else if ( type.equals( ConstantesCartao.TYPE_DOC ) ) {
				JasperPrint jp = JasperFillManager.fillReport(
						caminho , parameterMap,
				         con);
				exporter.geraDOC(jp,servletOutputStream);
				response.setContentType("application/doc");
			}
		}
		catch (JRException e)
		{
			StringWriter stringWriter = new StringWriter();
			PrintWriter printWriter = new PrintWriter(stringWriter);
			e.printStackTrace(printWriter);
			response.setContentType("text/plain");
			response.getOutputStream().print(stringWriter.toString());
		}
    }
}

5 Respostas

K

Pessoal, to com uma informação a mais que notei aqui.
Pelo Firebug ví o cabeçalho da resposta:

Server Apache-Coyote/1.1
Transfer-Encoding chunked
Date Wed, 26 May 2010 20:35:47 GMT

No java to colocando umas informações que deviam aparecer e não estão aparecendo:

response.setHeader("Pragma","");  
response.setHeader("Cache-Control","");  
response.setHeader("Expires","");  
response.setHeader("Content-Disposition", "inline; filename=" + name.toUpperCase() + "." +  ConstantesCartao.TYPE_PDF);  
				response.setContentType("application/pdf");
furutani

Vc está usando JSF?
Não use os botoes/links com chamadas em ajax.

K

Estou não mas uso ajax. Olha o código abaixo:

html do botao que chama o relatorio:

<td><a id="divPdf1" href="javascript:void(0)" onClick="geraRelatorio(1);" ><img src="skin/skin/skn_comum/pdf.png" width="40" height="40"></a></td>

Javascript que chama o relatorio:

function geraRelatorio(acao){
    	$j.ajax({
    		type: 'GET',
    		url: 'GeraRelBrindes',
    		cache:false,
    		dataType: 'json',
    		data: 'nomeRelatorio=SaldoDeBrindes3.jasper&acao='+acao+'&dataInicial='+$j('#dtaInicial').val()+'&dataFinal='+$j('#dtaFinal').val()+'&franqueado='+$j('#codFranqueado').val()+'&codItem='+$j('#codItem').val()+'&operador='+$j('#operador').val()+'&cartao='+$j('#numCartao').val()+'&cliente='+$j('#nomCliente').val(),
    		beforeSend: function(){
    			$j('#carregando').fadeIn(300);
    		},
    		success: function(txt){ // txt => conteúdo trazido pela requisição
    			$j('#carregando').hide();
    		},
    		complete: function(txt){ // txt => conteúdo trazido pela requisição
    			$j('#carregando').hide();
    		}					
    	});
furutani

Tenta chamar diretamente pelo browser.

K

Furatani, era o JQuery que estava fazendo dar errado, na URL ele realmente funcionou:
Olha a substituição que fiz da chamada geraRelatorio:

function geraRelatorio(acao){
    	window.location = 'GeraRelBrindes?nomeRelatorio=SaldoDeBrindes3.jasper&acao='+acao+'&dataInicial='+$j('#dtaInicial').val()+'&dataFinal='+$j('#dtaFinal').val()+'&franqueado='+$j('#codFranqueado').val()+'&codItem='+$j('#codItem').val()+'&operador='+$j('#operador').val()+'&cartao='+$j('#numCartao').val()+'&cliente='+$j('#nomCliente').val();
    }

Também forcei o download:
response.setContentType(“application/force-download”);

Valeu a dica brow, abraço!

Criado 26 de maio de 2010
Ultima resposta 27 de mai. de 2010
Respostas 5
Participantes 2