2010-12-22 66 views
2

我搜索了很多,但无法解决此问题。我正在用iText生成PDF文件。如果我使用FileOutputStream一切都很好,但是当我尝试使用ServletOutputStream时,图像不会出现在PDF文件中。ServletOutputStream PDF文件中的图像问题

当我用文本编辑器打开PDF文件时,我看到有“???”非常。这意味着有些东西正在削减字节。这就像试图在JSP中使用二进制文件。但我使用的是JSF,Tomcat 6.0,Spring 3.0和Richfaces。

下面是与ServletOutputStream的生成PDF,并导致问题

 
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中()

 
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(); 

我找不到为什么字节作为代码剃光。

非常感谢你的帮助,

回答

2

当你的手在JSF充分考虑了回应,你需要确保你打电话

response.reset(); 

您设置的头前,有即小可能已经在响应中设置/写入了某些内容(通常由某种自定义Filter)。

你还需要确保你打电话

out.close(); 

,而不是out.flush(),以防止任何其它字节将在后面写到响应体。

最后,在JSF需要调用

FacesContext.getCurrentInstance().responseComplete(); 

防止JSF将转发请求/响应到一个视图(渲染响应)。

+0

哦,是的!它运行良好。非常感谢,非常感谢。关闭部件时我应该更加小心。 – jiraiya 2010-12-23 06:30:28