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 );
}
}
Cara eu utilizo esta classe para gerar e abrir no browser.
[code]
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();
}
}[/code]
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">