java - 一起使用 jfree 和 itext 时,无法将响应的内容处置设置为附件

标签 java jakarta-ee itext jfreechart

我的要求是将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");
    }

即使我将响应 header 中的内容处置类型设置为附件,但这也不会作为附件打开。删除代码的图表部分后,同样可以正常工作。请帮我解决这个问题。谢谢

最佳答案

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

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

response.setContentLength(baos.size());

所以你的代码应该是:

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

关于java - 一起使用 jfree 和 itext 时,无法将响应的内容处置设置为附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12436091/

相关文章:

java - spring发送邮件出现异常

java - 如何使unicode从java中的方法返回类型打印

java - 装饰器模式 : value of field of concrete component is the value of field from component, 但为什么呢?

jakarta-ee - 在最小的 tomcat 上运行完整的 Java EE 应用程序(不仅仅是 Webprofile)

java - 包含 map map 中的对象

Eclipse,如何合并2个版本

c# - 如何检查PDF中的页面是否为A4

c# - 切换文档渲染器 - 无法在已刷新的页面上绘制元素

java - 通过 HTTP 转换文档

java - JodaTime:如何获取 DateTimeZone 的人类可读名称