Erro ao gerar PDF (JasperReport)

Pessoal, desenvolvi alguns relatórios usando o iReport, ao compilar e executar no próprio iReport funciona certinho !!

Ao tentar abrir pelo sistema, tem 1 (Um) que dá erro:
Linha do Servlet:

JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "RelOrcamento.jasper", parametros, conexao.conn);

Erro na Página:

File does not begin with '%PDF-'.

Erro no Console:

Error loading object from file : /home/marcelo/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/webapps/metasuporte/WEB-INF/classes/biblioteca/relatorios/RelOrcamento.jasper

Alguém sabe me dizer pq não está abrindo o PDF ??

Valew.

Sei que este erro pode ser ocasionado por N motivos !!! O que me tá me deixando louco é que no iReport executa e abre o PDF normalmente !!!

Alguém já passou por isso e pode me indicar como resolver ???

Valew.

Como está o caminho do arquivo na variável pathJasper?

Está assim:

P.S. : Todos meus relatórios estão neste caminho, mas apenas este não está gerando !!!

Valew.

e ae…

tenta gerar o .jasper desse relatorio de novo, ou mudar ele de local…

qual a linha anterior e a proxima da onde dá o erro?!?!

e ae…

tenta gerar o .jasper desse relatorio de novo, ou mudar ele de local…

qual a linha anterior e a proxima da onde dá o erro?!?![/quote]

Acho melhor postar o código do Servlet inteiro !! hehehehe

Cada relatório tem um servlet, todos iguais, só muda mesmo o nome do .jasper e os parametros.

public class RelOrcamento extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {
		Conexao conexao = new Conexao();
		conexao.conecta(); // Faz a conexao
		// Na variavel pathJasper ficara o caminho do diretorio para os relatorios compilados (.jasper)
		String pathJasper = getServletContext().getRealPath("/WEB-INF/classes/biblioteca/relatorios/")+ "/";		
		Double id_orcamento = new Double(req.getParameter("id_orcamento"));	
		String logo = getServletContext().getRealPath("/imagens/logo.jpg");		
		//Parametros do relatorio
		Map<String, Comparable> parametros = new HashMap<String, Comparable>();
		parametros.put("ID_ORCAMENTO", id_orcamento);
		parametros.put("LOGO", logo);
		try {
			 JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "RelOrcamento.jasper", parametros, conexao.conn);
			 byte[] bytes = JasperExportManager.exportReportToPdf(impressao);
			 res.setContentType("application/pdf");
			 res.setContentLength(bytes.length);
			 ServletOutputStream ouputStream = res.getOutputStream();
			 ouputStream.write(bytes, 0, bytes.length);
			 ouputStream.flush();
			 ouputStream.close();
		} 
		catch (IOException e) {
			res.getWriter().println("Erro ao gerar o relatório: " + e);
			System.out.println("Erro de IO: " + e.getMessage());
		}
		catch (Exception e) {
			res.getWriter().println("Erro ao gerar o relatório: " + e);
			System.out.println("Erro: " + e.getMessage());
		}
		finally {		        
		     try{ conexao.conn.close();}
		     catch(Exception e){e.printStackTrace();}
	    } 
	}
	
	
	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
		throws ServletException, IOException {
		doPost(arg0, arg1);
	}
	
}

putz cara…nem consegui ver nada de estranho…

tenta mandar pra um arquivo ao inves de um byte[]…

só pra ver se ele gera!!!

e qual o destino desse pdf…aparece a tela pro usuário salvar ou abrir!!!

[quote=matheuscechito]putz cara…nem consegui ver nada de estranho…

tenta mandar pra um arquivo ao inves de um byte[]…

só pra ver se ele gera!!!

e qual o destino desse pdf…aparece a tela pro usuário salvar ou abrir!!![/quote]

Seu eu mandar pra arquivo ao invés de byte, como ficaria este bloco ??

             byte[] bytes = JasperExportManager.exportReportToPdf(impressao);   
             res.setContentType("application/pdf");   
             res.setContentLength(bytes.length);   
             ServletOutputStream ouputStream = res.getOutputStream();   
             ouputStream.write(bytes, 0, bytes.length);   
             ouputStream.flush();   
             ouputStream.close();

Bom, da maneira que está ele já abre o PDF direto no browser sem perguntar nada !!!

Valew.

não lembro bem ao certo, faz tempinho q não mexo com isso, mas se não me engano é assim:

JasperExportManager.exportReportToPdfFile(impressao, "C:\ArquivoPdf.pdf");
/*
byte[] bytes = JasperExportManager.exportReportToPdf(impressao);     
res.setContentType("application/pdf");     
res.setContentLength(bytes.length);     
ServletOutputStream ouputStream = res.getOutputStream();     
ouputStream.write(bytes, 0, bytes.length);     
ouputStream.flush();     
ouputStream.close();
*/

basta comentar isso ae, e colocar a outra linha, com o caminho pra onde vc quer gerar o pdf…
se não der certo, falae que eu mostro um outro jeito q eu fiz aki…
t+

não lembro bem ao certo, faz tempinho q não mexo com isso, mas se não me engano é assim:

JasperExportManager.exportReportToPdfFile(impressao, "C:\ArquivoPdf.pdf");
/*
byte[] bytes = JasperExportManager.exportReportToPdf(impressao);     
res.setContentType("application/pdf");     
res.setContentLength(bytes.length);     
ServletOutputStream ouputStream = res.getOutputStream();     
ouputStream.write(bytes, 0, bytes.length);     
ouputStream.flush();     
ouputStream.close();
*/

basta comentar isso ae, e colocar a outra linha, com o caminho pra onde vc quer gerar o pdf…
se não der certo, falae que eu mostro um outro jeito q eu fiz aki…
t+

Continua o mesmo erro !!!

Para testar mais, criei um Teste.jasper onde tenho apenas Static Text, e mesmo assim dá o erro!!!

Na hora de trazer o erro, dei um e.getCause() (res.getWriter().println("Erro ao gerar o relatório: " + e.getCause());)

Veja o que trouxe:

Muito estranho isso !! o que será ??

Valew.

Continua o mesmo erro !!!

Para testar mais, criei um Teste.jasper onde tenho apenas Static Text, e mesmo assim dá o erro!!!

Na hora de trazer o erro, dei um e.getCause() (res.getWriter().println("Erro ao gerar o relatório: " + e.getCause());)

Veja o que trouxe:

Muito estranho isso !! o que será ??

Valew.

putz…
mó estranho msm…

qual versão do jasper seu?!?!
mas o mais estranho é q só esse relatório da pau neh!!!

nem adiante fazer do jeito q eu fiz aki, pq ai não ta conseguindo nem pegar o arquivo pra gerar o pdf!!!

Opa, beleza, não tem algo com o caminho do relatório não?

Ou, também tente passar o caminho assim:
http://www.guj.com.br/posts/list/69025.java#362905

Algum objeto seu é serializável?

AJUDA EU

To com um problema na hora de gerar o pdf. A servlet vai nuba boa, mas o que vem na tela pra mim é isso aqui oh.

%PDF-1.4 %âãÏÓ 4 0 obj <>stream x?¥?Ín!?ïûãMRq??v?þi¢ë©ö@]jÖ¬k?Ö¶?Ü·è®=h??m2!Ãa?pe?²H&#65533;¯[ÓB¶?.R¢?½DÝ^¶?®Î?pXnÎ?P&L##?ü# j?ùq?_EÝt>N'óN§Ù?Ãê??ê1p¤??ŧòß?á}zwC&#65533;?:÷0áÁú°Ê?ß@¨uhfK·?©{õn窽ÝaG¹º¸íî&ÏÎ;?í=mh?âD@#çË¢"Z #"O?zÂ?kç7¶ú$ 3¸ä}Î??(?>â¸k¥i¥1ô7ÇÃlJ´ÞB¨,dþm]?å?(??¼WÎÕ·¤rÈ-?ÜAi?NP?ªÙ×G±ÜÂ%KÕL?Ã5'½á£?p&®É?ê$?Xtõ¢aZë¾2H©.µ??Jñ?$Í?>å7íì?Q endstream endobj 1 0 obj<<<>>>/MediaBox[0 0 595 842]>> endobj 7 0 obj <>stream x?¥?½NÃ0?w?Å?é@ðO?±¨Th?ÚT?!jL)JmpB?Gæ-HÐe8EJ¬Äw?/?Ï®ØyÁðîêïY"¡Ø³Ó©&#65533;Ñ?Y4*?ÙÅñ?ýq?R?ñ4NÿyÈ>?-?Æó"?÷i8lÿIuÿÐ=+ º5 \ëÝÎÃÌaë<%µ@åïÎA¥C¿kV¶ee?o&#65533;¤?ÂR?ÆP_»??I<??~p×*¢??Jl_ Ñ?XGz=­õ?:ST-I??Ü[]Óòk?í²ÈWQ8N(?ü¾là²Õ'Ñ;Z?µma_?m¬kËvw°Ä]??ä]YÎl?å+¥mzM!¨eïï¨?PÄݸ{7¹¥B«kª4ý:Fü6¦1YF3?ìh>f¥FóAÖ7j??= endstream endobj 6 0 obj<<<>>>/MediaBox[0 0 595 842]>> endobj 9 0 obj <>stream x?¥ÔKKÃ@að{>Åë¡u³¯l?­´iú8??Æ4Òld?Vü¾ú=Ü?2??a$³¿dÿ;?p?L·I “nç£Ó¶ur=O!?WÏÉàjû?Ì.ðT_)NØ?ý-çBñ};?É`:[/6ça?õðϤñ?háfª¶«|Såáè’?éáîC?&E]ùÈ?¼kÃS¶wãGOíé£Dà8??,3µ<ð??-l?cã@JfB=Èeè?¡Ð?Ët{Di°??vÿ?2d?¦?Ùr²ãö)-Üæ>öèªiZfú4³ÉØÂ_¶è»¼«NÈ\48oBÛaÜÃ7#¡igp?UÍ??D¬SÂr”?

alguem sabe como resolver esse problema?

código que estou usando:

import java.io.;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.
;
import javax.servlet.http.*;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

/**
*

  • @author Administrador
    */
    public class Relatorio extends HttpServlet {

private Connection getConnection(){
Connection connection=null;
try {
//cria a conexão com o banco de dados
Class.forName(“com.mysql.jdbc.Driver”);
String db = “jdbc:mysql://localhost:3306/relatorios?user=edson&password=integrator”;
connection = DriverManager.getConnection(db);

} catch (SQLException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}

return connection;

}

/**

  • Processes requests for both HTTP GET and POST methods.
  • @param request servlet request
  • @param response servlet response
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // response.setContentType(“text/pdf;charset=ISO-8859-1”);
    // PrintWriter out = response.getWriter();

ServletOutputStream servletOutputStream = response.getOutputStream();

String caminho = “/WEB-INF/relatorios/”;
String relatorio = caminho+“Relatorios_MestreDetalhe.jasper”;
InputStream reportStream = getServletConfig().
getServletContext().
getResourceAsStream(relatorio);

ServletContext context = getServletContext();

try {

Connection connection = getConnection();
HashMap<String, String> map = new HashMap<String, String>();
//o Nome do parâmetro e o valor é passado ao HashMap
map.put(“SUBREPORT_DIR”, context.getRealPath(caminho)+File.separator);

JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, map,connection);

response.setContentType(“application/pdf”);
servletOutputStream.flush();
servletOutputStream.close();
if(connection!=null)connection.close();
} catch (SQLException ex) {
Logger.getLogger(“global”).log(Level.SEVERE, null, ex);
}
catch (JRException e) {
// display stack trace in the browser
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
response.setContentType(“text/plain”);
response.getOutputStream().print(stringWriter.toString());
}

}

//
/**

  • Handles the HTTP GET method.
  • @param request servlet request
  • @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
    }

/**

  • Handles the HTTP POST method.
  • @param request servlet request
  • @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
    }

/**

  • Returns a short description of the servlet.
    */
    public String getServletInfo() {
    return “Short description”;
    }
    //
    }

os arquivos estão nas pastas corretas o problema é somente na visualização! Obrigado desde já a atenção

Estou gerando um erro tbm quando executo meu programa para gerar um relatório com JasperReport. Segue abaixo o código do erro:

--------------------Configuration: RelatorioBibliotecaPessoal - JDK version 1.6.0_17 - --------------------
Exception in thread “main” java.io.FileNotFoundException: \teste.jasper
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:117)
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:237)
at RelatorioBibliotecaPessoal.geraRelatorio(RelatorioBibliotecaPessoal.java:28)
at RelatorioBibliotecaPessoal.main(RelatorioBibliotecaPessoal.java:34)

NESTED BY :
net.sf.jasperreports.engine.JRException: \teste.jasper
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:117)
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:237)
at RelatorioBibliotecaPessoal.geraRelatorio(RelatorioBibliotecaPessoal.java:28)
at RelatorioBibliotecaPessoal.main(RelatorioBibliotecaPessoal.java:34)
Caused by: java.io.FileNotFoundException: \teste.jasper
… 4 more

Se, eu retirar as barras do caminho para o arquivo teste.jasper, ele gera outro erro:

--------------------Configuration: RelatorioBibliotecaPessoal - JDK version 1.6.0_17 - --------------------
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:123)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:151)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:353)
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:274)
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:242)
at RelatorioBibliotecaPessoal.geraRelatorio(RelatorioBibliotecaPessoal.java:28)
at RelatorioBibliotecaPessoal.main(RelatorioBibliotecaPessoal.java:34)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
… 7 more

gostaria que alguém me desse uma luz no que esta errado aqui… segue abaixo o meu código:

import net.sf.jasperreports.engine.;
import net.sf.jasperreports.view.JasperViewer;
import java.sql.
;
import java.util.*;

public class RelatorioBibliotecaPessoal{

private static Connection getConnection() throws ClassNotFoundException, SQLException {
	String driver = "com.mysql.jdbc.Driver";
	String url = "jdbc:mysql://localhost/test";
	String user = "root";
	String password = "1234";
	
	Class.forName(driver);
	Connection con = DriverManager.getConnection(url,user,password);
	return con;
}

public void geraRelatorio() throws JRException, Exception {
	Connection con = getConnection();
	Statement stm = con.createStatement();
	String query = "select * from user";
	ResultSet rs = stm.executeQuery(query);
	
	JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
	Map parameters = new HashMap();
	
	JasperFillManager.fillReportToFile("teste.jasper",parameters,jrRS);
	JasperExportManager.exportReportToPdfFile("teste.jrprint");
	JasperViewer.viewReport("teste.pdf",false);
}

public static void main(String[] args) throws JRException, Exception{
	new RelatorioBibliotecaPessoal().geraRelatorio();
}

}

Estou usando:

JCreator 4.5 PRO
JasperReport 0.6.1
IReport 0.4.0
MySQL 4.1
Eclipse 3.4
Windows XP
Se alguém puder me ajudar eu agradeço a atenção dispensada a este.