【问题标题】:Response's content-disposition cannot be set to attachment while using jfree and itext togetherjfree 和 itext 一起使用时,响应的 content-disposition 不能设置为附件
【发布时间】:2012-09-15 09:17:04
【问题描述】:

我的要求是将 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 中填充图表的方式。现在,当我将内容处置设置为附件时,在我的 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-dispostion 类型设置为附件,这也不是作为附件打开的。删除代码的图表部分后,同样可以正常工作。请帮助我。谢谢

【问题讨论】:

  • (1) 为什么这个问题被标记为 itext/jfreechart。这个问题是关于响应头的,不是吗?使用 iText 或 JFreeChart 都没有关系。 (2) 你能在不同的机器上使用不同的浏览器重现这个问题吗?我的猜测是您的本地配置问题无法在每台客户端机器上重现。

标签: java jakarta-ee itext jfreechart


【解决方案1】:

根据 Bruno 的评论,这不是 iText/JFreechart 问题,而是 servlet/http 问题。

您必须在获得输出流之前设置响应标头:这是强制性的。我建议您在setResponseHeaders 方法中也设置content-length 标头,如下所示:

response.setContentLength(baos.size());

所以你的代码应该是:

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

【讨论】:

  • 完美!!有效 !! :-) “先写标题,再写” :-)
猜你喜欢
  • 2011-11-19
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多