Liferay - 创建PDF并输出到流

时间:2013-02-12 18:55:22

标签: java jsf liferay

这里有点麻烦。基本前提是我需要点击一个按钮,生成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中输出它的正确方法是什么?

3 个答案:

答案 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。