如何使用JSF2&amp ;;以pdf格式显示xhtml页面内容仅限iText,pdf不显示任何数据

时间:2014-01-14 14:55:46

标签: pdf jsf-2

我的要求: 点击JSF2中的“打印”按钮,打开一个pdf文件,使用xhtml页面中的数据进行打印。

以下代码打开一个没有数据的空白pdf文件。我希望pdf显示来自xhtml页面(URL)的数据

JSF代码: JSF有一些显示数据的字段

<h:commandButton id="printButton" value="Print" actionListener="#{myBean.print}" />

MyBean.Java代码:

 public void print()
 {
 ExternalContext externalContext =FacesContext.getCurrentInstance().getExternalContext();
 HttpServletResponse response = (HttpServletResponse)externalContext.getResponse();     

 String url = request.getRequestURL();

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 Document document = new Document(PageSize.LETTER);
 PdfWriter.getInstance(document, baos);
 document.open();
 document.add(new Paragraph(" Hello"));

 response.setHeader("Expires", "0");
 response.setHeader("Cache-Control",  "must-revalidate, post-check=0, pre-check=0");
 response.setHeader("Pragma", "public");

 response.setContentType("application/pdf");
 response.setHeader("Content-Disposition", "inline;filename=\"" + PDF_FILE_NAME + "\"");
 response.setContentLength(baos.size());
 ServletOutputStream out = response.getOutputStream();

 baos.writeTo(out);
 out.flush();
 out.close();

 document.close();
 System.out.println("Done."); 
 FacesContext.getCurrentInstance().responseComplete();
}

任何帮助将不胜感激。 提前谢谢,

1 个答案:

答案 0 :(得分:0)

baos仅在您致电document.close()时填写。所以,基本上,你正在为回复写一个空的baos

baos替换为response.getOutputStream(),以便iText直接写入响应,而不是通过不必要的规避。

PdfWriter.getInstance(document, response.getOutputStream());

不要忘记删除以下过多的行:

ServletOutputStream out = response.getOutputStream();
baos.writeTo(out);
out.flush();
out.close();

请注意,我只是根据目前提供的代码回答了所描述的问题症状。这一切都与&#34;如何显示xhtml页面内容&#34;完全无关。和&#34;显示来自xhtml页面(URL)的数据&#34;正如你在那里说的那样。