ServletOutputStream的PDF文件中的图像问题

Images in PDF files problem for ServletOutputStream

我找了很多东西,但没能解决这个问题。我正在用IText生成PDF文件。如果我使用fileoutputstream,一切都很好,但是当我尝试使用servletoutputstream时,图像不会出现在PDF文件中。

当我用文本编辑器打开PDF文件时,我看到了吗???"这么多。这意味着有些东西正在减少字节数。这就像尝试在JSP中使用二进制文件。但我使用的是JSF、Tomcat6.0、Spring3.0和RichFaces。

下面是用servletoutputstream生成PDF并导致问题的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void saveChartToPDF(JFreeChart chart, String fileName, HttpServletResponse response) throws Exception {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

Document document = new Document();
document.addCreationDate();
document.setPageSize(PageSize.A4.rotate());

PdfWriter writer = PdfWriter.getInstance(document, baos);
document.open();

PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(300, 300);
Graphics2D g2 = tp.createGraphics(300, 300, new DefaultFontMapper());

Rectangle2D r2D = new Rectangle2D.Double(0, 0, 300, 300);
chart.draw(g2, r2D, null);
g2.dispose();
cb.addTemplate(tp, 0, 0);

document.close();

response.setContentType("application/pdf");
response.setHeader("Expires","0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","public");
response.setHeader("Content-disposition","attachment;filename=" + fileName +".pdf");
response.setContentLength(baos.size());

ServletOutputStream out = response.getOutputStream();
baos.writeTo(out);
out.flush();

下面是使用fileoutputstream()的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void saveChartToPDF(JFreeChart chart, String fileName, HttpServletResponse response) throws Exception {

Document document = new Document();
document.addCreationDate();
document.setPageSize(PageSize.A4.rotate());

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("c:/test1.pdf"));

document.open();

PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(300, 300);
Graphics2D g2 = tp.createGraphics(300, 300, new DefaultFontMapper());

Rectangle2D r2D = new Rectangle2D.Double(0, 0, 300, 300);
chart.draw(g2, r2D, null);
g2.dispose();
cb.addTemplate(tp, 0, 0);

document.close();

我找不到字节被剃掉的原因。

非常感谢你的帮助,


在JSF中完全掌握响应时,需要确保调用

1
response.reset();

在设置报头之前,几乎不可能已经在响应上设置/写入了某些内容(通常是通过某种自定义Filter设置/写入的)。

你还需要确保你打电话给

1
out.close();

而不是out.flush(),以防止随后任何其他字节写入响应主体。

最后,在JSF中,您需要调用

1
FacesContext.getCurrentInstance().responseComplete();

为了防止JSF将请求/响应转发到视图(呈现响应)。