0

私の要件は、JFreeChartによって生成されたチャートをPDFドキュメントに入れることです

チャートのリストを表示するには、BufferedImageオブジェクトのリストを取得しています

private BufferedImage generateChartForPDF (DefaultCategoryDataset dataset,String threadName) {
        String title = "Skill  : "+threadName ;

        JFreeChart chart = ChartFactory.createBarChart(title, "Work Completion",
                "Perce %", dataset, PlotOrientation.VERTICAL, true, true,
                false);

        return chart.createBufferedImage(500, 300) ;
    }

これから私はバッファリングされた画像のリストを記入し、以下の方法でPDFでチャートを記入しています

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document pdfDocument = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
setGraphImagesInPDF(pdfDocument, buffImageList) ;
private void setGraphImagesInPDF (Document pdfDocument,List<BufferedImage> buffImageList) throws DocumentException, IOException {
        for (BufferedImage bufferedImage : buffImageList) {
            Image image = Image.getInstance(bufferedImage,Color.LIGHT_GRAY);
            pdfDocument.newPage();
            image.setAbsolutePosition(300, 300) ;
            pdfDocument.add(image);
        }
    }

これが私のPDF内のチャートを埋める方法です。これで、content-dispositionを添付ファイルに設定すると、UIで添付ファイルとしての応答が得られず、ブラウザーが別のページでPDFを開いています。

ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
setResponseHeaders(response,"Data");
outputStream.flush();
outputStream.close();

private void setResponseHeaders(HttpServletResponse response,String reportingType) {
        System.out.println("setting response headers .. ");
        response.setHeader("Content-Disposition",
                "attachment; filename=\""+reportingType+" Reports.pdf\"");
        response.setContentType("application/pdf");
    }

応答のヘッダーでcontent-dispostiontypeをattachmentに設定しましたが、これは添付ファイルとして開かれていません。コードのチャート部分を削除した後も、同じことが正常に機能します。これについて私を助けてください。ありがとう

4

1 に答える 1

2

ブルーノのコメントによると、これはiText / JFreechartの質問ではなく、servlet/httpの質問です。

出力ストリームを取得する前に、応答ヘッダーを設定する必要があります。これは必須です。次のように、メソッドのcontent-lengthヘッダーも設定することをお勧めします。setResponseHeaders

response.setContentLength(baos.size());

したがって、コードは次のようになります。

setResponseHeaders(response, baos, "Data");
ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
outputStream.flush();
outputStream.close();
于 2012-09-17T06:10:53.113 に答える