Exibir relatorio do Ireport no navegador

2 respostas
C

Pessoal estou tentando mostrar um relatório do ireport em java web.
Estou utilizando um projeto que estava aki no guj.
Acontece que ele esta gerando um arquivo .jrprint e um aquivo pdf… e na hora de visualiza o relatório em formato PDF ele da o seguinte erro
net.sf.jasperreports.egine.JRException: Error loading object from file:C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.pdf

O que eu queria é que ele não gerasse nem um arquivo na minha pasta… gostaria que o arquivo pdf seja exibido no navegador para o usuário decidir se vai salvar, imprimir, etc.

Código a baixo.

import java.sql.*; 
import java.util.*;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;

public class GerarRelatorio {
	
	
	 
	/* Realiza conexão com o banco de dados, retornando o objeto Connection */
	 private static Connection getConnection( ) throws  
	ClassNotFoundException, SQLException 
	 { 
	   String driver = "org.postgresql.Driver"; 
	   String url = "jdbc:postgresql://localhost:5432/teste"; 
	   String user = "postgres"; 
	   String password = "postgres"; 
	    
	   Class.forName(driver); 
	   Connection con = DriverManager.getConnection( url, user, password ); 
	   return con; 
	 } 
	 /* Gera Relatorio e visualiza-o */
	 public void geraRelatorio( ) throws JRException, Exception 
	 { 
	   Connection con = getConnection( ); 
	   Statement stm = con.createStatement( ); 
	   String query = "SELECT * FROM funcionario WHERE (funcionario.id IN ( SELECT funcionario.id FROM funcionario WHERE nivel_id = 1 )) ORDER BY funcionario.nomecompleto ASC"; 
     		
     
     
     		
	   ResultSet rs =  stm.executeQuery( query ); 
	   /* implementação da interface JRDataSource para DataSource ResultSet */
	   JRResultSetDataSource jrRS = new JRResultSetDataSource( rs ); 
	   /* HashMap de parametros utilizados no relatório. Sempre instanciados */
	   Map parameters = new HashMap(); 
	   // parameters.put("COLUNA", valor);
	   
	  
	   
	   /* Preenche o relatório com os dados. Gera o arquivo FolhaCorretoresEAssistentes.jrprint */ 
	   JasperFillManager.fillReportToFile( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jasper", parameters, jrRS ); 
	    /* Exporta para o formato PDF */
	    JasperExportManager.exportReportToPdfFile( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jrprint" ); 
	   /* Preenche o relatorio e o salva diretamente em arquivo PDF. Sem
	       a necessidade do .jrprint */
	   // JasperRunManager.runReportToPdfFile("BibliotecaPessoal.jasper", parameters, jrRS);
	   
	   /* Visualiza o relatório em formato PDF */ 
	   net.sf.jasperreports.view.JasperViewer.viewReport( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.pdf", false );  
	  
	 } 
	
}

2 Respostas

L

Cara eu utilizo esta classe para gerar e abrir no browser.

import java.io.InputStream;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperRunManager;

public class ReportUtil {

	private static String ERRO_MENSAGEM_REPORT = "Um erro ocorreu quando o relatório estava sendo executado.";

	// executa o relatório através de um JRBeanCollectionDataSource
	public static void executarRelatorio(String caminhoRelatorio,
			Map<String, Object> parametros) throws Exception {

		Connection conexao = ConnectionFactory.getConnection();

		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context
		.getExternalContext().getResponse();

		// pega o caminho do arquivo .jasper da aplicação
		InputStream reportStream = context.getExternalContext()
		.getResourceAsStream(caminhoRelatorio);

		// envia a resposta com o MIME Type
		response.setContentType("application/pdf");

		ServletOutputStream servletOutputStream = response.getOutputStream();

		// envia parametros para o relatorio
		if (parametros == null) {
			parametros = new HashMap<String, Object>();
		}

		// envia para o navegador o PDF gerado
		JasperRunManager.runReportToPdfStream(reportStream,
				servletOutputStream, parametros, conexao);
		
		servletOutputStream.flush();
		servletOutputStream.close();

		context.responseComplete();
		conexao.close();
	}
}
C

Valeu luan_gazin !!!
eu não to usando o método runReportToPdfStream ñ…
mais grassas a você eu me deparei com o método runReportToPdf que gera justamente uma variável byte!!!
depois só foi preciso criar um ServletOutputStream e enviar o arquivo para o navegador!!!
o código esta logo a baixo.

import java.sql.*; 
import java.util.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperRunManager;

public class GerarRelatorio {	
	 
	/* Realiza conexão com o banco de dados, retornando o objeto Connection */
	 private static Connection getConnection( ) throws  
	ClassNotFoundException, SQLException 
	 { 
	   String driver = "org.postgresql.Driver"; 
	   String url = "jdbc:postgresql://localhost:5432/teste"; 
	   String user = "postgres"; 
	   String password = "postgres"; 
	    
	   Class.forName(driver); 
	   Connection con = DriverManager.getConnection( url, user, password ); 
	   return con; 
	 } 
	 /* Gera Relatorio e visualiza-o */
	 public void geraRelatorio(HttpServletRequest req, HttpServletResponse resp) throws JRException, Exception 
	 { 
	   /* inicia a a conexao com o banco */
	   Connection con = getConnection( ); 
	   /* cria uma instância de Statement para a execução do SQL */
	   Statement stm = con.createStatement( ); 

	   String query = "SELECT * FROM funcionario WHERE (funcionario.id IN ( SELECT funcionario.id FROM funcionario WHERE nivel_id = 1 )) ORDER BY funcionario.nomecompleto ASC";
     
	   /* faz a consulta no banco */
	   ResultSet rs =  stm.executeQuery( query );
	   /* fecha a conexao */
	   con.close();
	   /* implementação da interface JRDataSource para DataSource ResultSet */
	   JRResultSetDataSource jrRS = new JRResultSetDataSource( rs ); 
	   /* HashMap de parametros utilizados no relatório. Sempre instanciados */
	   Map parameters = new HashMap(); 
	   // parameters.put("COLUNA", valor);
	   
	   
	   
	   /* Preenche o relatório com os dados. Gera o arquivo Funcionarios.jrprint */ 
	   //JasperFillManager.fillReportToFile( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jasper", parameters, jrRS ); 
	    /* Exporta o arquivo .jrprint para o formato PDF */
	   //JasperExportManager.exportReportToPdfFile( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jrprint" ); 
	   /* Preenche o relatorio e o salva diretamente em arquivo PDF. Sem
	       a necessidade do .jrprint */
	   //JasperRunManager.runReportToPdfFile("C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jasper", parameters, jrRS);
	   
	   /* Cria um relatorio PDF em uma variavel byte*/
	   byte[] pdf = JasperRunManager.runReportToPdf("C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.jasper", parameters, jrRS);
	   
	   /*Retorna um fluxo para enviar dados ao navegador*/
	   ServletOutputStream out = resp.getOutputStream();
	   /*Informar ao navegador que o que vai ser enviado é um pdf*/
	   resp.setContentType("application/pdf");
	   /*Mostra o arquivo no navegador*/
	   out.write(pdf);
	   
	   /* Visualiza o relatório em formato PDF */ 
	   //net.sf.jasperreports.view.JasperViewer.viewReport( "C:/Users/Rick/workspace/teste/src/br/com/teste/relatorios/Funcionarios.pdf", false );  
	  
	   
	   
	 } 
	   
	   
	
}

o PDF vai ser criado na mesma pagina…
caso queira que ele abra em uma nova pagina digite

target="_blank" no form do html que chama o metodo GerarRelatorio

exemplo:

<form class="formulario" id="formulario" name="form1" method="post" action="funcionario.pdf" target="_blank">

Criado 30 de setembro de 2012
Ultima resposta 1 de out. de 2012
Respostas 2
Participantes 2