I am trying to convert and export a JSF Page to PDF. I tried it the following way:
Bean:
public void createPDF() {
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL(url).toString());
renderer.layout();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" +PDF_FILE_NAME+ "\"");
OutputStream browserStream = response.getOutputStream();
renderer.createPDF(browserStream);
} catch (Exception ex) {
Logger.getLogger(PdfBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
Page with the Create PDF Button /home.xhtml
:
<ui:define name="content">
<center>
<h:form id="pdfgen">
<h:panelGrid columns="2">
<h:outputText value="Enter Name:"/>
<h:inputText value="#{pdfBean.name}"/>
</h:panelGrid>
<h:commandButton value="Create PDF" action="#{pdfBean.createPDF()}"/>
</h:form>
</center>
</ui:define>
The Page which I want to convert:
<ui:define name="content">
<center>
<h:outputText value="Hello #{pdfBean.name}"/>
</center>
</ui:define>
When I try that I get a PDF only once, then never again. I got following Facelet Exception:
SEVERE: Error Rendering View[/home.xhtml]
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
...
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
What am I doing wrong?
Updated Bean: see BalusC's answer:
public void createPDF() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String servername = externalContext.getRequestServerName();
String port = String.valueOf(externalContext.getRequestServerPort());
String appname = externalContext.getRequestContextPath();
String protocol = externalContext.getRequestScheme();
this.url = protocol + "://" + servername + ":" + port + appname + PDF_PAGE;
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL(url).toString());
renderer.layout();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" + PDF_FILE_NAME + "\"");
OutputStream browserStream = response.getOutputStream();
renderer.createPDF(browserStream);
} catch (Exception ex) {
Logger.getLogger(PdfBean.class.getName()).log(Level.SEVERE, null, ex);
}
facesContext.responseComplete();
}