我正在尝试使用飞碟将JSF页面转换为PDF。
@ManagedBean
@SessionScoped
public class ReportController {
...
public void createPDF() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL("http://myserver.com/report.xhtml").toString());
renderer.layout();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename="report.pdf");
OutputStream browserStream = response.getOutputStream();
renderer.createPDF(browserStream);
} catch (Exception ex) {
...
}
facesContext.responseComplete();
}
}
在/report.xhtml页面中,我有一些支持bean参数,它们的值应该出现在pdf中。但事实并非如此。如果访问xhtml页面,则值显示正确。我想这是因为渲染器。setDocument(String uri)为从指定url加载文档创建新的连接(和新的会话)。如何在当前会话中获得xhtml页面内容(包含所有参数值)?
通过ExternalContext#getSession()
抓取HttpSession
,并将其ID添加为jsessionid
URL路径片段。
HttpSession session = (HttpSession) externalContext.getSession(true);
String url = "http://myserver.com/report.xhtml;jsessionid=" + session.getId();
// ...
请注意,如果有查询字符串,应该出现在后面,而不是前面。