Problemas com Facelets + JSF + Jasper

21 respostas
D

Opa :smiley:

Essa é a única mensagem de erro que eu recebo:

Meu código está da seguinte maneira:

public void gerarRelatorio() throws IOException, JRException, SQLException{	
		GrupoProcedimentoDAO grupoDAO = new GrupoProcedimentoDAO(GrupoProcedimentoBean.class);
		GrupoProcedimentoBean grupoProcedimento = (GrupoProcedimentoBean)grupoDAO.findByID(getIdGrupoProcedimento());
		
		RelatorioResultado relatorio = new RelatorioResultado();
		
		List<RelatorioResultado> resultado = new ArrayList<RelatorioResultado>();
		
		for(ProcedimentoBean procedimento : grupoProcedimento.getProcedimentos()){
			relatorio.setQuantidadeSigla1(procedimento.getAgendamentos().size());
			relatorio.setProcedimentoCodigo(procedimento.getCodigo());
			relatorio.setProcedimentoNome(procedimento.getNome());
			resultado.add(relatorio);
		}
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse)
		context.getExternalContext().getResponse();
		InputStream reportStream = context.getExternalContext().getResourceAsStream("/relatorio/sgdi.jasper");
		ServletOutputStream servletOutputStream = response.getOutputStream();
		
		JRBeanCollectionDataSource jrbs = new JRBeanCollectionDataSource(resultado);

		response.setContentType("application/pdf");
		JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, resultadoFinal, jrbs);
	
		servletOutputStream.flush();
		servletOutputStream.close();
	}

Alguém já passou por isso?

[]'s

21 Respostas

h4lls

Bom cara!!

Tenta fazer assim:

public static void geraPdf(JasperPrint jasperPrintSecao){
	try{
	
		//GERA PDF
		// @ outputStream
		ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
		JasperExportManager.exportReportToPdfStream(jasperPrintSecao, pdfStream);

		 HttpServletResponse response 
			= (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf");
		response.setContentLength(pdfStream.size());	//para o pdfStream
	
		
	      // Flush pdfStream pra response
		ServletOutputStream flusher;
		flusher = response.getOutputStream();
		pdfStream.writeTo(flusher);	
		flusher.flush();
		flusher.close();
               FacesContext.getCurrentInstance().responseComplete();
		pdfStream.close(); 
		pdfStream = null;
		

	}catch (Exception e) {
		e.printStackTrace();
	}
	
}

Não sei se te ajuda, aqui consegui arruma esse erro.

flw

D

Mas como que ficou seu link na pagina pra chamar a impressão de relatório?

h4lls

No meu caso eu tive alguns problemas na atualização da pagina, pq eu tinha muitos campos com submit. Dai eu criei um popup e nele eu tinha outro commandButton que chamava o japer dai não ocorria problemas com a pagina dos forms.

D

vc pode colar o código do botão ( e o da popup, se puder ), por favor?

h4lls

Cara eu uso o ADF da oracle a forma de chamar o popup pode ser diferente da sua implementação mas o codigo é esse:

pagina principal dos forms que chama o popup:

<afh:rowLayout>
						<af:commandButton id="bton" action="dialog:ImprimirRelatorioFlash"
							windowWidth="300" windowHeight="200" partialSubmit="true"
							useWindow="true" text="Imprimir" />
</afh:rowLayout>

Aqui o meu popup:

<afh:rowLayout>
<af:commandButton text="#{messages.confirmar}"
							action="#{relatorioFlashVendasJSFBeans.actionImprimir}" />
</afh:rowLayout>

dentro do actionImprimir vc monta seu JasperPrint e envia ele para aqule metodo que te enviei.

D

Vc pode me mostrar seu método que monta o JasperPrint?

[]'s

D

Boa tarde…

Se eu adicionar a linha no do meu método:

context.responseComplete();

Ele funciona numa boa, porém quando ele redireciona para a página, o relatório está com uma porrada de caracteres aleatórios e parece que ele não foi ‘transformado’ no que era pra ser.

Vc já passou por isso?

[]'s

h4lls

opa!!

List<RelatorioFaturaVO> lista = new Vector<RelatorioFaturaVO>();
			lista = RelatorioFaturaDAOHibernate.selectDuplicata(faturaVO,
					dataInicial, dataFinal);
		String caminho = "relatorio_fatura.jasper";
		String figura1 = "bandeira_brasil.jpg";
		String figura2 = "bandeira_brasil.jpg";

		Map parametros = new HashMap();
		parametros.put("imagem_esquerda", getClass().getResourceAsStream(
				figura1));
		parametros.put("imagem_direita", getClass()
				.getResourceAsStream(figura2));
		try {
			JasperPrint jasperPrintSecao = JasperFillManager.fillReport(
					getClass().getResourceAsStream(caminho), parametros,
					new JRBeanCollectionDataSource(lista));
			JSFUtil.geraPdf(jasperPrintSecao);
D

Não sei mais o que fazer : :oops:

Meus métodos estão assim:

<td colspan="3" align="center">
<a4j:commandButton action="#{relatorio.gerarRelatorio}" value="Gerar Relatório"></a4j:commandButton>
</td>
public void gerarRelatorio() throws IOException, JRException, SQLException{
Collection<RelatorioBean> relatorios = new ArrayList<RelatorioBean>();
//logica
relatorios.add(relatorio);
JRBeanCollectionDataSource jrbc = new JRBeanCollectionDataSource(relatorios);
JasperPrint jasperPrint = JasperFillManager.fillReport(getClass().getResourceAsStream("/relatorio/sgdi.jasper"), new HashMap(), jrbc);
this.enviarPDF(jasperPrint);
}

public void enviarPDF(JasperPrint jasperPrint){
		try{
			//GERA PDF
			// @ outputStream
			ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
			JasperExportManager.exportReportToPdfStream(jasperPrint, pdfStream);

			 HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf");
			response.setContentLength(pdfStream.size());	//para o pdfStream
		
			
		      // Flush pdfStream pra response
			ServletOutputStream flusher;
			flusher = response.getOutputStream();
			pdfStream.writeTo(flusher);	
			flusher.flush();
			flusher.close();
	        FacesContext.getCurrentInstance().responseComplete();
			pdfStream.close(); 
			pdfStream = null;
			

		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}

E o que ele imprime na tela é o seguinte:


http://img233.imageshack.us/img233/8117/lixobp6.jpg

Já viu isso?

h4lls

Sera q o preblema esta nos desenhos dos relatorios ?!

estranho mesmo!!!

D

Vou apagar todo relatório e deixar um campo estatico pra ver o que acontece…já posto o resultado!

Se eu abrir no JasperViewer, ele funciona numa boa e mostra o relatório certinho!

h4lls

hum…
vix cara tenta ver outros parametros pra passar no response, talves não esta sendo compativel.

response.setContentType("application/octet-stream");  
response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf");

tem muitas formas.

D

Onde que eu posso encontrar outras formas?

h4lls

cara no meu caso eu peguei muita coisa aqui do GUJ e nos forun da sun.

da uma googleada sobre response.setContentType

que deve aparecer diversas formas.

uma delas deve te servir .

D

Vc usa Facelets no seu caso?

[]'s

h4lls

facelets tb.

D

Po, valeu pela ajuda…pesquisando, descobri que o problema esta no richFaces :S

Agora vai ser dose pra arrumar isso hehe

Valeuu

[]'s

h4lls

blz cara.

M

Olá davidpadilha!

Gostaria de saber como vc fez para resolver o problema do jasper com o richfaces?!?!

Estou passando pelo mesmo problema e ainda não consegui solução …

Sds

M

Bem, mesmo não conseguindo respostas aqui …

Consegui resolver e vou deixar aqui como fiz para consulta …

Um detalhe importante e o motivo do erro é o fato de usar o Richfaces no projeto …

Para tanto em minhas paginas xhtml utilizo normalmente um a4j:form e a4j:commandButton com ajax ativado obviamente …

Ai que tá o problema com relação a geração do pdf … vc deve utilizar um h:form e um h:commandButton … e chamar o relatório pelo actionListener …

Espero que ajude alguem que passe por este problema … valew …

Kleber-rr

Olá mlfranz, bom dia.

Você deixou de utilizar o richfaces na tua aplicação?? Estou com um problema apenas quando eu coloco minha aplicação no servidor. No meu pc, rodando pelo eclipse, gera tudo normalzinho.
Estou usando o JSF 1.2, richfaces 3.3.3, iText 2.1.7, tomcat 6.

Agradeço ajuda.

mlfranz:
Bem, mesmo não conseguindo respostas aqui …

Consegui resolver e vou deixar aqui como fiz para consulta …

Um detalhe importante e o motivo do erro é o fato de usar o Richfaces no projeto …

Para tanto em minhas paginas xhtml utilizo normalmente um a4j:form e a4j:commandButton com ajax ativado obviamente …

Ai que tá o problema com relação a geração do pdf … vc deve utilizar um h:form e um h:commandButton … e chamar o relatório pelo actionListener …

Espero que ajude alguem que passe por este problema … valew …

Criado 11 de agosto de 2008
Ultima resposta 19 de nov. de 2010
Respostas 21
Participantes 4