GWT + Jasper + PDF

0 respostas
Z

Olá!

Estou tentando exibir um relatório em PDF para o cliente, mas tem retornado o erro O arquivo não começa com '%PDF-', sendo que se eu substitui o request.getParameter("codigo") diretamenta pela string que corresponde a variável, o relatório mostra corretamente ou se mudar o response.setHeader("Content-Disposition", "inline; filename=\"Relatório.pdf\";"); por response.setHeader("Content-Disposition", "attachment; filename=\"Relatório.pdf\";");, só que preciso mandar o relatório para a janela e não para download.

Segue o código como tenho feito.

Classe que cria o Relatório:
package teste.server.action;

import net.sf.jasperreports.engine.*;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
import teste.server.dao.*;
import teste.server.model.*;

public class RelatorioRelacaoSimples implements ActionsReport {

	public RelatorioRelacaoSimples() {
	}

	public void Execute(ServletContext sc, HttpServletRequest request, HttpServletResponse response){
		FichaDAO dao = null;

		String pathJasper = sc.getRealPath("/WEB-INF/classes/teste/server/relatorios/")+ "/";

		response.setContentType("text/html;charset=UTF-8");
		try{
			int codigo = Integer.parseInt(request.getParameter("codigo"));
			//int codigo = Integer.parseInt("9");
			dao = new FichaDAO(Uteis.getBanco(request));
			JRResultSetDataSource jrRS = new JRResultSetDataSource(dao.getRelacaoSimples(codigo));

			HashMap parameters = new HashMap();  

			byte[] bytes = null;  
			try {       
				bytes = JasperRunManager.runReportToPdf(pathJasper	+ "relacaosimples.jasper", parameters, jrRS);
			} catch (Exception e) {   
				e.printStackTrace();  
				return;  
			}    

			if (bytes != null && bytes.length > 0) {  
				ServletOutputStream outputStream = response.getOutputStream();  
				response.setContentType("application/pdf");
				response.setHeader("Content-Disposition", "inline; filename=\"Relatório.pdf\";");
				//response.setHeader("Content-Disposition", "attachment; filename=\"Relatório.pdf\";");
				response.setHeader("Cache-Control", "no-cache, must-revalidate");
				response.setContentLength(bytes.length);  
				outputStream.write(bytes, 0, bytes.length);
				outputStream.println();
				outputStream.flush();  
				outputStream.close();  
			}
		} catch (Exception e) { 
			e.printStackTrace();  
		}
	}
}
Servlet:
package teste.server.model;

import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;  
import teste.server.action.ActionsReport;

public class Report extends HttpServlet {  
	private ServletContext sc;  
	private String jsp = "";
	       
	public void init(ServletConfig config) throws ServletException {  
		super.init(config);  
		sc = config.getServletContext();  
	} 

	/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
	 * @param request servlet request 
	 * @param response servlet response 
	 */  
	protected void service(HttpServletRequest request, HttpServletResponse response)  
	throws ServletException, IOException {  
		Class classe = null;
		ActionsReport obj = null;
		String relatorio;

		relatorio = "teste.server.action."+request.getParameter("action");  
		try {
			classe = Class.forName(relatorio);
			obj = (ActionsReport)classe.newInstance();
			obj.Execute(sc, request, response);
		} 
		catch (Exception e) {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			out.println(e.toString());
		}
		finally {
			classe = null;
			obj = null;
		} 
		//  
		//Redirecionando pagina  
		RequestDispatcher rd = request.getRequestDispatcher(jsp);  
		rd.forward(request, response);
	}  
}
Classe que chamo para gerar o Relatório:
package teste.client;

import teste.client.myclass.gwt.*;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.Frame;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HTML;

public class FormRelatorio extends BasicForm {
	public TextBox codigo;
	public String action;
	private WaitPanel msg;
	private HTML pdf;
	
	//MEUS PROCEDIMENTOS
	private void Gravar(){
		String root_path = GWT.getHostPageBaseURL();
		FORM.setAction(root_path+"Report?action="+action);
		msg = new WaitPanel();
		msg.ShowModal();
		FORM.submit();
	}
	
	public void ShowModal(){
		super.ShowModal();
		Gravar();
	}
	
	//CONSTRUTOR DO FORM
	public FormRelatorio(String text) {
		super(text);
		initComponents();
	}
	
	private void initComponents() {
		FORM.addSubmitCompleteHandler(new SubmitCompleteHandler() {
			public void onSubmitComplete(SubmitCompleteEvent event) {
				msg.Close();
				msg = null;
				pdf.setHTML(event.getResults());
			}
		});
		FORM.setHeight("100%");
		Pgeral.setSize(Integer.toString(Window.getClientWidth()-30)+"px", Integer.toString(Window.getClientHeight()-50)+"px");
		
		codigo = new TextBox();
		codigo.setVisible(false);
		codigo.setName("codigo");
		Pform.add(codigo, 23, 10);
		
		pdf = new HTML("", true);
		Pform.add(pdf, 0, 0);
		pdf.setSize("100%", "100%");
	}
}
Chamada para o Relatório:
final FormRelatorio frmrelatorio = new FormRelatorio("Relatório");
frmrelatorio.codigo.setText(grid.getDSField("fic_codigo"));
frmrelatorio.action = "RelatorioRelacaoSimples";
frmrelatorio.ShowModal();

Alguem mais já se deparou com esse problema?

Criado 10 de outubro de 2011
Respostas 0
Participantes 1