getOutputStream() has already been called for this response

Olá, estou utilizando iText para gerar meus relatórios em um projeto CDI + JSF 2.

Para enviar o pdf gerado para o cliente estou seguindo o exemplo do livro iText in Action:

[code]
Document document = new Document();
try {
response.setContentType(“application/pdf”);
PdfWriter.getInstance(document, response.getOutputStream());

document.open();
document.add(new Paragraph(“Hello World”));
document.add(new Paragraph(new Date().toString()));
}
catch(DocumentException de) {
de.printStackTrace();
System.err.println("document: " + de.getMessage());
}
document.close();[/code]

O PDF é enviado corretamente ao cliente e nenhum comportamento inesperado é identificado por meio da aplicação, porém é exibida uma exceção no log do servidor (JBoss AS 7):

14:46:08,580 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/portaldoestudante-web].[Faces Servlet]] (http--189.90.70.58-8080-3) Servlet.service() for servlet Faces Servlet threw exception: java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:614) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:199) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:150) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.context.ExternalContextWrapper.getResponseOutputWriter(ExternalContextWrapper.java:669) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.jboss.seam.faces.environment.SeamExternalContext$Proxy$_$$_WeldClientProxy.getResponseOutputWriter(SeamExternalContext$Proxy$_$$_WeldClientProxy.java) [seam-faces-3.0.0.Final.jar:] at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:930) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:376) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:480) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49) [jboss-as-jpa-7.0.2.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] at java.lang.Thread.run(Unknown Source) [:1.6.0_27]

Eu pesquisei sobre o erro e parece que a maior parte dos casos está relacionado com JSPs (que eu não utilizo, uso apenas facelets), em que há espaços em branco ou quebras de linha na página. Porém não sei como tratar dessa forma na minha página que é composta por diversas tabelas e o seguinte botão que é o responsável por disparar o método que gera o PDF:

<p:commandButton id="button_historico_escolar" icon="ui-icon ui-icon-document" style="width: 180px" ajax="false" value="Exportar para PDF" actionListener="#{historicoAcademicoController.pdfActionListener(event,'historico_escolar')}" immediate="true"/>

Tentei também chamar response.reset() antes e depois de gerar o PDF, porém deu erro ainda assim.

Alguém já enfrentou este problema e conseguiu resolver?

Olá, hfluz. Tenho um problema similar ao seu.

Em geral, utilizo Vraptor + JSP, com pouca experiência.

¨Criei um gráfico utilizando o framework JFreeChart. Ele é exibido numa página .jsp.

¨Problema: toda vez que a página é requisitada através do navegador a java.lang.IllegalStateException: getOutputStream() has already been called for this response é disparada e descrita no log.

Como podem ver, a página não contém espaços em branco(motivo bastante argumentado sobre esse erro):

&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%&gt;    
&lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%&gt;
&lt;%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%&gt;  
&lt;%@ page import="java.util.Date, java.text.*" %&gt;  
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;%@page import="br.com.industrial.grafico.GraficoApontamento"%&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
	&lt;head&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;
		&lt;title&gt;Gráfico&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;	
		&lt;%
			GraficoApontamento grafico = new GraficoApontamento();
			grafico.processar(response);
		%&gt;
	&lt;/body&gt;		
&lt;/html&gt;

Aqui, a classe em questão:

public class GraficoApontamento { 

	DefaultCategoryDataset dataset;
	CategoryPlot plot;
	JFreeChart grafico;
	CategoryItemRenderer renderer;
	
	public GraficoApontamento() { 
		
		this.dataset = new DefaultCategoryDataset();
		this.grafico = ChartFactory.createBarChart("Performance das Linhas de Produção", "Linhas",
				 "Eficiência(%)", dataset, PlotOrientation.VERTICAL,
				 true, true, true);
		this.plot = this.grafico.getCategoryPlot();
		this.renderer = this.grafico.getCategoryPlot().getRenderer();		
		
	}
	
	public void processar(HttpServletResponse response) {	

		try {			
			
			teste();			
						
			File image = File.createTempFile("image", "tmp");			

			ChartUtilities.saveChartAsPNG(image, grafico, 1500, 728);			
			
			FileInputStream fileInStream = new FileInputStream(image);				 	
			long fileLength;
			byte[] byteStream;	
			fileLength = image.length();	
			byteStream = new byte[(int)fileLength];
			
			fileInStream.read(byteStream, 0, (int)fileLength);	
			response.setContentType("image/png");	
			response.setContentLength((int)fileLength);	
			response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");	
			response.setHeader("Pragma", "no-cache");			
			fileInStream.close();
						
			OutputStream outStream = response.getOutputStream(); //a exceção provavelmente vem daqui. Caso eu retire a linha(tendo que deletar as posteriores também), o gráfico NÃO e exibido na página!
			outStream.write(byteStream);
			outStream.flush();
			outStream.close();		
			
		}catch (IOException e) {System.err.println("Falha durante a criação do gráfico.");}	
	
	}
	
	public void teste() {
		
		grafico.setTitle("MUDEI O TITULO.");
		
		dataset.addValue(11.1, "18 L", "Linhas de Produção");			
		dataset.addValue(52.7, "14 L", "Linhas de Produção");
		dataset.addValue(22.7, "10 L", "Linhas de Produção");
		dataset.addValue(79.4, "3/4 L","Linhas de Produção");		
		
		renderer.setSeriesPaint(0, Color.BLUE);	
		renderer.setSeriesPaint(1, Color.BLACK);
		renderer.setSeriesPaint(2, Color.CYAN);
		renderer.setSeriesPaint(3, Color.RED);
		
	}
	
}

Então, como faço para exibir um gráfico da Jfree na página sem disparar a exceção?