我使用liferay 5.2和jsf-portlet。
从页面我想按一个按钮生成一个PDF。 在managedbean中,我构建了pdf,我想在回复中显示它。
在名为ByteArrayOutputStream
的{{1}}中,我的pdf是使用JasperReport构建的。
我写道:
outputStream
我没有看到任何输出!在jboss日志中,我读到: PortletResponse portletResponse = (PortletResponse)externalCtx.getResponse();
HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);
ServletOutputStream out = httpResponse.getOutputStream();
String filename="Pdf" + System.currentTimeMillis()+".pdf";
httpResponse.reset();
httpResponse.setContentType("application/pdf");
httpResponse.setHeader("Content-Disposition", "attachment; filename=\""+ filename + "\"");
httpResponse.setContentLength(outputStream.size());
outputStream.writeTo(out);
out.flush();
out.close();
....
有什么问题?
LOG
IllegaStateException
答案 0 :(得分:3)
执行此操作的唯一合适方法是使用JSR-286规范的“RESOURCE”阶段。目前在您的代码中,您处于“RENDER”阶段,强制只允许“text / html”编码。
在纯JSP中,标记看起来像:
<portlet:resourceURL id="/super-cool.pdf" />
然后在portlet类中实现serveResource(ResourceRequest req,ResourceResponse res)方法并读取调用ResourceRequest的req.getResourceId()方法,并调用业务逻辑(创建PDF)并随后将其写入输出流。
在JSF中,我不完全确定这是否支持,这意味着唯一的方法是将任务委托给servlet调用。查看JSF以查看是否实现了JSR-286资源处理。