这里有点麻烦。基本前提是我需要点击一个按钮,生成HTML,创建PDF,并放入输出流中下载:
<ice:commandButton title="Download"
image="/images/dl.png"
value="Download"
action="#{bean.downloadPDF}">
</ice:commandButton>
public void downloadPDF() throws IOException {
PD4ML pdf = new PD4ML();
pdf.setPageSize(PD4Constants.LETTER);
pdf.setPageInsets(new Insets(0, 0, 0, 0));
pdf.setHtmlWidth(1000);
pdf.enableImgSplit(false);
pdf.generateOutlines(false);
File pdfFile = new File("tmp.pdf");
FileOutputStream fos = new FileOutputStream(pdfFile);
StringReader sr = new StringReader("<p>Testing Download</p>");
pdf.render(sr, fos);
FacesContext facesContext = FacesContext.getCurrentInstance();
PortletResponse portletResponse= (PortletResponse)facesContext.getExternalContext().getResponse();
ResourceResponse portletResourceResponse = (ResourceResponse) portletResponse;
portletResourceResponse.setContentType("application/pdf");
OutputStream out = portletResourceResponse.getPortletOutputStream();
out.flush();
facesContext.responseComplete();
}
我遇到的问题是在pdf.render()
之后,当我尝试基于当前上下文生成响应并转换为ResourceResponse
:时
java.lang.ClassCastException: com.liferay.portlet.RenderResponseImpl cannot be cast to javax.portlet.ResourceResponse
获取该文件并将其输出到Liferay/portlet中的正确方法是什么?
您得到的异常java.lang.ClassCastException: com.liferay.portlet.RenderResponseImpl cannot be cast to javax.portlet.ResourceResponse
听起来像是在类路径上有两个类(例如portlet.jar)。这通常在全局类路径中,您的web应用程序中不能有它。
当您遇到subclass cannot be cast to superclass
这样的异常时,情况几乎总是如此
尝试在portlet中调用serveResource()。当您点击一个按钮时,添加ajax并调用资源url,它将服务于资源。
HTH
我建议您查看jsf2导出pdf portlet演示。它使用JSF2.x资源处理程序,以便使用portlet生命周期的RESOURCE_PHASE返回PDF。