Byte[] para ByteArrayOutputStream

3 respostas
H

Pessoal, estou com um problema no meu IReports.

FacesContext facesContext = FacesContext.getCurrentInstance();  
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
bytes = JasperRunManager.runReportToPdf (relatorioJasper1,new HashMap(), ds );

response.setContentType("application/pdf");
response.setContentLength(bytes.length);  
ServletOutputStream ouputStream;
try {
		
	ouputStream = response.getOutputStream();
	ouputStream.write(bytes, 0, bytes.length);
	ouputStream.flush();  
	ouputStream.close();
			
} catch (IOException e) {
			// TODO Auto-generated catch block
		e.printStackTrace();
	}

Beleza… Roda perfeito. só não mostra nada. Esse funcionava antes de passar pra faces.

Um outro relatorio que tenho que não usa o Ireports e em vez de trabalhar com byte[], trabalha com com
ByteArrayOutputStream funciona perfeito.

Alguém sabe como faço pra converter ou tem uma outra idéia? O inverso tem 10000 exemplos na net :roll:

Obrigado

3 Respostas

D

Olá.

Veja se isso pode te ajudar.
// Para converter...
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = baos.toByteArray();

// Ou gerar diretamente para o array de bytes...
try {
	bytes = JasperRunManager.runReportToPdf(reportFileJasper.getPath(), parametros, con);
       	res.setContentType("application/pdf");
       	res.setContentLength(bytes.length);
       	servletOutputStream.write(bytes, 0, bytes.length);
       	servletOutputStream.flush();
       	servletOutputStream.close();
} catch (JRException e) {
       	StringWriter stringWriter = new StringWriter();
       	PrintWriter printWriter = new PrintWriter(stringWriter);
       	e.printStackTrace(printWriter);
       	res.setContentType("text/plain");
       	res.getOutputStream().print(stringWriter.toString());
};

Até.

H

Caraca Adriano, Valeu cara mas meu irmão “Garimpou” na net o problema e encontrou outra saída.
dá uma olhada:

Criei um arquivo branco.jsp vazio.

no faces-config adicionamos a entrada:

<navigation-case>
			<from-action>#{bOrcamento.imprime}</from-action>
			<from-outcome>imprimir</from-outcome>
			<to-view-id>/branco.jsp</to-view-id>
		</navigation-case>

e criei o método imprime numa classe separada para toda aplicação.
Era imprescindível avisar o faces que o contexto estava finalizado.
para isso usei o comando facesContext.responseComplete();

dá uma olhada abaixo:

public String imprime (byte[] bytes) {
		String retorno = "erro";
		FacesContext facesContext = FacesContext.getCurrentInstance();  
		HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

		response.setContentType("application/pdf");
		response.setContentLength(bytes.length);  
		System.out.println(bytes.length);
		ServletOutputStream ouputStream;
		try {
			
			ouputStream = response.getOutputStream();
			ouputStream.write(bytes, 0, bytes.length);
			ouputStream.flush();  
			ouputStream.close();
			retorno = "imprimir";
			facesContext.responseComplete(); //Este era o comando faltando
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retorno;
	}

e obrigado pela ajuda

D

Opa. Que bom que vocês acharam uma saída. É isso ae, procurando o que se quer, você acaba sempre achando. hehe.

Até mais cara.

Criado 10 de outubro de 2008
Ultima resposta 14 de out. de 2008
Respostas 3
Participantes 2