PDF em java - Jasper e IReport ou simplismente FOP?

13 respostas
C

Bom eu nunca usei o IReport e o JasperReport, mas vi que pelo menos tem uma ferramenta visual para gerar Relatorios. Atualmente tive que usar o FOP e para relatórios complexos ele é um saco. Muito XSL e poucos recursos, alem de não ser nada intuitivo. E você precisa ficar gerando o pdf toda hora para ver como ficou. Eu não gostei, acho que deva existir uma maneira mais facil. Será preciso saber tudo de XSL-FO e java para gerar um relatório cheio de agrupamentos? Gostaria de saber de quem usa o IReport com o JasperReporte se isso é facilitado por ele ou se o FOP é realmente melhor. Não quero acreditar que sim mas se for, o jeito vai ser debulhar o XSL-FO até a alma porque relatório cabeludo no FOP é morte. E se alguem usa uma ferramenta visual para o FOP por favor passa o site porque eu procurei feito loco e só achei essa que é paga e é um lixo.

http://link.altova.com/products_xsl.html

Valew!

13 Respostas

H

Blz Velinho??

Cara eu passei por problema semelhante alguns meses atrás, com um agravante, o sistema teria que permitir o usuário configurar o Layout…
Junto com uma equipe de desenvolvimento constrimos o configurador de layout, ferramenta que utiliza o frameWork JGraph e o FOP…
Amigo como foi desenvolvido dentro da empresa (Jabur Informatica) não posso lhe enviar a ferramenta em si… mas posso lhe dar dicas, se vc quiser é claro…

BEm Primeira Dica é… da uma olhada no JGraph, segundo lembre se que vc pode trabalhar com XSLT, XPath junto com XSL-FO

Qualquer coisa me envie msg…
e boa sorte…

A

Legal esse esquema hein kra…

eu vou precisar montar algo parecido aki na empresa logo, logo.
A app q vc montou era desktop?

O usuário pode tipo, clicar e arrastar os campos q ele quer no relatório, agrupar, sumarizar etc ??

Com relação a questão do caitiff, eu já trabalhei com FOP algum tempo atrás, até escrevi um artigo a respeito, mas depois que comecei a trabalhar com Ireport+Jasper, nunca mais usei FOP. Você monta tudo visualmente no Ireport, eh mto mais fácil de trabalhar.

Faça um teste você mesmo e depois tire sua conclusão.

[]s

H

E ai velho… blz ???
É para desktop sim… nos montamos um mecanismo para o usuario clicar e arrastar os elementos que ele queria no layout…
Pois o objetivo da ferramenta é que o usuario , monte o layout…

Já que vc tera q montar algo parecido reforço a sugestão de vc dar uma olhada no jgraph
Abraços…

[/img]

H

A velho eu ja ia esquecendo…
No q vc precisar de ajuda pode mandar msg… ow e-mail para mim… so não envio a ferramenta nem codigos dela, por ela ter sido desenvolvida em ambiente comercial…
Abraços…
E vamos trocar ideia sobre isto…

A

legal kra, valeu a dica.

vou dar uma olhada neste JGraph, mas acho q vai demorar algumas semanas ainda pra começar esta parte do projeto.

valew msm, e qlqr coisa eu te mando um email.

flw

C

Bom, vou ressucitar o topico pra fechar com a minha opnião e talvez ajudar quem ta na duvida de qual usar. Testei o JasperReport com o IReport.
Primeira impressão muito boa. Baixando o IReport ele ja vem com o JasperReport. No site do IReport tem videos mostrar como fazer, gostei muito. Li um pouco da documentação e consegui desenvolver um relatorio com 4 agrupamentos em 2 horas enquanto fiquei 3 dias no FOP. Bom, lendo a documentaçao do JasperReport descobri que ele aceita um Bean como Fonte de dados. Basta implementar uma interface que tem 2 métodos (getValue: Object e next: boolean). Simples simples. Ai tive uma idéia. Hoje na empresa usamos o MVC. Struts para cuidar dos Actions. Um framework desenvolvido la para controlar as chamadas aos BusinessObjects e DAOs. Dai pensei, poxa meu BusinessObjects devolve um List de VO quando faço uma consulta. E se eu implementar os 2 métodos da interface para retornar os valores dos VOs? Não precisaria refazer o select e nem implementar código afinal ja estão prontos. A unica coisa que teria que fazer é, inves de passar a lista de VO para o JSP passar para o JasperReport. Dai tentei. Hoje eu consegui fazer os PDFs desenhados no IReport usarem os mesmos métodos usados nos BusineesObject para gerar as listas para os usuários. Muito feliz e satisfeito agora sei bem como gerar relatorios no java. IReport + JasperReport é sem duvida a melhor receita de todas. O FOP está anos luz dessa flexibilidade e reusabilidade. Para fazer esse simples conjunto que montei você teria que implementar muito codigo, parametrizar todas as regiões do relatorio na mão, enquanto no JasperReport você tem 3 regiões basicas e cada vez que cria um agrupamento esse agrupamento novo tambem ganha essas tres regiões e pronto. E Graças as possibilidades que ele te da, ele deixa isso muito facil, a claro e você desenha o relatorio de uma forma muito intuitiva sem muitas complicações no IReport apenas arrastando e soltando. Resumindo galera, esquece o FOP. Muito conceito e pouca pratica. A dupla IReport + JasPerReport é muito melhor.

Dica no IReport: Use o Assistente de Relatorio. Ele pede uma query e te mostra alguns modeloes de relatorios ja prontos. Vc escolhe as colunas e ele gera o relatorio sozinho. Depois é so mudar o valor dos labels e acertar os campos na tela. Muiiiiiiiiito simples.

Um Abraços a todos e obrigado pelas dicas.

Augusto_Cesar

AJUDA EU :slight_smile:

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 <a href="http://java.io">java.io</a>.<em>;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.servlet.</em>;

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

J

Mostra seu .jsp/jsf

provavelmente o problema é que vc usa a4j: ao invés de command button normal

Augusto_Cesar

Esse é o index.jsp que eu uso para chamar a aplicação que gera o relatorio.

<%@page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>

Chamando seu relatório Clique aqui para visualizar seu relatório
Augusto_Cesar

mas que a4j é esse que você está se referindo? é algum jar ou coisa do tipo? :roll:

Augusto_Cesar

jMotoca,

Obrigado pela ajuda. Atentei para fazer uma coisa que costuma resolver e resolveu. Exclui todas as libs que estava no projeto e importei simplesmente todas as libs que estava dentro do diretorio de libs do Ireport e resolveu.

Valeu!!! :smiley:

PadrE

Para dar minha opinião tb…

Voto pra uso do iReport + Jasper

Além de poder usar querys SQL no iReport vc tema intregração com Beans (post do nosso amigo caitiff-jVampirePJ) e tb pode passar XML como parâmetro para o iReport.

E quem usa Netbeans vai preferir mais, já que as ferramentas estão integradas.

Fui!

kemperacc

Voce ta dando o setcontenttype depois de iniciar a gravacao para o cliente:

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

response.setContentType("application/pdf");

tente inverter:

response.setContentType("application/pdf"); 

JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, map,connection);
Criado 4 de abril de 2005
Ultima resposta 10 de abr. de 2010
Respostas 13
Participantes 7