JSF - Abrir um relátorio em uma nova janela

7 respostas
A

Olá pessoal!!
Eu tenho um botão que chama um relatório e esse relatório abre já pedindo para fazer download, mas eu preciso
que o usuário visualize o documento em outra janela antes de fazer download/imprimir.
Já utilizei o target="_blank" mas ele abre uma nova janela e fecha instataneamente e abre a de pedido para download.

O código do meu botão está assim:

<p:commandButton value="Gerar Dare " update="frmRelatorio" ajax="false" actionListener="#{relatorioControlador.gerarDocumentoDare}" onclick="this.form.target='_blank'" /><p:spacer width="30px"></p:spacer>

Já pesquisei em outros tópicos aqui do forum sobre o mesmo assunto mas nenhum resolveu o meu problema.
Se alguém tiver uma dica eu agradeço.
Abraços

7 Respostas

E

Bom dia.
Posta o código de como você esta gerando o relatório.
Pesquise durante um tempo, atualmente eu coloco para exibir em um pop-up.

<p:commandButton image="ui-icon-print"
action="#{portariaController.actionExecutarRelatorio}"
oncomplete="javascript:NovaJanela('#{request.contextPath}/gerarRelatorio','nomeJanela','450','450','yes');return false;"
value="Imprimir" />
A

Bom dia Edson.
Obrigado pela dica do pop up.
Sim estou pesquisando muito e tudo que eu vi até agora foram por meios de servlet.

O código de como eu gero o relatório (É um pouco grande por que é para gerar um boleto feito no iReport):

public void gerarDocumentoDare() {
		
		// Classes de Formatação
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			
		SimpleDateFormat hora = new SimpleDateFormat("dd/MM/yyyy / HH:mm:ss");
		
		NumberFormat valor = new DecimalFormat("###0.00");
		
		try {

			// Lista de Parâmetros estáticos

			Map<String, String> params = new HashMap<String, String>();

			// Lista de registro
			// List<DocumentoArrec> listarDadosDare=
			// documentoArrecNeg.listarDadosDocumento();
			DocumentoArrec documento = documentoArrecNeg.consultar(64);//
		//	DocumentoArrec documento = documentoArrecNeg.consultar(getDocumentoArrec().getIdDocumentoArrec());
		//	DocumentoArrec documento =getDocumentoArrec();
			
			List<Map<String, String>> fields = new ArrayList<Map<String, String>>();
			Map<String, String> mapItemRelatorio = new HashMap<String, String>();

			if (documento.getNumrReservadoProcesm() != null)
				mapItemRelatorio.put("numDare", documento
						.getNumrReservadoProcesm().toString());

			if (documento.getNumrDocumentoOrigem() != null)
				mapItemRelatorio.put("docOrigem", documento
						.getNumrDocumentoOrigem().toString());

			if (documento.getReceitaDetalhe() != null)
				mapItemRelatorio.put("detalheReceita", documento
						.getReceitaDetalhe().getDescDetalheReceita().toString());

			if (documento.getTipoDocumentoArrec() != null)
				mapItemRelatorio.put("especReceita", documento
						.getTipoDocumentoArrec().toString());
			
			if (documento.getTipoDocumentoArrec() != null)
				mapItemRelatorio.put("especReceitaNome", documento
						.getTipoDocumentoArrec().getDescTipoDocumentoArrec().toString());
			

			if (documento.getRefeMes() != null)
				mapItemRelatorio.put("refMes", documento.getRefeMes()
						.toString());

			if (documento.getRefeAno() != null)
				mapItemRelatorio.put("refAno", documento.getRefeAno()
						.toString());

			if (documento.getNumrParcela() != null)
				mapItemRelatorio.put("parcela", documento.getNumrParcela()
						.toString());

			if (documento.getInfoCompl() != null)
				mapItemRelatorio.put("infoComplementar", documento
						.getInfoCompl().toString());

			if (documento.getDataVencimentoTributo() != null)
				mapItemRelatorio.put("data", sdf.format( documento
						.getDataVencimentoTributo()) );

			if (documento.getDataValidadeCalculo() != null)
				mapItemRelatorio.put("dataValidade", sdf.format( documento.getDataValidadeCalculo()));

			if (documento.getDataEmissao() != null)
				mapItemRelatorio.put("dataEmissao", hora.format( documento.getDataEmissao()));
	

			if (documento.getValrTotalDocumento() != null)
				mapItemRelatorio.put("valorTotal", valor.format( documento
						.getValrTotalDocumento()));

			if (documento.getContribuinteDocumento() != null) {

				if (documento.getContribuinteDocumento()
						.getNomeRazaoSocialEmitente() != null)
					mapItemRelatorio.put("nomeRazao", documento
							.getContribuinteDocumento()
							.getNomeRazaoSocialEmitente().toString());

				if (documento.getContribuinteDocumento()
						.getNumrInscricaoEmitente() != null)
					mapItemRelatorio.put("inscEstadual", documento
							.getContribuinteDocumento().
							getNumrInscricaoEmitente().toString());
				
				if (documento.getContribuinteDocumento()
						.getNumrCnpjEmitente() != null)
					mapItemRelatorio.put("cnpj", documento
							.getContribuinteDocumento().
							getNumrCnpjEmitente().toString());
				
				if (documento.getContribuinteDocumento()
						.getNumrCpfEmitente() != null)
					mapItemRelatorio.put("cpf", documento
							.getContribuinteDocumento().
							getNumrCpfEmitente().toString());
				
				if (documento.getContribuinteDocumento()
						.getNumrPlacaVeiculo() != null)
					mapItemRelatorio.put("placa", documento
							.getContribuinteDocumento().
							getNumrPlacaVeiculo().toString());
				

				if (documento.getContribuinteDocumento()
						.getInfoEnderecoEmitente() != null)
					mapItemRelatorio.put("endereco", documento
							.getContribuinteDocumento()
							.getInfoEnderecoEmitente().toString());
				

				if (documento.getContribuinteDocumento()
						.getMunicipioEmitente() != null)
					mapItemRelatorio.put("municipio", documento
							.getContribuinteDocumento().getMunicipioEmitente().getNomeMunicipio());
				
				if (documento.getContribuinteDocumento()
						.getMunicipioEmitente() != null)
					mapItemRelatorio.put("uf", documento
							.getContribuinteDocumento().getMunicipioEmitente().getCodgUF());


				if (documento.getContribuinteDocumento()
						.getCodgDddTelefoneEmitente() != null)
					mapItemRelatorio.put("ddd", documento
							.getContribuinteDocumento()
							.getCodgDddTelefoneEmitente().toString());
				
				if (documento.getContribuinteDocumento()
						.getNumrTelefoneEmitente() != null)
					mapItemRelatorio.put("telefone", documento
							.getContribuinteDocumento()
							.getNumrTelefoneEmitente().toString());
				
			}
			
			
		if (documento.getCodgBarra() != null)
			mapItemRelatorio.put("codBarra", documento.getCodgBarra().toString());
		
	

		
			
			int cont = 1;
			for (AlineaDocumento alinea : documento.getListaAlineaDocumento()) {
				String campo = "alinea" + cont;
				
				String total = "valor" + cont;	

				DominioGenerico dominioGenerico = new DominioGenerico();
				dominioGenerico=dominioNeg.buscarIdDominio(alinea.getTipoAlinea().toString(), "TIPO_ALINEA_VALOR");
				
				if ((dominioGenerico.getDescricao() != null) &&  (alinea.getTipoAlinea() != null) &&
						(alinea.getReceitaTrib().getReceitaOrcamentaria().getCodgNaturezaReceita() != null))
				{
				
				mapItemRelatorio.put(campo,dominioGenerico.getDescricao() + " (" +
						alinea.getTipoAlinea()
						+ alinea.getReceitaTrib().getReceitaOrcamentaria().getCodgNaturezaReceita() 
						+ ")");
				}
				mapItemRelatorio.put(total, valor.format( alinea.getValrAlinea()));
				
				cont++;
			}
			

			fields.add(mapItemRelatorio);

			if (!fields.isEmpty()) {
				ReportGenerator reportGenerator2 = new ReportGenerator();
				reportGenerator2.printReport("P", params,
						"relatorioEmissaoDare.jasper", "emissaoDare", fields);

			} else {
				addMensagemFaces("Não existem Receitas Tributarias.");
			}

	//	} catch (ConsultarException e) {
	//		e.printStackTrace();
		} catch (JRException ex) {
			addMensagemFaces("Erro: " + ex.getMessage(),
					FacesMessage.SEVERITY_INFO);

		} catch (Exception ex) {
			addMensagemFaces("Erro: " + ex.getMessage(),
					FacesMessage.SEVERITY_INFO);

		}

	}
}
E

Bom dia.
Segue o exemplo de como abrir em uma nova pagina.

<h:commandLink actionListener="#{alunoController.executarRelatorioAssinatura}"	target="_blank" value="Imprimir Lista" styleClass="btnimprimir" />
public void executarRelatorioAssinatura(ActionEvent action)
			throws ParseException {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			if (turma != null && turma.getCodId() != null
					&& turma.getCodId() != 0) {

				HttpServletResponse response = (HttpServletResponse) context
						.getExternalContext().getResponse();

				InputStream reportStream = context.getExternalContext()
						.getResourceAsStream("/relatorio/listapai.jasper");

				response.setContentType("application/pdf");

				ServletOutputStream servletOutputStream = response
						.getOutputStream();

				turma = DaoFactory.getTurmaDao().findByPk(turma.getCodId());

				List<AlunoEscola> listaALuno = AlunoEscolaController
						.listaAlunoEscola(turma);

				String t = turma.getDescricao();
				String ano = turma.getEscolaSerie().getDescricao();

				Map<String, Object> map = new HashMap<String, Object>();
				map.put("turma", ano + " - " + t);

				List dados = new ArrayList();

				Map record = null;
				Aluno aluno = null;

				for (AlunoEscola ae : listaALuno) {
					aluno = ae.getAluno();
					record = new HashMap();
					record.put("nome", aluno.getNome());
					record.put("data", aluno.getDataNascimento());

					dados.add(record);
				}

				JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(
						dados);

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

				servletOutputStream.flush();
				servletOutputStream.close();
			}
		} catch (JRException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			context.responseComplete();
		}
}

Espero que ajude.

A

Obrigado Edson, consegui resolver usando o seu exemplo.

Vlw abraços.

E

De nada.
Meu exemplo que usar o pop-up eu configurei com servlet.

Att,
Edson

W

Olá, para ficar perfeito, só falta complementar uma linha de código, que indica ao browser que o conteúdo será "inline" (aberto no próprio browser)

Para forçar o donwload do PDF, basta trocar por "attachment".

Eis o complemento:

//... incluir depois da linha abaixo
response.setContentType("application/pdf");  

// Seta o nome do arquivo e a disposição: "inline" abre no próprio navegador
// Mude para "attachment" para indicar que deve ser feito um download
response.setHeader("Content-disposition", "inline; filename=arquivo.pdf");

// ... continuação do seu código

Veja mais detalhes no post: [url]http://java-bytecode.blogspot.com.br/2012/08/como-exibir-um-pdf-numa-pagina-jsf.html[/url]

[]'s

J

Da forma como Edson falou, funcionou perfeitamente para mim. Obrigado por compartilhar a informação.

<h:commandLink actionListener="#{alunoController.executarRelatorioAssinatura}"   target="_blank" value="Imprimir Lista" styleClass="btnimprimir" />
Criado 15 de agosto de 2012
Ultima resposta 8 de out. de 2012
Respostas 7
Participantes 4