Erro response.getOutputStream() / PDF

6 respostas
J

Olá,

tenho o seguinte código para gerar o .pdf no browser:

DataOutput output = new DataOutputStream(response.getOutputStream());

byte[] bytes = buffer.toByteArray();

response.setContentLength(bytes.length);

for( int i = 0; i < bytes.length; i++ ) { output.writeByte( bytes[i] ); }

o problema é que esse código só funciona para determinadas query que consultam dados da mesma tabela e não vejo diferença entre um registro e outro. O erro gerada no browser é conforme abaixo:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: getOutputStream() has already been called for this response

root cause

java.lang.IllegalStateException: getOutputStream() has already been called for this response

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.

Onde é o erro ?

6 Respostas

P

talvez tenha que fechar o outputstream… que tipo de objeto é o response??

J

Oi, não é nada mais que isso!

o problemas é que as vezes não funciona… notei que quando codTom recebe “-” da erro… mas as vezes não é “-” e também não funciona!

ficou pra mim sem lógica por enquanto… mas o problema vai ter que ser encontrado. Observe abaixo por favor:

String codTom = null;

codTom = rs.getString(“codTom”);

cell = new PdfPCell(new Paragraph(codTom, f08)); // codTom é String

cell.setHorizontalAlignment(cell.ALIGN_CENTER);

table.addCell(cell);
DataOutput output = new DataOutputStream(response.getOutputStream());

byte[] bytes = buffer.toByteArray();

response.setContentLength(bytes.length);

for( int i = 0; i < bytes.length; i++ ) { output.writeByte( bytes[i] ); }
S

será que você não precisa dizer que o retorno é um PDF???
olha esse código que eu uso para exportar em XLS, ve se ajuda em alguma coisa.

private void downLoadTheExcelFile&#40;String fileName, HttpServletResponse response&#41; throws IOException 
	&#123; 
		try&#123;
			FileInputStream inputStream = new FileInputStream&#40;fileName&#41;; 
			boolean flag = true; 
			response.setHeader&#40;&quot;Content-Disposition&quot;, &quot;attachment;filename=ECOMatrix.xls&quot;&#41;; 
			response.setContentType&#40;&quot;application/vnd.ms-excel&quot;&#41;; 
			char c = '\u5000'; 
			ServletOutputStream servletOutputStream = response.getOutputStream&#40;&#41;; 
			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream&#40;servletOutputStream&#41;; 
			int abyte0 = 0;
			int i = 0;
			while &#40;&#40;abyte0=inputStream.read&#40;&#41;&#41; != -1&#41; 
			&#123; 
				bufferedOutputStream.write&#40;&quot;teste \t&quot;.getBytes&#40;&#41;&#41;;
				i++;
				if&#40;i%5 == 0&#41;
					bufferedOutputStream.write&#40;&quot;\n&quot;.getBytes&#40;&#41;&#41;;
				
				if&#40;i%3 == 0&#41;
					bufferedOutputStream.write&#40;&quot;\t&quot;.getBytes&#40;&#41;&#41;;
			&#125; 
			inputStream.close&#40;&#41;; 
			bufferedOutputStream.flush&#40;&#41;; 
		&#125;catch&#40;Exception e&#41;&#123;&#125;
	&#125;
J

Tente assim:

byte&#91;&#93; bytes = buffer.toByteArray&#40;&#41;;

response.setContentLength&#40;bytes.length&#41;;

OuputStream out = response.getOutputStream&#40;&#41;;

out.write&#40;bytes&#41;;

out.flush&#40;&#41;;
out.close&#40;&#41;;
J

Isso ae Cara… agora funcionou certinho!

Mas o motivo não ficou claro… por que acontecia o erro ?

“Grande abraço a todos”.

Obrigado.

J

O problema é que você não pode chamar o metodo getOuputStream() mais de uma vez para o mesmo objeto, e parece que em algum lugar ele estava sendo chamado, por isso colocar um flush() e close()

É meio obscuro, mas é basicamente isso. :roll:

Criado 12 de dezembro de 2007
Ultima resposta 13 de dez. de 2007
Respostas 6
Participantes 4