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/ポートレットに出力する適切な方法は何ですか?

4

3 に答える 3

2

取得する例外はjava.lang.ClassCastException: com.liferay.portlet.RenderResponseImpl cannot be cast to javax.portlet.ResourceResponse、クラスパスにいくつかのクラス(たとえば、portlet.jar)が2回あるように聞こえます。これは通常、グローバルクラスパスにあり、Webアプリケーションに含めないでください。

これは、ほとんどの場合、次のような例外がある場合に当てはまります。subclass cannot be cast to superclass

于 2013-02-13T08:31:27.960 に答える
1

ポートレットでserveResource()を呼び出してみてください。ボタンを押したら、ajaxを追加し、serveResourceとなるリソースURLを呼び出します。

HTH

于 2013-02-13T03:35:55.220 に答える
0

jsf2-export-pdf-portletデモをご覧になることをお勧めします。ポートレットライフサイクルのRESOURCE_PHASEを使用してPDFを返すために、JSF2.xResourceHandlerを使用します。

于 2013-02-14T20:38:13.587 に答える