Liferay-创建PDF并输出到流



这里有点麻烦。基本前提是我需要点击一个按钮,生成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。

相关内容

  • 没有找到相关文章

最新更新