gpt4 book ai didi

ServletOutputStream 的 PDF 文件中的图像问题

转载 作者:行者123 更新时间:2023-12-05 05:29:02 26 4
gpt4 key购买 nike

找了很多都没有解决这个问题。我正在用 iText 生成 PDF 文件。如果我使用 FileOutputStream,一切都很好,但是当我尝试使用 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();

我找不到为什么字节被剃光。

非常感谢您的帮助,

最佳答案

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

response.reset();

在设置 header 之前,很少有可能已经在响应中设置/写入了某些内容(通常是通过某种自定义 Filter)。

您还需要确保调用

out.close();

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

最后,在 JSF 中你需要调用

FacesContext.getCurrentInstance().responseComplete();

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

关于ServletOutputStream 的 PDF 文件中的图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com