8

@ActionMappingの場合、ユーザー用のPDFファイルを作成します。このPDFをファイルの保存/開くダイアログボックスの形式でユーザーに返すにはどうすればよいのでしょうか。生成が成功した場合は、ダウンロードリンクを表示するよりもこれを使用したいと思います。

私はspring-mvc3.0.5をportletと組み合わせて使用​​しています。しかし、誰かが通常のアプリケーションへのポインタを持っているなら、私はおそらくそこからそれを理解することができます。2.0の場合、pdfgeneratorクラスの拡張とweb.xmlの調整について何かを読みましたが、最近はPOJOが必要です...。


編集:Adeelの提案の後のコード:

File file = new File("C:\\test.pdf");
        response.setContentType("application/pdf");

        try {
            byte[] b = new byte[(int) file.length()];
            OutputStream out = response.getPortletOutputStream();
            out.write(new FileInputStream(file).read(b));
            out.flush();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "users/main";
4

4 に答える 4

8

そのファイルを に直接書き込むことができます。response writer変更することを忘れないでくださいcontentType。例えば、

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=something.pdf");
OutputStream out = response.getOutputStream();
out.write(pdfFileContentInBytes);
out.flush();                   

まあ、私はそれHttpServletResponseがあなたが持っているものだと思っていましたが、そうではありません. ポートレットで作業しているので、それはRenderResponseオブジェクトです。インターネットで検索したところ、この点に関して役立つリンクがいくつか見つかりました。

  • 最初にLotus Form Server Portletの例を取り上げます。これは、 を使用してポートレットを構成する際に複数の MIME タイプを許可する方法を示していますportlet.xml

  • これはSpring Portlet docsで、portlet.xml を使用してポートレットを構成する方法を示しています。mime-type に関する XML 要素がapplication/pdfあります。そこに値を指定できるかどうかを確認してください。

別のアイデアは、パラメータをActionResponse responseではなく に変更することですRenderResponse response。私はここで少しぼやけています。あなたのスーパークラスが何であるかわかりませんか? どんな方法ですか?等....

私には、問題はポートレット応答の許可/許可されていない MIME タイプにあるようです。

于 2011-01-04T10:45:33.600 に答える
4

spring mvc、ResourceResponse レスポンスで

response.reset();
response.setContentType("application/pdf");
response.setProperty("Content-disposition", "attachment; filename=\"" +"example.pdf" +"\"");

InputStream fontInputStream = request.getPortletSession()
                .getPortletContext()
                .getResourceAsStream("/WEB-INF/classes/arial.ttf");
Document document = new Document(PageSize.A4, 40, 40, 40, 50);
PdfWriter writer = PdfWriter.getInstance(document,
response.getPortletOutputStream());
document.addAuthor("XYZ");
document.addTitle("ASDF");
document.open();
于 2011-06-21T12:06:08.137 に答える
1

しばらく考えた後の答えは次のとおりです 。Spring Portlet MVC アーキテクチャで PDF を提供する - Liferay 6.0.6

解決策は、JSR 286 の Resource Serving Mechanism を使用することです。ResourceResponse resにはres.setContentType("application/pdf");メソッドがあるため、それを使用して任意のタイプのリソースを処理できます。添付ファイルとしてダウンロードする必要がある場合は、次を使用します。

res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");

于 2012-01-24T19:51:51.367 に答える
0

私のコード:

ResourceMapping("getPDF")

public void descargarRecibo(ResourceRequest request,
        ResourceResponse response, PortletSession session,
        ModelMap modelMap) {
    FileInputStream fileInputStream = null;
    BufferedInputStream bufferedInputStream = null;

    String fileURL = "c:/intranetdoc/PDetalleLlamadas/file.pdf";

    try {
        fileInputStream = new java.io.FileInputStream(fileURL);
        OutputStream outputStream = response.getPortletOutputStream();
        response.setContentType("application/pdf");
        response.addProperty("Content-Disposition", "attachment; filename="
                + fileName);
        bufferedInputStream = new java.io.BufferedInputStream(
                fileInputStream);
        byte[] bytes = new byte[bufferedInputStream.available()];
        response.setContentLength(bytes.length);
        int aByte = 0;
        while ((aByte = bufferedInputStream.read()) != -1) {
            outputStream.write(aByte);
        }
        outputStream.flush();
        bufferedInputStream.close();
        response.flushBuffer();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2013-01-24T22:11:20.870 に答える