JasperReports - Exportar para HTML

10 respostas
B

Pessoal, alguém sabe como exporto os dados de um JasperPrint para html. Mas eu quero escrever em um outputstream:

OutputStream oStream = response.getOutputStream();
response.setContentType(“application/pdf”);

JasperExportManager.exportReportToPdfStream(print, oStream);

Note que para arquivos pdf’s existe um método utilitário para exportar para um stream. Existe o mesmo método para xml tb. Mas quando procurei para html só encotrei métodos exportToHtmlFile.

Eu não preciso gerar um arquivo em disco… Só preciso pegar o conteúdo do relatório preenchido(JasperPrint) e escrever no OutputStream… É que o usuário pode escolher como quer visualizar: pdf, html ou xml.

Como faço isso?

Valeu.

10 Respostas

_

Simplemente enviar o arquivo html em memória para o cliente não adiantaria, pois ao gerar esse tipo de relatório o Jasper cria arquivos de imagens para montar o relatório corretamente.
Pode verificar este comportamento rodando o relatório no formato HTML de dentro do iReports. No mesmo diretório onde o arquivo é gerado, é criada outra pasta contendo os arquivos de suporte.

B

Encontrei o códgio abaixo neste endereço:

http://www-106.ibm.com/developerworks/websphere/library/techarticles/0411_olivieri/0411_olivieri.html

JRHtmlExporter exporter = new JRHtmlExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter( JRExporterParameter.OUTPUT_WRITER, response.getWriter()); Map imagesMap = new HashMap(); request.getSession().setAttribute("IMAGES_MAP", imagesMap); exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap); exporter.setParameter( JRHtmlExporterParameter.IMAGES_URI, "image?image="); exporter.exportReport();

Parece ser o jeito certo de exportar para html, mas eu realmente preciso configurar esta parte do servlet de imagens? meu relatório não tem imagens.

Qdo eu omiti o param IMAGE_MAP ou informei new HashMap(), e tb qdo omiti IMAGES_URI ou informei “”, recebi uma ClassCastException…

Alguém alguma dica ou um código que funcione?

Valeu

_

Hum, interessante guardar as imagens na session.

Mesmo que seu relatório não contenha imagens, o Jasper gera algumas imagens de suporte, para conseguir desenhar linhas e outras coisinhas.

Você disse que rolou a exceção … não ajudou muit cara hehe em que linha exatamente ocorreu a CCE?

B

A exception ocorreu na última linha. Onde está exporter.exportReport().

Eu li algumas coisas nuns fóruns na net e achei um JRHtmlExporterParameter que achei que resolveria meu problema:

htmlEx.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);

Vejam: Está usando imagens para alinhar? Eu disse: “Não”.

Mas ainda assim não resolveu.

Outra coisa: E se eu estivesse utilizando numa app desktop? Teria que continuar mapeando uma IMAGES_URI para um servlet(como está no exemplo web do jasper)? Acho que não faz sentido.

Se alguém tiver algum código que exporte para html sem se preocupar com imagens, por favor me passem.

Uma solução que pensei, seria utilizar o mapeamento IMAGES_URI, IMAGES_MAP e copiar o serlvet do exemplo web do jasper… Mas achei isso muito estranho…

Valeu

R

Estou com esse mesmo problema :frowning:
Alguém sabe se isso tem solução ou realmente teremos que continuar resolvendo essas coisas no braço?

L

Amigo,

resolvi este problema da seguinte forma:

package br.com.jm.ss2.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.HashMap;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;

public class GeraRelatorioEmHTML extends HttpServlet {

	private final static long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String nomeDoRelatorio = request.getParameter("nomeRelatorio");
		//List lista = (List) request.getAttribute("lista");
		HashMap<String, String> parametros = (HashMap<String, String>) request
				.getAttribute("parametros");

		ServletContext context = this.getServletContext();

		String nomeDoArquivoCompilado = context.getRealPath(nomeDoRelatorio);
		File arquivo = new File(nomeDoArquivoCompilado);
		PrintWriter printWriter = response.getWriter();

		try {
			JasperReport relatorioCompilado = (JasperReport) JRLoader
					.loadObject(arquivo);

			//JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
			//		lista);
			
			IRelatorios rel = new RelatoriosDao();
			Connection con = rel.getConnection();
			
			JasperPrint relatorioFinal = JasperFillManager.fillReport(
					relatorioCompilado, parametros, con);

			JRHtmlExporter htmlExporter = new JRHtmlExporter();

			response.setContentType("text/html");

			response.setCharacterEncoding("ISO-8859-1");

			request.getSession().setAttribute(
					ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
					relatorioFinal);
			htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT,
					relatorioFinal);
			htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER,
					printWriter);
			htmlExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,
					"ISO-8859-1");
			/*
			 * aqui é mapeado para o servlet do JasperReport, para que ao gerar o 
			 * html não renderize as imagens em branco, pois os espaços em branco,
			 * são imagens em branco que ele adiciona!
			 * Basta adicionar no web.xml a chamada ao servlet que existe no pacote:
			 *    
				<servlet>
			      <servlet-name>ImageServlet</servlet-name>
			      <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
			   </servlet> 
			
			   <servlet-mapping>
			      <servlet-name>ImageServlet</servlet-name>
			      <url-pattern>/image.servlet</url-pattern>
			   </servlet-mapping>
			  *  
			 */
			htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
		            request.getContextPath() + "/image.servlet?image=");
			htmlExporter.exportReport();
			// printWriter.println("Passou por aqui");
		} catch (JRException e) {
			e.printStackTrace(printWriter);
		}
	}
}

Observe na linha:

htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request.getContextPath() + "/image.servlet?image=");
Que eu mapeio um servlet.

Este servlet está nas lib´s do JasperReport, para usá-la basta criar um mapeamento para o servlet no web.xml:

<servlet>
      <servlet-name>ImageServlet</servlet-name>
      <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
   </servlet> 

   <servlet-mapping>
      <servlet-name>ImageServlet</servlet-name>
      <url-pattern>/image.servlet</url-pattern>
   </servlet-mapping>

Que desta forma os espaços em branco que o JasperReport renderiza com uma imagem, serão renderizados com a imagem mesmo e não mais com o erro de imagem que acontecia!

Espero ter ajudado, abraços…

J

Cara tava pendente com isso fazia uns 3 dias já! Funcionou perfeito!

Valeu!

L

Que bom que conseguiu…

J

Um novo problema surgiu =(

Estava lendo que a classe que convert o output do jasper pra html faz certos tratamentos nas divs html, e por conta disso a forma com que eu desenhei o relatorio deixa varios lugares vazios na tela do navegador.

Ai eu pensei em uma solucao, só nao sei se eh viavel…jogar na tela uma imagem do meu pdf (que esta correto) em jpeg ou algum outro formato…o que acham %

C

Oi

Eu sei que já faz algum tempo que ninguém escreve mais nada neste post. Mas eu como estou dando os primeiros passos no Jasper Report através de pesquisa no Google achei este post muito bom.

Mas eu tenho uma dúvida. na linha 54 do código está isto escrito:

IRelatorios rel = new  RelatoriosDao();

Mas eu não estou a perceber o que isto faz porque a class IRelatorios e RelatoriosDAO por não aparecerem mais nenhuma vez no restante código.

Se me puderem ajudar agradecia muito

Valeu!!

Criado 9 de março de 2005
Ultima resposta 7 de jun. de 2010
Respostas 10
Participantes 6