【问题标题】:Images in PDF files problem for ServletOutputStreamServletOutputStream 的 PDF 文件中的图像问题
【发布时间】:2010-12-22 20:57:07
【问题描述】:

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

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

这是使用 ServletOutputStream 生成 PDF 并导致问题的代码

公共静态无效 saveChartToPDF(JFreeChart 图表,字符串文件名,HttpServletResponse 响应)抛出异常 { ByteArrayOutputStream baos = new ByteArrayOutputStream(); 文档文档 = 新文档(); 文档.addCreationDate(); document.setPageSize(PageSize.A4.rotate()); PdfWriter writer = PdfWriter.getInstance(document, baos); 文档.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); 文档.close(); response.setContentType("应用程序/pdf"); response.setHeader("过期", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); response.setHeader("内容配置", "附件;filename=" + fileName + ".pdf"); response.setContentLength(baos.size()); ServletOutputStream out = response.getOutputStream(); baos.writeTo(out); out.flush();

这里的代码可以与 FileOutputStream() 一起正常工作

公共静态无效 saveChartToPDF(JFreeChart 图表,字符串文件名,HttpServletResponse 响应)抛出异常 { 文档文档 = 新文档(); 文档.addCreationDate(); document.setPageSize(PageSize.A4.rotate()); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("c:/test1.pdf")); 文档.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); 文档.close();

我找不到字节被削减的原因。

非常感谢您的帮助,

【问题讨论】:

    标签: image pdf jsf itext


    【解决方案1】:

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

    response.reset();
    

    在设置标头之前,响应中已经设置/写入某些内容的可能性很小(通常由某种自定义 Filter 进行)。

    你还需要确保你打电话

    out.close();
    

    而不是out.flush(),以防止之后将任何其他字节写入响应正文。

    最后,在JSF中你需要调用

    FacesContext.getCurrentInstance().responseComplete();
    

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

    【讨论】:

    • 哦,是的!它工作得很好。非常感谢,非常感谢。我应该在关闭部分时更加小心。
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2011-10-24
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多