[Resolvido] Exibir relatório Jasper

6 respostas
Lord

Fala pessoal …

Estou com um problema na minha aplicação… eu estou gerando relatórios em pdf, porém, quero apresenta-los no browser sem precisar gravar em disco…
se alguém souber de um tutorial, ou jah tiver feito algo do tipo e poder dar uma dica …

valew!!!

6 Respostas

Marques

Vê se te ajuda…

public class CartaTemperaturaImprimirAction extends Action{
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {	
		
		RomaneioForm formBean = (RomaneioForm) form;
		ActionMessages mensagens = new ActionMessages();
		
		
		Date dtAtual = new Date();
		SimpleDateFormat sdfx = new SimpleDateFormat("dd/MM/yyyy");
		sdfx.setLenient(false);
		String dataAtual = sdfx.format(dtAtual);

		int idAssociacao = Constants.ID_ASSOCIACAO;		
		String portoOrigem = formBean.getPortoOrigem();		
		String temperatura = formBean.getTemperatura();		
		String nomeNavio = formBean.getNomeNavio();
		String portoDestino = formBean.getPortoDestino();		
		String booking = formBean.getBooking();
		String nomeFantasiaAssociado = formBean.getNomeFantasia();		
		String idConteiner = formBean.getIdConteinerAssociado();		
				
		AssociadoDAO associadoDAO = AssociadoDAOFactory.getAssociadoDAO(AssociadoDAOFactory.MYSQL);
		AssociadoDTO associado = associadoDAO.recuperarAssociado(idAssociacao, nomeFantasiaAssociado);		
		
		ConteinerAssociadoDAO conteinerAssociadoDAO = ConteinerAssociadoDAOFactory.getConteinerAssociadoDAO(ConteinerAssociadoDAOFactory.MYSQL);
		ConteinerAssociadoDTO conteinerAssociado = conteinerAssociadoDAO.recuperarConteiner(Integer.parseInt(idConteiner));
		
		ConteinerDAO conteinerDAO = ConteinerDAOFactory.getConteinerDAO(ConteinerDAOFactory.MYSQL);
		ConteinerDTO conteiner = conteinerDAO.recuperarConteiner(conteinerAssociado.getIdConteiner().intValue());
		
		DespachanteDAO despachanteDAO = DespachanteDAOFactory.getDespachanteDAO(DespachanteDAOFactory.MYSQL);
		DespachanteDTO despachante = despachanteDAO.recuperarDespachante(idAssociacao, conteiner.getIdDespachante().intValue());		

		// obtém a conexão com o banco de dados
		Connection conn = null;
		try {
			conn = DBConnection.getConnection();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		// gera o relatório
		HttpSession session = request.getSession();
		ServletContext context = session.getServletContext();
		byte[] bytes = null;
		try {
			// carrega o arquivo jasper
			JasperReport relatorioJasper = null;
			relatorioJasper = (JasperReport) JRLoader.loadObject(context
					.getRealPath("/reports/CartaTemperatura.jasper"));				

			// parâmetros
			Map parametros = new HashMap();
			parametros.put("razaoSocialAssociado", associado.getRazaoSocial());
			parametros.put("commodity", conteiner.getCommodity());
			parametros.put("portoOrigem", portoOrigem);
			parametros.put("portoDestino", portoDestino);
			parametros.put("nomeNavio", nomeNavio);
			parametros.put("booking", booking);
			parametros.put("temperatura", temperatura);
			parametros.put("ventilacao", conteiner.getVentilacao());
			parametros.put("dataAtual", dataAtual);
			parametros.put("nomeFantasiaDespachante", despachante.getNomeFantasia());
			parametros.put("numeroConteiner", conteiner.getNumeroConteiner());
						
			// direciona a saída do relatório para um stream
			bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros, conn);
			parametros = null;
		} catch (JRException e) {
			e.printStackTrace();
		}

		if (bytes != null && bytes.length > 0 && mensagens.isEmpty()) {			
			// envia o relatório em formato PDF para o browser
			response.setContentType("application/pdf");
			response.setContentLength(bytes.length);
			ServletOutputStream ouputStream = response.getOutputStream();
			ouputStream.write(bytes, 0, bytes.length);
			ouputStream.flush();
			ouputStream.close();
		}
		
		bytes = null;		

		return (!mensagens.isEmpty() ? mapping.findForward("falha") : mapping.findForward("success"));
	}

}
Lord

valew Marques …

Mas eu estou usando Jsf…

No meu caso eu tenho um componente que gera o relatório e atualmente ele grava em disco, mas ao invés disso,gostaria de apresenta-lo no browser para o usuário…

D

Faz mais ou menos assim, crie uma classe, com um nome, por exemplo, ExecuteRel, e nesta classe tem um método, por exemplo:

public void executeReport(ActionEvent action) throws IOException, ParseException {
		EntityManager em = getEntityManager();
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context.
				getExternalContext().getResponse();
		InputStream reportStream = context.getExternalContext()
				.getResourceAsStream("relatorio/Relatorio_EJBQL_PedidosEfetuados.jasper");
		
					response.setContentType("application/pdf");
			response.setHeader("Content-disposition", "attachment;filename=ProdutosCadastrados.pdf");
		
		ServletOutputStream servletOutputStream = response.getOutputStream();

		
		ServletContext scontext = (ServletContext)context.getExternalContext().getContext();
		
		
		try {
			Map parameters = new HashMap();
			//caminho real para o sub-relatório
			parameters.put("SUBREPORT_DIR", scontext.getRealPath("relatorio/")+"/");
			//transmite a data para a exibição
			parameters.put("data", new Date(new java.text.SimpleDateFormat("dd/MM/yyyy").
															parse("01/05/1998").
																getTime()));
			

			JasperRunManager.runReportToPdfStream(reportStream,
					servletOutputStream, parameters);


		} catch (JRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		em.close();
		context.responseComplete();
	    servletOutputStream.flush();
	    servletOutputStream.close();
	}

No Faces-Config.xml:

<managed-bean>

		<managed-bean-name>

		executeRel</managed-bean-name>

		<managed-bean-class>

		br.com.integrator.reports.ExecuteRel</managed-bean-class>

		<managed-bean-scope>

		session</managed-bean-scope>

	</managed-bean>
	<navigation-rule>

		<display-name>

		executeRel</display-name>

		<from-view-id>

		/executeRel.jsp</from-view-id>

		<navigation-case>

				<from-action>

					generate_report

				</from-action>

			<to-view-id>

			/executeRel.jsp</to-view-id>

		</navigation-case>

	</navigation-rule
Na página de exemplo, tipo executeRel.jsp, adicione a tag que chamará o relatório:
<f:view><h:form>

		<h:commandLink action="generate_report" actionListener="#{executeRel.executeReport}">

			<h:outputText value="Visualizar Relatório"></h:outputText>

		</h:commandLink>

	</h:form></f:view>

Cara, eu adaptei do exemplo do livro que li, já que é o mais simples que possuo pra te passar. Mas acho que deu pra entender, beleza. Qualquer coisa, posta o problema ai.

Abraços

Lord

Valew cara … muito obrigado !!!

Problema resolvido !!!

D

Altera no Assunto do tópico colocando [RESOLVIDO], e se possível, poste a sua solução, caso tenha feito algo diferente. Assim, outros poderão pesquisar e saberão como resolver o mesmo problema, qdo tiverem.

Abraços

K

Olá PESSOAL.

Estranho, fiz o mesmo exemplo acima e aparentemente funciona perfeitamente, apenas quando abro o arquivo .PDF me informa que está danificado. Sabe me dizer o porque pode estar acontecendo isso?

[color=red]CORRIGIDO: Desculpe era apenas umas libs que não havia importado corretamente.[/color]

Show de bola!

Abraços …

Criado 1 de fevereiro de 2008
Ultima resposta 15 de jan. de 2010
Respostas 6
Participantes 4