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

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());
		}
    }
}

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");

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

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();
    		}					
    	});  

Tenta chamar diretamente pelo browser.

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!