Olá, boa tarde. Desenvolvi um sistema web e agora estou precisando partir para a emissão de relatórios. O que utilizar para esta parte?
Emissão de relatórios em sistema web
71 Respostas
Rapaz tem muito o que ser feit não, é web, imprime o que tu quer na tela e põe um botão para poder imprimir via javascript. valeu
afffff…
amigo
de uma olhadinha no jasper e ireports
abrassss
Usei IReport e JasperReports
Cria o arquivo no IReport. Executa via Java com JasperReports.
o/
Bom diaaa!
Pra gerar relatório faz no Ireport, qualquer coisa só falar, eu coloco aqui…
Oi pessoal, aproveitando o tópico (rsrs)
Bom eu tenho já os relatorios no IReport, com conexão no banco e tal, e agora como faço para colocar na minha aplicação web???
Podem me ajudar???
tks 
Vc usa tomcat ou JBoss?
Paezani isso faz diferença ?
eve_bsi vc ja consegue gerar os pdf’s ?
abrasssss
Em termos de uso não…é que eu trabalho com o Tomcat…ficaria mais fácil de ajudar…no Jboss não sei se muda alguma configuração.
Bom, eu na minha Servlet criei um botão ‘Relatorio’ assim:
PS: Coloque seu projeto no mesmo caminho que vc especificar no código…
(action.equalsIgnoreCase("Relatorio"))
{
//ServletContext context = getServletContext();
byte[] bytes = null;
try {
//JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(context.getRealPath("/relatorio/Relatorio_Grupo.jasper"));
JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject("C:\\Documents and Settings\\Celia\\Meus documentos\\testandoMONO\\ProjetoServletTFG\\WebContent\\Relatorios\\RelatorioFuncionario.jasper");
Map<String, Object> params = new HashMap<String, Object>();
//params.put("DATA", dataServidor);
//params.put("MES_ANO_INI", dataInicial);
//params.put("MES_ANO_FIM", dataFinal);
//params.put("OBSERVACOES", "NÃO CONSTA AS DESPESAS GERADAS COM MATERIAIS DE ORTESE E PROTESE");
//bytes = JasperRunManager.runReportToPdf(relatorioJasper, params, ds);
bytes = JasperRunManager.runReportToPdf(relatorioJasper, params, con.getConnection());
}
catch (JRException e)
{
e.printStackTrace();
}
if (bytes != null && bytes.length > 0)
{
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
//gerou = true;
}
}
}
Então ainda não (eu acho), simplesmente eu fiz o layout do relatorio no IReport, mas com conexao no banco…
Eu não conheço essa ferramenta Ireport muito bem, ela é novidade para mim…rs
Não coloquei na minha aplicação ainda… Eu gostaria de saber como q eu coloco isso na aplicação, me falaram para gerar tipo um jar…
TomCat
Bom, eu na minha Servlet criei um botão ‘Relatorio’ assim:
PS: Coloque seu projeto no mesmo caminho que vc especificar no código…
JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject("C:\\Documents and Settings\\Celia\\Meus documentos\\testandoMONO\\ProjetoServletTFG\\WebContent\\Relatorios\\RelatorioFuncionario.jasper");
Uhm… eu coloco meus arquivos .jasper, na minha pasta webcontent???
Galera, como eu faria caso eu quisesse imprimir erro relatorio que ta em pdf na impressora do cliente?
Tenho uma aplicação em JSF com um caso semelhante e preciso jogar direto na impressora do cidadão, sem que fosse necessário que ele baixasse o arquivo pdf, abrisse e enfim imprimisse.
Sei que tem como imprimir por javascript, mas como mando arquivos pdf pro js imprimir? (talvez eu esteja dizendo besteira)
Lembrando de novo que to gerando esse relatório em pdf pelo jasperreports no meu ManagedBean do JSF.
Alguma sugestão?
eve_bsi vc ja consegue gerar os pdf’s ?
Então ainda não (eu acho), simplesmente eu fiz o layout do relatorio no IReport, mas com conexao no banco…
Eu não conheço essa ferramenta Ireport muito bem, ela é novidade para mim…rs
Não coloquei na minha aplicação ainda… Eu gostaria de saber como q eu coloco isso na aplicação, me falaram para gerar tipo um jar…
Na verdade o iReport serve apenas pra gerar jrxm, arquivo xml que contém as informações do layout do seu relatório.
Na sua aplicação você deve usar esse jrxml atravéz do jasperreports.
Ou seja, iReport e jasperreports devem ser usadas em conjunto.
É que montar esse xml do layout na mão seria desumano.
Tem material a rodo disso na internet, sugiro uma pesquisada.
Tchelo vc pode criar um atalho da internet qe acesse o servlet ou jsp que gere o relatório em pdf.Também deve ter exemplos de como imprimir sem precisar visualizar o pdf em java… Vc pode fazer esta rotina ao cliacar neste atalho por exemplo…
Paezani, não entendi muito bem o que quis dizer, será que poderia ser um pouco mais específico?
Me desculpe =/
No caso uso JSF, portando não escrevo servlets diretamente.
Meus relatórios são montados no ManagedBean (através de chamadas a métodos de outras camadas, mas isso não vem ao caso) gostaria de imprimi-lo no cliente sem que ele tivesse que baixar o pdf.
Será que tem jeito?
Bom Tchello num trabalhei com JSF… Eu trabalho com servlets, JSP… Os relatórios eu monto com Ireport/Jasper. Servidor: tomcat
Sim tem solução!
O que eu faço, simplificadamente, é mais ou menos assim: tenho um jsp que ao clicar no botão( ou link ou em uma imagem) ela chama uma sevlet que passa parametros p/ o relatório, se necessário , e este relatório é visualizado em pdf no browser, sem precisar baixar o pdf!
Pode ser visualizado tanto no servidor , como em máquinas clientes… Entendeu?
Se precisar de ajuda é só falar…
Sim, eu entendi perfeitamente.
O que eu perguntei é como se faz para visualizar o pdf no navegador, sem fazer o download. Essa é a minha dúvida.
Será que poderia me ajudar?
Muito obrigado!! =D
Tchello amigo pra visualizar o pdf no navegador vc tera de setar o content tupe como application/pdf e imprimir os bytes do seu pdf com algum ServletOutputStream.
realmente vc vai ter que apontar o link para um servlet, entao para nao sair da navegaçao vc pode setar o target do link como _blank
abrassssssssssssssssss
Como o nosso colega renanreismartins disse, e eu uso tbém seria desta forma:
bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conexao.MinhaConexao);
// envia o relatório em formato PDF para o browser
res.setContentType("application/pdf");
res.setContentLength(bytes.length);
ServletOutputStream ouputStream = res.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
Como o nosso colega renanreismartins disse, e eu uso tbém seria desta forma:bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conexao.MinhaConexao); // envia o relatório em formato PDF para o browser res.setContentType("application/pdf"); res.setContentLength(bytes.length); ServletOutputStream ouputStream = res.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close();
Então, mas se eu fizer dessa forma (com mais algumas particularidades do JSF) ele vai mandar salvar no disco do cliente.
Isso é por causa do meu plugin do PDF? To no ubuntu e com ctz não tenho aquele plugin da adobe.
Abraços.
Tchello testa numa maquina com o adobe instalado. pq realmente eh necessario o plugin
Bom, eu na minha Servlet criei um botão 'Relatorio' assim: PS: Coloque seu projeto no mesmo caminho que vc especificar no código...Oi pessoal, voltei... Então fiz o codigo para gerar o relatorio... fiz q nem a celia fernandes colocou no dela... fiz a mesma coisa no meu servlet... e nao deu certo... alguem pode me auxiliar???
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
byte[] bytes = null;
try{
JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject("F:\\PortalCorporativoWebTCC\\PortalCorporativoWebTCC\\WebContent\\Relatorios\\geral.jasper");
Map<String, Object> params = new HashMap<String, Object>();
//params.putAll(arg0);
bytes = JasperRunManager.runReportToPdf(relatorioJasper, params);
}catch (JRException e){
e.printStackTrace();
}
if(bytes != null && bytes.length > 0){
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outPutStream = response.getOutputStream();
outPutStream.write(bytes, 0, bytes.length);
outPutStream.flush();
outPutStream.close();
}
}
Na hora que eu clico no botao relatorio na minha tela (JSP), chama essa servlet... e nisso da um erro... :?
javax.servlet.ServletException: Error instantiating servlet class br.santacruz.tcc.servlet.RelatorioGeralServlet
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Unknown Source)
Não faço menor ideia do q seja...
O que tem no construtor dessa classe?
O que tem no construtor dessa classe?
UHm... nao tenho construtor nessa classe... =/
Continuando o erro q da... tem algo com construtor no erro mesmo... =/
Como arrumo isso??? :idea:
java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRException
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
java.lang.Class.getConstructor0(Unknown Source)
java.lang.Class.newInstance0(Unknown Source)
java.lang.Class.newInstance(Unknown Source)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Unknown Source)
O que tem no construtor dessa classe?
Coloquei o construtor... mas continua dando o mesmo erro
public RelatorioGeralServlet() {
}
Eve, a aplicação não consegue encontrar alguma classe que está sendo usada.
Quais jars voc adicionou a sua aplicação?
Faça uma experiência: coloque na lib do seu jboss/tomcat os jars da sua aplicação, principalmente os do JasperReports, que aparentemente são os que estão faltando.
oi meu anjo… testa esse cara aqui:
//import br.gov.treap.util.Conexao;
import java.io.IOException;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;
/* Primeira parte */
public class Relatorio {
private Connection con = null;
private String driver = "oracle.jdbc.driver.OracleDriver";
private String endereco = "jdbc:oracle:thin:@host:1521:sid";
private String user = "user";
private String pass = "senha";
private ResultSet rs = null;
private String valores[] = new String[10];
// private int chamada = 1;
// Localizar pasta que contém os relatórios:
// private String dir = System.getProperty("user.dir") + "/web/";
private String dir = "Aqui o diretorio do seu projeto ou utilizar a linha anterior";
// private StringReader stream;
/*Segunda parte */
public void GeraRelatorio(String sql, String relatorio) {
/* Efetua a conexao a base de dados e coleta os valores da base de dados armazenando-os
em um array para ser futuramente utilizado */
try {
if (con == null) {
Class.forName(driver);
con = DriverManager.getConnection(endereco, user, pass);
Statement statement = con.createStatement();
rs = statement.executeQuery(sql);
HashMap teste = new HashMap();
while (rs.next()) {
//for até o numero de campos da tabela
for (int i = 1; i < 10; i++) {
valores[i] = rs.getString(i);
}
}
}
} catch (Exception e) {
System.err.println("Problemas apresentados na operacao de conexao");
e.printStackTrace();
}
/* Inicio do bloco que ira gerar nossos relatorios e 3ª parte */
try {
//String array[] = valores;
JasperDesign design = JasperManager.loadXmlDesign(dir + "relatorios/comprovante_rendimentos1.jrxml");
JasperReport jr = JasperManager.compileReport(design);
HashMap parameters = new HashMap();
parameters.put("PAR_PEDID", 1);
//parameters.put("PARAMETRO_2", array[2]);
//parameters.put("PARAMETRO_3", array[5]);
//parameters.put("PARAMETRO_4", array[4]);
//parameters.put("PARAMETRO_5",array[9]);
JasperPrint impressao = JasperManager.fillReport(jr, parameters, con);
JasperViewer jrviewer = new JasperViewer(impressao, false);
jrviewer.show();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
aqui ele funciona q é uma beleza!
abraço
oi meu anjo… testa esse cara aqui://import br.gov.treap.util.Conexao; import java.io.IOException; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.HashMap; import net.sf.jasperreports.engine.JasperManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.view.JasperViewer; /* Primeira parte */ public class Relatorio { private Connection con = null; private String driver = "oracle.jdbc.driver.OracleDriver"; private String endereco = "jdbc:oracle:thin:@host:1521:sid"; private String user = "user"; private String pass = "senha"; private ResultSet rs = null; private String valores[] = new String[10]; // private int chamada = 1;
UHm vou tentar… só me diga mais uma coisa…rs
Pra isso eu crio outra classe, e faço esse código? e na minha servlet chamo esse metodo???
ou esse código eu coloco na servlet…
ja tinha visto um exemplo parecido com esse em outro site, mas nao tentei, por essa duvida q tenho…
oi meu anjo… testa esse cara aqui://import br.gov.treap.util.Conexao; import java.io.IOException; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.HashMap; import net.sf.jasperreports.engine.JasperManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.view.JasperViewer; /* Primeira parte */ public class Relatorio { private Connection con = null; private String driver = "oracle.jdbc.driver.OracleDriver"; private String endereco = "jdbc:oracle:thin:@host:1521:sid"; private String user = "user"; private String pass = "senha"; private ResultSet rs = null; private String valores[] = new String[10]; // private int chamada = 1; // Localizar pasta que contém os relatórios: // private String dir = System.getProperty("user.dir") + "/web/"; private String dir = "Aqui o diretorio do seu projeto ou utilizar a linha anterior"; // private StringReader stream; /*Segunda parte */ public void GeraRelatorio(String sql, String relatorio) { /* Efetua a conexao a base de dados e coleta os valores da base de dados armazenando-os em um array para ser futuramente utilizado */ try { if (con == null) { Class.forName(driver); con = DriverManager.getConnection(endereco, user, pass); Statement statement = con.createStatement(); rs = statement.executeQuery(sql); HashMap teste = new HashMap(); while (rs.next()) { //for até o numero de campos da tabela for (int i = 1; i < 10; i++) { valores[i] = rs.getString(i); } } } } catch (Exception e) { System.err.println("Problemas apresentados na operacao de conexao"); e.printStackTrace(); } /* Inicio do bloco que ira gerar nossos relatorios e 3ª parte */ try { //String array[] = valores; JasperDesign design = JasperManager.loadXmlDesign(dir + "relatorios/comprovante_rendimentos1.jrxml"); JasperReport jr = JasperManager.compileReport(design); HashMap parameters = new HashMap(); parameters.put("PAR_PEDID", 1); //parameters.put("PARAMETRO_2", array[2]); //parameters.put("PARAMETRO_3", array[5]); //parameters.put("PARAMETRO_4", array[4]); //parameters.put("PARAMETRO_5",array[9]); JasperPrint impressao = JasperManager.fillReport(jr, parameters, con); JasperViewer jrviewer = new JasperViewer(impressao, false); jrviewer.show(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }aqui ele funciona q é uma beleza!
abraço
Cara, então, estamos em java para web(jsp, servlets, jsf…), creio que isso não vá funcionar nesse contexto, correto?
Ola,
o erro:
java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRException
significa que essa classe não foi encontrada. Por que? Porque ela faz parte do jasper reports.Então vc precisa colocar os jars necessarios no CLASSPATH do seu projeto.
[]´s
de onde vc tirou essa conclusão q isso não funciona para web?
vc só pode ta de brincadeira né amigo? 
ou vc não sabe chamar um metodo de classe em um servlet?
caso não saiba eu posto aqui o servlet q completa essa classe.
de onde vc tirou essa conclusão q isso não funciona para web?
vc só pode ta de brincadeira né amigo? 
Não, não estou de brincadeira, mas pelo que pude observar esse componente do JR exibe uma GUI e como os managedbean/servlets são executados server-side…
Posso estar equivocado, por favor me corrija caso isso se afirme, seria até bom já que resolveria de vez meu problema.
Você o usa com servlets?
OK… posso usar isso na servlet???
claro q sim!!!
você cria a chamada em sua servlet. observem q o método GeraRelatorio vem com void, por tanto podendo ser chamado em um servlet
segue exemplo:
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLData;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Pedro Junior
* @creator in 26/10/2009
*/
public class chamarMetodoRelatorio extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// essa parte seria o comando para chamar o quiser na servlet
// estou usando o cmd=relat para chamar essa parte do servlet
String cmd = request.getParameter("cmd");
//caso ele esteja nulo vem o principal. pode ignorar isso se preferir retirando essa pasrte
if(cmd == null)
cmd = "principal";
// aqui fica o nome do relatorio chamado
String relatorio = "comprovante_rendimentos1";//request.getParameter("relat")
// a instrução selct para quem utiliza relatório dinamico
String sql = "select * from chamado";
// aqui segue a chamada do metodo da classe Relatorio
try {
if (cmd.equalsIgnoreCase("relato")){
// instâncio a classe
Relatorio relatorios = new Relatorio();
//chamo o metodo
relatorios.GeraRelatorio(sql, relatorio);
}
}catch(Exception e){
e.printStackTrace();
}
}
pronto moçada, agora pode pagar o lanche. rsrsrsrs
já ia esquecendo…
vocês já devem saber mas posto assim mesmo.
deve configurar o web.xml para chamar o servlet:
<servlet>
<servlet-name>chamarMetodoRelatorio</servlet-name>
<servlet-class>br.gov.treap.relatorios.chamarMetodoRelatorio</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>chamarMetodoRelatorio</servlet-name>
<url-pattern>/chamarMetodoRelatorio.do</url-pattern>
</servlet-mapping>
ai vcs chamam o cara assim: http://meusite.com.br/chamarMetodoRelatorio.do?cmd=relat
agora sim vcs podem pagar a pizza. desculpe a onda mas é costume aqui no trampo o cara pagar um lanche para o colega q ajuda a resolver galhos.
abraço moçada
Cara, to falando que não da.
O JasperView tenta abrir uma interface gráfica que ocorre no lado do servidor, quando executei aqui deu o seguinte erro:
Erro ao enviar impressao: No X11 DISPLAY variable was set, but this program performed an operation which requires it.
Acompanhando com o depurador nota-se que uma HeadlessException é lançada com essa mensagem acima.
Lembrando que estou usando JSF, portando o método é executado num ManagedBean e a aplicação está num JBoss instalado num ubuntu server (sem X11, o que justifica a exception acima, por que o ManagedBean é processado no lado do servidor).
Entendeu onde eu quero chegar?
Gostaria muito de puder executar um JasperView pela web, tem mais alguma sugestão?
Eu sempre crio um diretório dentro da pasta WEB e ma referencio a ele através do getRealPath, pois nem sembre é sabido onde o sistema e qual ambiente o sistema estará implantado.
String relatorio = request.getRealPath("WEB/jasper/ModeloGuia.jasper");
try {
java.util.Map parametro = new java.util.HashMap();
parametro.put("idemitida", idguia);
JasperReport jr = (JasperReport) JRLoader.loadObject(relatorio);
byte buffer[] = JasperRunManager.runReportToPdf(jr, parametro, banco.ConnectionFactory.getConnection());
response.setContentType("application/pdf");
response.setContentLength(buffer.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(buffer, 0, buffer.length);
outputStream.flush();
outputStream.close();
} catch (JRException ex) {
Logger.getLogger(bbIndex.class.getName()).log(Level.SEVERE, null, ex);
}
Eu sempre crio um diretório dentro da pasta WEB e ma referencio a ele através do getRealPath, pois nem sembre é sabido onde o sistema e qual ambiente o sistema estará implantado.
String relatorio = request.getRealPath("WEB/jasper/ModeloGuia.jasper"); try { java.util.Map parametro = new java.util.HashMap(); parametro.put("idemitida", idguia); JasperReport jr = (JasperReport) JRLoader.loadObject(relatorio); byte buffer[] = JasperRunManager.runReportToPdf(jr, parametro, banco.ConnectionFactory.getConnection()); response.setContentType("application/pdf"); response.setContentLength(buffer.length); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(buffer, 0, buffer.length); outputStream.flush(); outputStream.close(); } catch (JRException ex) { Logger.getLogger(bbIndex.class.getName()).log(Level.SEVERE, null, ex); }
Já uso esse recurso do realPath.
Tenho um código muito semelhante a esse e o mais estranho e que quando obtenho o ServletOutPutStream e dou um “write” com meu vetor de bytes (devidamente populado e válido) é lançado um NPE.
O ServletOutputStream não é nulo, mas fazendo um debug pude notar que as streams que ele contém são nulas.
Isso que me deixa mais intrigado!
Eu sempre crio um diretório dentro da pasta WEB e ma referencio a ele através do getRealPath, pois nem sembre é sabido onde o sistema e qual ambiente o sistema estará implantado.
String relatorio = request.getRealPath("WEB/jasper/ModeloGuia.jasper"); try { java.util.Map parametro = new java.util.HashMap(); parametro.put("idemitida", idguia); JasperReport jr = (JasperReport) JRLoader.loadObject(relatorio); byte buffer[] = JasperRunManager.runReportToPdf(jr, parametro, banco.ConnectionFactory.getConnection()); response.setContentType("application/pdf"); response.setContentLength(buffer.length); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(buffer, 0, buffer.length); outputStream.flush(); outputStream.close(); } catch (JRException ex) { Logger.getLogger(bbIndex.class.getName()).log(Level.SEVERE, null, ex); }
Olha só, parou de dar null sabe-se la por que motivo.
Agora ele não abre nem em uma outra aba e nem pede pra baixar o pdf, simplesmente exibe o seguinte:
E mais uma centena de linhas assim.
Saberia me dizer por que?
Obrigado!
Vamos por parte,
Vou fazer uma pergunta.
Qual a versão do jasperreport e ireport q vc ta usando se é q usa?
feita a pergunta vou esclarecer o erro de “linhas assim”.
seguinte: estas linhas são do arquivo pdf compilado e as vezes ele aparece assim por seu navegador não ter conseguido executalo em um programa leitor de pdf. compreende?
ok… supondo que seu sistema ta chamando o arquivo pdf normalmente da uma olhada nesta parte do leitor de pdf.
ps.: É nesse ponto que entra em cena o conceito de Servlet, que é uma classe especial JAVA que herda características da classe HttpServlet, permitindo que ela seja capaz de tratar requisições. Ao fazer isso, ela pode redefinir alguns métodos, chamados de serviço, que irão fazer a lógica necessária.
Os dois métodos mais utilizados nessa abordagem são o doGET (para tratar requisições que chegarem do tipo GET) e o doPOST (para tratar requisições que chegarem do tipo POST). Dentro desses métodos bancos de dados podem ser acessados, objetos criados, lógica inserida, enfim, qualquer tipo de lógica que seja válida num programa JAVA. Um diferencial por se tratar de aplicações web está na possibilidade de escrever código HTML que será enviado para a saída padrão, que normalmente é um navegador (como o Firefox) e será exibido da forma apropriada, como uma página da Internet.
Por tanto, podendo ser a interface entre o cliente e o servidor.
uma aula servlet de graça!
Vamos por parte,
Vou fazer uma pergunta.Qual a versão do jasperreport e ireport q vc ta usando se é q usa?
Sim, uso JasperReports na versão 3.1.4, a princípio sem chances de usar outra (versões de bibliotecas também costumam ser controlados por aqui).
Quanto a isso eu entendi perfeitamente.
Já foi um parto instalar o AdobeReader no ubuntu 7.10, versão do servidor que ta rodando esse meu client remoto aqui (que infelizmente também não pode ser mudada a princípio, pelos mesmos motivos citados acima).
Também tenho instalado o plugin do adobereader no firefox corretamente. Ambos funcionando muito bem, obrigado.
O que eu quero, pra ser bem preciso, é que ele abra em outra aba (ou em outra janela, dependendo da configuração do navegador) o pdf e caso não haja plugin instalado que seja exigido o seu download. Entende?
Sei o que é um servlet.
A questão é que ele é executado no lado do servidor, por isso que não posso mandar ele abrir interfaces gráficas pelo Servlet, pois esse [color=darkred]será executado no servidor[/color].
Eve, conseguiu executar o JasperView no servlet com sucesso?
Meu jovem,
Segue um trecho do código comentado para vc entender melhor
// responsável por ler o arquivo jrxml "DO LADO DO SERVIDOR"
JasperDesign design = JasperManager.loadXmlDesign(dir + "relatorios/comprovante_rendimentos1.jrxml");
// compila o arquivo anterior para o formato jasper "DO LADO DO SERVIDOR"
JasperReport jr = JasperManager.compileReport(design);
// Isso aqui é obrigatório vc quando trabalha com geração de pdf com jasper vc tera sempre q passar um parametro para o jasper mesmo sendo nulo
HashMap parameters = new HashMap();
parameters.put("PAR_PEDID", 1);
// aqui ele imprime o arquivo jasper em pdf "NO LADO DO SERVIDOR"
JasperPrint impressao = JasperManager.fillReport(jr, parameters, con);
// aqui ele mostra o arquivo já em pdf na tela do seu browser, vindo "DO LADO DO SERVIDOR", ou seja ele funciona como um link.
JasperViewer jrviewer = new JasperViewer(impressao, false);
// aqui ele de fato chama o cara da forma q vc quiser, seja parent, blank ou self
jrviewer.show();
espero q ajude, saiba que tudo isso ocorre no lado do servidor e mesmo assim ele funciona.
sugiro que vc estude bem os processo assima para entender como elas são efetivamente ocorridos.
o pior é q aqui eu uso em todos os meus sistemas e roda perfeitamente.
o servlet trabalha do lado do servidor mas vc tanto pode solicitar request quanto response, get ou post.
outra sugestão para vc q trabalha com jsf é um livro q ensina como criar relatório e outra coisas bem legai com jsf, segue o nome do livro e autor:
Livro: Java na Web com JSF (Spring, Hibernate e Netbeans)
Autor: Yuri Marx P. Gomes
muito bom recomendo.
Meu filho, [color=darkred]minha dúvida não é como gerar um relatório,[/color] disso tudo eu seii!!
O problema é exibir o relatório montado no contexto web.
A estrategia que adotei é converte-lo para jpg “concatenando” as páginas num BufferedImage dinamicamente e exibi-la num MediaOutput.
Isso funciona muito bem, mas estou tendo problemas quando quero imprimi-lo, daí a alternativa de abri-lo no navegador diretamente como pdf.
A propósito, o método show do JasperViewer é deprecated, estude a possibilidade de substitui-lo pelo setVisible(true);
Também sugiro que estude a possibilidade de tratar com os relatórios já compilados (.jasper), pra poder pular essa parte na geração dos relatórios que causa um overhead desnecessário.
Ignorando esses passos todos, por que quando eu uso o JasperViewer no meu ManagedBean obtenho aquela exception do X11 citada acima?
Tchello alguns usuarios do guj deveriam fazer curso de interpretacao de textos rsrs
agora, velho, existem coisas que nao tem jeito, para abrir ele no navegador vc PRECISA do plugin ou entao deixa o usuario fazer download, que mal tem isso?
abrasssssssss
Tchelloagora, velho, existem coisas que nao tem jeito, para abrir ele no navegador vc PRECISA do plugin ou entao deixa o usuario fazer download, que mal tem isso?
abrasssssssss
Exatamente, nenhum problema, é exatamente o que quero.
Acontece que ele ta exibindo aqueles caracteres zuados.
Tenho o plugin instalado aqui sim, tanto que de outros sites já abri pdf’s nesse firefoca ontem mesmo.
É exatamente o que quero: se existir o plugin abrir o pdf em outra aba, se não existir mandar o arquivo pdf pro usuário salvar.
Teria alguma dica/sugestão/milagre/macumba ? uAuhaHUauhUHAuhA
Abraços!
Ok Tchello
não vamos discutir isso aqui pois, sabemos q não vai ajudar.
seu problema não ta diretamente na aplicação e sim no Java e SO q vc usa
qual a versão do java q vc usa no ubuntu?
deve ser algum problema de versão do seu Java.
tenta fazer isso no console.
java -Djava.awt.headless=true
depois restarta sua aplicação ou melhor restarta o tomcat, Jboss ou seja lá o q vc use.
qualquer coisa avisa que temos mais soluções para esse problema.
não entendi a sua meu amigo!!! será q é a tal “interpretacao de textos” q vc fala?
Tchello aqui eu faço um pouco diferente, ao inves de chamar o JasperRunManager.runReportToPdf, crio um JasperPrint. isso eh um metodo ejb.
JasperPrint print = JasperFillManager.fillReport(getClass().getResourceAsStream(("/relatorio/jasper/chamado.jasper")), parametros, ds);
onde parameteos é o map e ds é uma implementação de JRDataSource… bom mas enfim crio um JRPdfExporter.
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, outputStream);
exporter.setParameter(JRPdfExporterParameter.METADATA_AUTHOR, "OSWeb");
exporter.exportReport();
bom entao retorno meu ByteArrayOutputStream. No meu servlet recebo ele e entao imprimo:
response.setContentType("application/pdf");
ByteArrayOutputStream ou = gerenciarChamado.imprimir(chamado);
ServletOutputStream outputStream = response.getOutputStream();
ou.writeTo(outputStream);
outputStream.flush();
outputStream.close();
espero que ajude
abrassss
Eve, conseguiu executar o JasperView no servlet com sucesso?
Bom, eu fiz como o phmjunior colocou aqui... porém não funcionou, deu um erro, mas pelo q pude ver no erro, nao é por conta do JasperView... =/
Erro:java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JasperManager
br.santacruz.tcc.control.RelatorioGeralControl.geraRelatorio(RelatorioGeralControl.java:49)
br.santacruz.tcc.servlet.RelatorioGeralServlet.doPost(RelatorioGeralServlet.java:52)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
public class RelatorioGeralControl {
private Connection connect = null;
private String driver = "com.mysql.jdbc.Driver";
private String host = "//localhost:3306";
private String base = "snr";
private String user = "root";
private String senha = "";
private ResultSet rs = null;
private String valores[] = new String[10];
//local relatorios
//private String dir1 = System.getProperty("user.dir") + "/web/";
private String dir = "F:\\PortalCorporativoWebTCC\\PortalCorporativoWebTCC\\WebContent\\Relatorios";
public void geraRelatorio(String sql, String relatorio){
try{
if(connect == null){
Class.forName(driver);
connect = DriverManager.getConnection("jdbc:mysql:" + host + "/" + base, user, senha);
Statement stmt = connect.createStatement();
rs = stmt.executeQuery(sql.toString());
while(rs.next()){
for(int i = 1; i < 10; i++){
valores[i] = rs.getString(i);
}
}
}
}catch (Exception e){
System.err.println("Problema na conexão");
e.printStackTrace();
}
try{
JasperDesign design = JasperManager.loadXmlDesign(dir + "Relatorios/geral.jasper");
JasperReport jr = JasperManager.compileReport(design);
HashMap parameters = new HashMap();
parameters.put("PAR_PEDID", 1);
//parameters.put("PARAMETRO_2", array(2));
JasperPrint impressao = JasperManager.fillReport(jr, parameters, connect);
JasperViewer jrviewer = new JasperViewer(impressao, false);
jrviewer.show();
}catch(Exception e){
e.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String cmd = request.getParameter("cmd");
if(cmd == null){
cmd = "principal";
}
String relatorio = "principal";
String sql = "Select * from desp_rateio";
try{
if(cmd.equalsIgnoreCase(relatorio)){
RelatorioGeralControl relatorioGeralControl = new RelatorioGeralControl();
relatorioGeralControl.geraRelatorio(sql, relatorio);
}
}catch(Exception e){
e.printStackTrace();
}
}
:?: :!: :?: :!: :?: :!:
java -Djava.awt.headless=truedepois restarta sua aplicação ou melhor restarta o tomcat, Jboss ou seja lá o q vc use.
qualquer coisa avisa que temos mais soluções para esse problema.
Ainda não foi, ele ta dando “null”.
O relatório é gerado normalmente, adicionei o argumento sugerido e parou de daro o erro do X11.
Não é um NPE, a exception ainda é uma HeadlessException, contendo a menssagem “null”.
Renan, como estou usando JSF o ServletOutputStream eu obtenho atraves do FacesContext, mas esse (o ServletOutputStream) não possui o método writeTo, estranho não?
Abraços.
eve_bsi,
no seu caso é necessário você ter essa lib JasperReport no classpath da sua aplicação.
segue link para baixar a lib
http://webscripts.softpedia.com/script/Health/JasperReports-31138.html
Tchello,
deixa eu ver se entendi direito;
você digitou o comando e parou de dar o erro x11, e seus relatorios são gerados normalmente? só q o erro HeadlessException continua só q vem null certo?
ele gera o relatório antes ou depois do erro?
Mas eu já tenho essa lib…
faz o seguinte procure no classpath do java do tomcat ou jboss e verifica se ela existe porai.
caso não tire ela do classpath de sua aplicação e cole direto nos classpath q informei assima.
vc tem telefone?
(brincadeira)
eve_bsi,
no seu caso é necessário você ter essa lib JasperReport no classpath da sua aplicação.
segue link para baixar a libhttp://webscripts.softpedia.com/script/Health/JasperReports-31138.html
Mas eu já tenho essa lib…
Colocou as libs no classpath da aplicação ou da IDE?
Tchello,
deixa eu ver se entendi direito;
você digitou o comando e parou de dar o erro x11, e seus relatorios são gerados normalmente? só q o erro HeadlessException continua só q vem null certo?ele gera o relatório antes ou depois do erro?
O relatório é gerado antes e sempre funcionou, o único problema é a utilização do JasperViewer.
Adicionei aquele argumento nos OPTS do java no run.sh do JBoss.
O problema é que o JasperView continua lançando uma exceção (HeadlessException) com a mensagem “null”. Compreende?
Vale lembrar que uso JBoss 4.2.2 GA, rodando num Ubuntu Server 9.04 (ou seja, sem o X).
Então, o JasperViewer ele abre uma janela swing onde o relatório é exibido, como não tem a interface gráfica ele não tem onde mostrar isso deve ser a origem desse null.
Por que não gera um PDF e disponibiliza pra download.
…
O relatório é gerado antes e sempre funcionou, o único problema é a utilização do JasperViewer.
Adicionei aquele argumento nos OPTS do java no run.sh do JBoss.
O problema é que o JasperView continua lançando uma exceção (HeadlessException) com a mensagem “null”. Compreende?
Vale lembrar que uso JBoss 4.2.2 GA, rodando num Ubuntu Server 9.04 (ou seja, sem o X).
Então, o JasperViewer ele abre uma janela swing onde o relatório é exibido, como não tem a interface gráfica ele não tem onde mostrar isso deve ser a origem desse null.
Por que não gera um PDF e disponibiliza pra download.
Ai é que tá, como é server-side ele usa o X do servidor, certo?
Edit: já ia esquecendo, é o que estou tentando, se ver meus posts anteriores notará que também enfrento um problema com isso.
Abraços.
Só para gerar o PDF não sei se ele usa não.
Eu tenho vários servidores linux gerando relatórios em PDF e não teve problema.
Só para gerar o PDF não sei se ele usa não.
Eu tenho vários servidores linux gerando relatórios em PDF e não teve problema.
O problema não é a geração do pdf ou do relatório em sí. Isso funciona perfeitamente, tanto que ele e enviado por e-mail como anexo perfeitamente, em pdf.
Na verdade queria o seguinte:
Abrir o pdf em outra aba do navegador (ou outra janela, dependendo da configuração do navegador) caso exista o plugin do acrobat reader instalado. Caso não haja plugin mandar o usuário salvar o pdf em disco.
Entendeu?
Tchello,
você tem o x11 instalado nessa máquina? caso não tenha de uma olhada e instale, caso tenha veja as atualizações, pois nos ultimos mêses houveram algumas atualizações para esse pacote.
tivemos um problema aqui com esse x11. temos duas máquinas uma p/ teste e outra de produção, a de produção tava tudo certo, pois foi instalada no modelo de um server do TSE, ou seja veio toda BOA, ai resolvemos criar uma cópia desta na mão então blz, quando tudo parecia estar funcionando veio esses detalhes, ai fomos resolvendo uns e pedimos ajuda para resolver outros.
trabalhamos com o redhat nos servidores web, banco e email. tenho o ubuntu em uma máquina virtual q teve o mesmo problema então fiz umas atualizações para um servidor web e rodou tudo aqui.
Se você ainda tiver problemas com / dev / null, você precisa ver em sua conta no info NetInfo Manager (/ Applications / Utilities / Netinfo Manager)
Procure por uma entrada denominada concha e ver qual é o seu valor. Se o valor for / dev / null, alterá-lo para / bin / bash (ou qualquer shell você preferir).
qualquer coisa manda ai.
faz o seguinte procure no classpath do java do tomcat ou jboss e verifica se ela existe porai.
caso não tire ela do classpath de sua aplicação e cole direto nos classpath q informei assima.
vc tem telefone?(brincadeira)
Hey, pode haver algum problema com versão do jasper.jar???
Pq a que eu tenho aqui é 3.6 e a q vc falou pra eu baixar no post anterior 2.0.2 (q por sinal não consegui baixar no link q m passou, e procurei em outros link, tbm nao consegui =/)…
Bom a principio, coloquei o jar no classpath da minha aplicação, junto com outros jar q estou utilizando… e a unica q esta me dando problema é a do jasper, as outras consigo utilizar normalmente… sera a versao???
Ptz… o negocio aqui ta tenso, to apelando pra tudo q é santo…rsrs, falta 30 dias pra entrega desse meu trabalho e nao to conseguindo… 
tenho aqui uma versão 2.0.4
vou deixar um link para vc baixar
http://www.tre-ap.jus.br/Publicacao/jasperreports-2.0.4.jar
aproveita q vou remover às 12h
tenho aqui uma versão 2.0.4vou deixar um link para vc baixar
http://www.tre-ap.jus.br/Publicacao/jasperreports-2.0.4.jar
aproveita q vou remover às 12h
Blza… baixei aqui, daqui a pouco vou fazer um teste… 
Hey, mas nesse arquivo q vc mandou nao veio nenhum jar, tem só uns .class =/
Eve, você usa o que. JBoss, tomcat, jetty?
E também, você tem as commons libs? barbecue, digester,logging, beanutils,codec,lang, etc?
Só pra teste coloque todos os jars do jasper e os commons e coloque na lib do seu servidor de aplicações / servidor web.
Junior, aquelas alterações você diz para serem feitas no servidor, correto?
É que o servidor aqui nem tem ambiente gráfico, é tudo no console mesmo. Talvez seja por isso.
o arquivo q mandei já é um jar! dentro do .jar existem as classes compiladas para rodar o q vc precisa.
somente substitua esse .jar pelo q vc tem ai. e espero q tudo de certo.
bjs… te amo!
pronto!
o adobe precisa de ambiente gráfico para gerar a visualização, Por isso que veio aquele monte de caracteres estranho.
teras que instalar o x11 para rodar seus pdfs.
no seu caso só precisa isso. por isso q veio null certo.
ps.: sugiro que vc de uma olhada em imagens prontas na internet de servidores web linux. já vem completo, só precisando instalar o JBoss e Java.
qualquer coisa posso te ajudar nessa tarefa.
abraço
Eve, você usa o que. JBoss, tomcat, jetty?
E também, você tem as commons libs? barbecue, digester,logging, beanutils,codec,lang, etc?
Só pra teste coloque todos os jars do jasper e os commons e coloque na lib do seu servidor de aplicações / servidor web.
Uso o tomcat
Mas e se eu quisesse manter esse ubuntu server sem ambiente gráfico, é possível instalar os componentes necessários pra que ele ( JasperViewer) os use?
Isso sem que o servidor sequer inicie o ambiente gráfico (seria perda de desempenho e eu tbm não posso muda-lo).
Abraços.
Mas e se eu quisesse manter esse ubuntu server sem ambiente gráfico, é possível instalar os componentes necessários pra que ele ( JasperViewer) os use?
Isso sem que o servidor sequer inicie o ambiente gráfico (seria perda de desempenho e eu tbm não posso muda-lo).Abraços.
tem sim! só instala o x11 e ele fica lá escondido só abrindo quando solicitado, ou seja, quando o JasperViewer chamar atravéz do cliente.
vc deve saber q tem como gerenciar essa parte gráfica do linux certo? ele pode iniciar na inicialização do linux ou quando vc chama ele pela linha de comando. open x11 ou x11
estamos ai
Vc já tentou pedir ao seu admin do web server linux pra instalar o gerenciador de componentes gráficos? Aproveita e pede para ele iniciar a variável o gerenciador gráfico no container e na inicialização da JRE.
assim:-Djava.awt.headless=“false”
Provavel que vc precise desse componente no servidor tb:
/usr/local/java/jdk1.6.0_11/jre/lib/amd64/xawt/libmawt.so
T+
Perll