我尝试将当前的jsf页面导出为pdf。代码如下:
使用命令按钮index.html
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:inputText value="#{bean.name}" id="name" ></h:inputText>
<h:commandButton value="click" id="btn" actionListener="#{bean.writePDF}"></h:commandButton>
</h:form>
</h:body></html>
writePDF()
功能操作按钮如下:
public void writePDF() {
String PDF_FILE_NAME = "converted.pdf";
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext =facesContext.getExternalContext();
HttpServletRequest request = (HttpServletRequest)externalContext.getRequest();
HttpSession session = (HttpSession) externalContext.getSession(true);
String url = request.getRequestURL().append(";jsessionid=").append(session.getId().toString()).toString();
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 + "\"");
ServletOutputStream browserStream = response.getOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
renderer.createPDF(browserStream);
renderer.finishPDF();
facesContext.responseComplete();
}
catch (Exception ex)
{
ex.printStackTrace();
}
facesContext.responseComplete();
}
单击命令按钮时,只生成一个空白的pdf页面,其中没有控件和值。 亲切的建议,我做错了什么。
提前致谢。
答案 0 :(得分:1)
我刚刚完成了给定代码的测试。它确实没有显示任何东西。事实证明,Flyingsaucer根本不会吃HTML表单元素,正如我在您对您的问题的第一条评论中已经猜到的那样。
您最好的选择是通过输出文本而不是输入文本来显示数据。要动态实现此目的,您可能需要添加一个请求参数,该参数触发输入/输出的条件呈现。
E.g。
<h:inputText value="#{bean.name}" id="name" rendered="#{not param.pdf}"/>
<h:outputText value="#{bean.name}" rendered="#{param.pdf}"/>
然后在查询字符串中添加pdf=true
。
String url = request.getRequestURL().append(";jsessionid=").append(session.getId()).append("?pdf=true").toString();
或者只是创建一个使用相同bean的不同页面,然后传递其URL。