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(); |
在设置报头之前,几乎不可能已经在响应上设置/写入了某些内容(通常是通过某种自定义
你还需要确保你打电话给
1 | out.close(); |
而不是
最后,在JSF中,您需要调用
1 | FacesContext.getCurrentInstance().responseComplete(); |
为了防止JSF将请求/响应转发到视图(呈现响应)。