Erro response.getOutputStream() / PDF

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 ?

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

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] ); }

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.

[code]private void downLoadTheExcelFile(String fileName, HttpServletResponse response) throws IOException
{
try{
FileInputStream inputStream = new FileInputStream(fileName);
boolean flag = true;
response.setHeader(“Content-Disposition”, “attachment;filename=ECOMatrix.xls”);
response.setContentType(“application/vnd.ms-excel”);
char c = ‘\u5000’;
ServletOutputStream servletOutputStream = response.getOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(servletOutputStream);
int abyte0 = 0;
int i = 0;
while ((abyte0=inputStream.read()) != -1)
{
bufferedOutputStream.write(“teste \t”.getBytes());
i++;
if(i%5 == 0)
bufferedOutputStream.write("\n".getBytes());

			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;

[/code]

Tente assim:

[code]byte[] bytes = buffer.toByteArray();

response.setContentLength(bytes.length);

OuputStream out = response.getOutputStream();

out.write(bytes);

out.flush();
out.close();[/code]

Isso ae Cara… agora funcionou certinho!

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

“Grande abraço a todos”.

Obrigado.

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: