这里有点麻烦。基本前提是我需要点击一个按钮,生成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中输出它的正确方法是什么?
答案 0 :(得分:2)
你得到的例外,java.lang.ClassCastException: com.liferay.portlet.RenderResponseImpl cannot be cast to javax.portlet.ResourceResponse
听起来就像你在类路径上有两次类(例如portlet.jar)。这通常位于全局类路径中,您不能在Web应用程序中使用它。
当您遇到subclass cannot be cast to superclass
答案 1 :(得分:1)
尝试在portlet中调用serveResource()。当你点击一个按钮时,添加ajax并调用将服务于资源的资源URL。
HTH
答案 2 :(得分:0)
我建议您查看jsf2-export-pdf-portlet演示。它使用JSF 2.x ResourceHandler来使用portlet生命周期的RESOURCE_PHASE返回PDF。