Jasper Report

8 respostas
italomatos

Bem pessoal , sou iniciante no que se diz respoeita a relatorio na Web Usando o IReport e o JasperReport.

Fiz um relatorio com o iReport , e queria exibir isso em um pdf , em um sistema meu web.
Coloquei coisa bem simples , mas o erro que deu foi o seguinte:

“Error loading object from file : D:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\testes\reports\testando.jasper”

no meu servlet tem o seguinte:



HashMap parametros=new HashMap();

JasperReport report = JasperManager.loadReport(D:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\czar\reports\testando.jasper);

JasperPrint impressao=JasperManager.fillReport(report,parametros,this.getConexao());

JasperManager.printReportToPdfFile(impressao,D:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\czar\reports\testando.pdf);

alguem sabe o que possa ser?
valeu

8 Respostas

C

Italo,

o arquivo testando.jasper existe? Voce sabe que o arquivo de modelo do jasperreport possui extensao jrxml, e que e necessario compilar para ele se tranformar num arquivo com extensao jasper, correto?

Caso o arquivo exista, verifique se o caminho esta correto, pois na mensagem de erro o caminho informado esta diferente do que voce postou.

De qualquer forma, como voce quer gerar o relatorio atraves de uma aplicacao web, o metodo “printReportToPdfFile” nao seria o mais adequado, visto que este metodo gera um arquivo fisicamente no disco. Imagine varios usuarios gerando o relatorio ao mesmo tempo. Como o nome do arquivo e o mesmo, ele ficara sempre sobrescrevendo o mesmo, e pode ocorrer de um usuario visualizar o relatorio de outro, ou dar exception no servlet pois o arquivo pode estar alocado para um usuario e por isso o jasperreport nao consegue sobrescreve-lo.

Abaixo envio o código de um exemplo que fiz gerando o relatorio atraves de stream:

package relatorio;

import java.io.*;
import java.net.URL;
import java.sql.*;
import java.util.HashMap;

import javax.servlet.*;
import javax.servlet.http.*;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;

//DEPRECIADOimport net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

//DEPRECIADOimport net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperRunManager;

import net.sf.jasperreports.engine.export.JRHtmlExporter;

import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;

import net.sf.jasperreports.engine.util.JRLoader;

public class RelatorioProduto extends HttpServlet {

	   private static final String CONTENT_TYPE_PDF  = "application/pdf";

	   private static final String driver = "org.firebirdsql.jdbc.FBDriver";
	   private static final String url = "jdbc:firebirdsql:localhost/3050:vendas";
	   private static final String login = "sysdba";
	   private static final String passwd = "masterkey";
	   
	   //private Logger log;

	   public void init() throws ServletException {
	     
	   }

	   protected void doGet(HttpServletRequest request,
	         HttpServletResponse response) throws ServletException, IOException {
	      doPost(request, response);
	   }

	   protected void doPost(HttpServletRequest request,
	         HttpServletResponse response) throws ServletException, IOException {
	      System.out.println("Wait while loadding Report...");

	      // estabelece uma conexão JDBC
	      Connection conn = null;
	      try {
	      	Class.forName(driver);
	      	conn = DriverManager.getConnection(url, login, passwd);
	      } catch (SQLException ex) {
	      	ex.printStackTrace();
	      } catch (ClassNotFoundException ex2) {
	      	ex2.printStackTrace();
	      }

              /* Carrego um parametro que ira trazer o produto 
               * que possui a ID=1
               */
	      HashMap params = new HashMap();
	      params.put("idProduto", new Integer(1));

              /*
               * Capturo o caminho fisico aonde se encontra meu modelo de 
               * relatorio ja compilado. Repare que aqui eu pego o meu 
               * contexto e o caminho aonde se localiza o relatorio, em forma 
               * de url.
               */
	      String jasper = request.getContextPath()+ "/relatorios/produto.jasper";

              /* Crio a variavel ops que ira receber o stream do relatorio */
	      OutputStream ops = null;
              
              /* Aqui pego o host aonde o meu servlet esta executando */
	      String host = "http://" + request.getServerName() + ":" + request.getServerPort();

              /* 
               * Aqui eu monto a URL aonde o meu modelo de relatorio se 
               * localiza 
               */
	      URL jasperURL        = new URL(host + jasper);

	      try {
	         System.out.println("Getting the binary...");
	         
              /* 
               * DEPRECIADO - Esta era a forma utilizada para gerar o pdf 
               * ate a versao 0.5.x. Na versao 0.6.x a classe JasperManager
               * foi depreciada, e o metodo runReportToPdf foi incluido na
               * nova classe JasperRunManager. Alguns outros metodos foram
               * da classe JasperManager foram incluidos nesta classe e o 
               * restante foram agrupados nas classes 
               * JasperCompileManager, JasperFillManager e 
               * JasperExportManager.
 	       * byte[] bytes = JasperManager.runReportToPdf(
	       *        jasper.openStream(), params, conn);
               */

                 /* 
                  * Informo ao browser que a pagina que sera retornada
                  * e um arquivo pdf 
                  */
	         response.setContentType(CONTENT_TYPE_PDF);

                 /* 
                  * Gero o relatorio e armazeno o stream retornado num
                  * array de bytes
                  */
	         byte[] bytes = JasperRunManager.runReportToPdf(jasperURL.openStream(), params, conn);
	         
                 /* 
                  * Pego uma referencia do outputStream e gravo nele meu
                  * array de bytes
                  */
		 if (bytes != null) {
		     ops = response.getOutputStream();
                     System.out.println("Writting binary");
	  	     ops.write(bytes);
	  	     System.out.println("Sending report...");
		 }
	         
	      } catch (JRException ex) {
	         ex.printStackTrace();
	      } finally {
                 /*
                  *
                  */
	         if (ops != null) {
	            ops.flush();
	            ops.close();
	         }
	         try {
	            conn.close();
	         } catch (SQLException ex1) {
	            ex1.printStackTrace();
	         }
	      }
	   }
}

Espero que este exemplo te ajude a resolver seu problema. E qualquer duvida pode perguntar. Ainda estou conhecendo o framework JasperReport, mais caso saiba como resolver seu problema, ficarei feliz em ajudar :slight_smile:

italomatos

Cara,
coloquei esse teu exemplo pra rodar, e agora ta dando outro erro:

java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 604, local class serialVersionUID = 607

o que poderia ser isso?

valeu .

C

Qual versão do IReport você tá usando? Eu uso a 0.4.1.

O JasperReport tem um problema, que é o fato de um relatório compilado em uma determinada versão do JasperReport não funcionar num sistema que utiliza uma outra versão, mesmo sendo mais nova.

Se você estiver usando a versão 0.4.0 ou anterior, recomendo baixar a versão 0.4.1.

E outra. Por causa deste problema de versões, é recomendando utilizar os jars que estão dentro do lib do ireport no seu projeto. No caso, como o JasperReport depende de vários outros frameworks, eu adicionei todos os jars dete diretório no meu projeto, para não dar problema.

Dá uma olhada se não é isso. Qualquer dúvida é só falar.

pbcjunior

o meu deu esse erro

java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/compiler/env/INameEnvironment
	java.lang.Class.getDeclaredConstructors0(Native Method)
	java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
	java.lang.Class.getConstructor0(Class.java:2640)
	java.lang.Class.newInstance0(Class.java:321)
	java.lang.Class.newInstance(Class.java:303)
	net.sf.jasperreports.engine.design.JRDefaultCompiler.loadCalculator(JRDefaultCompiler.java:192)
	net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:370)
	net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:126)
	net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:118)
	net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:111)
	net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:291)
	net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:272)
	net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:185)
	br.nom.pedrobrasileiro.projetos.reriutaba.RelatorioServlet.doGet(RelatorioServlet.java:109)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

o que pode ser agora???

pbcjunior

depois de um murro no olho e um no estômago, consegui rodar o report, coloquei o caminho da minha servlet com o nome pdf para dar tudo certim, valeu pessoal, valeu alfafa :lol: :lol: :lol: :lol: :lol:

G

italomatos:
Cara,
coloquei esse teu exemplo pra rodar, e agora ta dando outro erro:

java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 604, local class serialVersionUID = 607

o que poderia ser isso?

valeu .

604 e o 607 é porque você está com conflito de versões ai… verifica se você não instalou algum plugin que esteja usando uma versão mais nova do jasperreport.

e quanto ao caminho, como você está usando uma servlet, eu acho que é só vc por o arquivo no claspath do teu projeto, e chamar ele diretamente pelo nome. Posso estar errado, me corrijam.
Abraço!

yoshitake

Comecei a mexer com iReport a 2 dias.
Estou com o seguinte problema
Creio que seja conflito de versões e não sei como arrumar.
Se algué puder me ajudar ficaria muito grato.

java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 10200, local class serialVersionUID = 608 at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:85) at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:235) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:294) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:339) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1254) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooter(JRVerticalFiller.java:640) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooters(JRVerticalFiller.java:608) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:240) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:125) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:489) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:76) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:163) at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:550) at java.lang.Thread.run(Unknown Source) NESTED BY : java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 10200, local class serialVersionUID = 608 at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:85) at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:235) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:294) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:339) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1254) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooter(JRVerticalFiller.java:640) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooters(JRVerticalFiller.java:608) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:240) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:125) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:489) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:76) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:163) at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:550) at java.lang.Thread.run(Unknown Source) NESTED BY : net.sf.jasperreports.engine.JRException: Error loading object from file : C:\projetos\odontoprev\portal\fontes\web\WEB-INF\relatorios\contrato_clausulas9.jasper at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:89) at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:235) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:294) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:339) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1254) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooter(JRVerticalFiller.java:640) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillGroupFooters(JRVerticalFiller.java:608) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:240) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:125) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:489) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:76) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:163) at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:550) at java.lang.Thread.run(Unknown Source) Caused by: java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 10200, local class serialVersionUID = 608 at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:85) … 15 more Print not filled. Try to use an EmptyDataSource…!

Desde já muito obrigado.

jorge.david

Pessoal estou com uma duvida.
Eu gerei um relatorio PDF na tela, porem eu preciso salvar este relatorio em disco. Segue o codigo abaixo:

public void doThis(int id) throws IOException, JRException, ClassNotFoundException, SQLException {
        // obtém o relatório compilado
        FacesContext context = FacesContext.getCurrentInstance();
        //ServletContext servletContext = (ServletContext) context.getExternalContext().getContext(); 
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        InputStream inputStream = getClass().getResourceAsStream(getPath() + "/detalheprodutos.jasper");
        Conexao con = new Conexao();
        Connection criaConexao = con.criaConexao();

        // preenche o mapa de parâmetros
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("id", id);

        // configura o content type do response
        response.setContentType("application/pdf");
        //JasperPrint jasperPrint = JasperFillManager.fillReport("C:\Users\JorgeDavid\Documents\NetBeansProjects\WebApplication2\web\images\detalheprodutos.jasper", parametros,criaConexao);  
        JasperPrint jasperPrint = JasperFillManager.fillReport(getPath() + "/detalheprodutos.jasper", parametros, criaConexao);

        // Exporta em PDF, escrevendo os dados no output stream do response.
        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream());
        
      
        
        // gera o relatório
        exporter.exportReport();
}

Alguem ja fez algo do tipo?

Criado 19 de maio de 2005
Ultima resposta 9 de jun. de 2013
Respostas 8
Participantes 6