我的要求是将JFreeChart生成的图表放入我的PDF文档中
要显示图表列表,正在获取缓冲图像对象列表
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");
}
即使我在响应的标题中将内容发布类型设置为附件,这也不会作为附件打开。删除代码的图表部分后,同样可以正常工作。请帮我解决这个问题。谢谢
根据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();