0

JSP、サーブレットでJasperReportsを使用して PDF を生成しています。文字列パラメータをレポートに渡しています。単一のpdfを生成しようとすると、pdfはうまく生成されますが、2つのpdfを生成しようとすると、1番目のパラメーターではpdfが生成されますが、2番目のパラメーターではpdfが生成されません。

ループを介してパラメーターを渡しています。

String array[]={"1233","234"};
HashMap params = new HashMap();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection cn=DriverManager.getConnection("jdbc:oracle:thin:@103.179.1.218:1521:tims","scoot","tiger");

for(int i=0;i<array.length;i++) {
    params.put("seller_name",array[i]);

    JasperDesign jasperDesign = JRXmlLoader.load(getServletContext().getRealPath("/")+"report\\CForm.jrxml");
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport,params, cn);
    byte[] pdfasbytes = JasperExportManager.exportReportToPdf(jasperprint);
    ServletOutputStream outstream=response.getOutputStream();
    response.setContentType("application/pdf");
    response.setContentLength(pdfasbytes.length);
    String fileName="report"+i+".pdf";
    response.setHeader("Content-disposition", "attachement; filename="+fileName);
    outstream.write(pdfasbytes);
    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outstream);
    params.clear();

}
4

3 に答える 3

2

応答で複数のファイルを送信する方法はありますが、ブラウザー間で一貫性がありません。単一ファイルの場合は pdf を返し、複数ファイルの場合は zip ファイルを返すのが最善の方法だと思います。その単一ファイルをブラウザで直接開く場合に備えて。

レポートを含む zip ファイルを返すようにコードを変更しましたが、そこにあるハードコードされた文字列 (seller_name) に対応し、一部の機能を単一のメソッドではなく他のクラスに移動する必要があります。

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    ZipOutputStream zipfile = null;

    try {
        String array[] = {"1233", "234"};
        HashMap params = new HashMap();

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@103.179.1.218:1521:tims", "scoot", "tiger");

        // Wrap the servlet output stream with a zip output stream
        zipfile = new ZipOutputStream(response.getOutputStream());

        for (int i = 0; i < array.length; i++) {
            params.put("seller_name", array[i]);

            JasperDesign jasperDesign = JRXmlLoader.load(getServletContext().getRealPath("/") + "report\\CForm.jrxml");
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);                
            JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport, params, cn);

            byte[] pdfAsBytes = JasperExportManager.exportReportToPdf(jasperprint, params, cn);

            // Create and add the zip entry 
            ZipEntry zipentry = new ZipEntry("report" + i + ".pdf");                                
            zipfile.putNextEntry(zipentry);                
            zipfile.write(pdfAsBytes);                                
        }            

        // Add the response headers
        response.setHeader("Content-disposition", "attachement; filename=" + UUID.randomUUID().toString() + ".zip");                
        response.setContentType("application/zip");            
    } catch (Exception ex) {
        log("An error occured", ex);
    } finally{
        try {
            // Flush the stream
            zipfile.flush();
        } catch (Exception e) {                
        }

        try {
            // Close the stream
            zipfile.close();
        } catch (Exception e) {                
        }
    }
}

それが役立つことを願っています!

于 2012-08-28T16:31:42.673 に答える
1

いくつかのコメント/提案

  1. サーブレットの応答はリクエストごとです。つまり、1 つの要求の後に 1 つの応答が続きます。
  2. ループの最後で ServletOutputSteam を閉じているため、それ以上の応答を停止しています。
  3. あなたのアプローチは、複数のPDFで機能するようになりました。解決策の 1 つは、ループ内で PDF のリストを作成し、すべての PDF の zip を作成してエンド ユーザーに送信することです。
于 2012-08-28T11:37:37.017 に答える
0

同じ出力ストリームを使用して 2 つの pdf を生成することは不可能です。出力ストリームを使用して生成できるファイルは 1 つだけです。

2 つ以上の pdf ファイルを生成する場合は、zip ファイルを作成して出力ストリームに書き込むことをお勧めします。

コードを分析すると、ループ中に出力ストリームを閉じてデータをフラッシュするため、2 つのファイルを生成できないことが明らかです。

そのような方法で、すでにコメントされている応答またはそのようなものを取得する必要があります。

于 2012-08-28T11:27:10.677 に答える