我正在尝试使用Flying Saucer从xhtml页面生成PDF。我的相关代码如下。
pdf.xhtml本身很好用。
然而,如果我尝试使用CreatePDF支持bean方法创建pdf,则生成的pdf包含EL表达式#{basvuruBean.sirketAdi},而不是输入支持bean的sirketadi属性的值。支持bean是会话。
我的代码出了什么问题?
提前感谢。
从jsf页面使用支持bean生成pdf的另一个库建议?
xhtml页面,它是生成pdf的基础:pdf.xhtml
<!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"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
</h:head>
<body>Sirket Adı: #{basvuruBean.sirketAdi}
</body>
</html>
在basvuruBean支持bean中创建PDF方法
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();
HttpSession session = (HttpSession) externalContext.getSession(true);
this.url = protocol + "://" + servername + ":" + port + appname + "/"+PDF_PAGE+";JSESSIONID=" + session.getId();
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL(this.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(BasvuruBean.class.getName()).log(Level.SEVERE, null, ex);
}
facesContext.responseComplete();
答案 0 :(得分:0)
如果请求网址与FacesServlet
的网址格式不匹配,就会发生这种情况。它是负责执行所有JSF / EL工作的人。因此,如果您已将Faces Servlet映射到例如*.jsf
的网址格式,那么您应该指向pdf.jsf
,而不是pdf.xhtml
。
无关,jsessionid
路径片段必须全部小写。