1

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

4

3 回答 3

2

你得到的例外,java.lang.ClassCastException: com.liferay.portlet.RenderResponseImpl cannot be cast to javax.portlet.ResourceResponse听起来你的类路径上有一些类(例如portlet.jar)两次。这通常位于全局类路径中,并且您不得在 Web 应用程序中使用它。

当您遇到异常时,几乎总是这样subclass cannot be cast to superclass

于 2013-02-13T08:31:27.960 回答
1

尝试在 portlet 中调用 serveResource()。当您点击按钮时,添加 ajax 并调用将提供资源的资源 url。

高温高压

于 2013-02-13T03:35:55.220 回答
0

我建议您查看jsf2-export-pdf-portlet演示。它使用 JSF 2.x ResourceHandler 以便使用 portlet 生命周期的 RESOURCE_PHASE 返回 PDF。

于 2013-02-14T20:38:13.587 回答