从Liferay的JSF Portlet显示pdf的问题

时间:2010-03-02 08:37:36

标签: java pdf portlet liferay

我使用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

1 个答案:

答案 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资源处理。