Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image ServletOutputStream的PDF文件中的图像问题_Image_Pdf_Jsf_Itext - Fatal编程技术网

Image ServletOutputStream的PDF文件中的图像问题

Image ServletOutputStream的PDF文件中的图像问题,image,pdf,jsf,itext,Image,Pdf,Jsf,Itext,我找了很多,但没能解决这个问题。我正在用iText生成PDF文件。如果我使用FileOutputStream,一切都很好,但是当我尝试使用ServletOutputStream时,图像不会出现在PDF文件中 当我用文本编辑器打开PDF文件时,我看到有这么多“?”。这意味着有东西在减少字节数。这就像尝试将二进制文件与JSP结合使用一样。但我使用的是JSF、Tomcat6.0、Spring3.0和Richfaces 下面是使用ServletOutputStream生成PDF并导致问题的代码 publ

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

当我用文本编辑器打开PDF文件时,我看到有这么多“?”。这意味着有东西在减少字节数。这就像尝试将二进制文件与JSP结合使用一样。但我使用的是JSF、Tomcat6.0、Spring3.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(); 公共静态void saveChartToPDF(JFreeChart图表,字符串文件名,HttpServletResponse)引发异常{ ByteArrayOutputStream bas=新的ByteArrayOutputStream(); 文档=新文档(); document.addCreationDate(); document.setPageSize(PageSize.A4.rotate()); PdfWriter writer=PdfWriter.getInstance(文档,BAS); document.open(); PdfContentByte cb=writer.getDirectContent(); PdfTemplate tp=cb.createTemplate(300300); Graphics2D g2=tp.createGraphics(300300,新的DefaultFontMapper()); 矩形2D r2D=新矩形2D.Double(0,0,300,300); 图表绘制(g2、r2D、空); g2.dispose(); cb.addTemplate(tp,0,0); document.close(); response.setContentType(“application/pdf”); response.setHeader(“Expires”、“0”); setHeader(“缓存控制”,“必须重新验证,后检查=0,预检查=0”); 响应。setHeader(“Pragma”、“public”); response.setHeader(“内容处置”、“附件;文件名=“+filename+”.pdf”); response.setContentLength(baos.size()); ServletOutputStream out=response.getOutputStream(); 资产负债表(注销); out.flush(); 下面是使用FileOutputStream()的代码

公共静态void saveChartToPDF(JFreeChart图表,字符串文件名,HttpServletResponse)引发异常{ 文档=新文档(); document.addCreationDate(); document.setPageSize(PageSize.A4.rotate()); PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(“c:/test1.pdf”); document.open(); PdfContentByte cb=writer.getDirectContent(); PdfTemplate tp=cb.createTemplate(300300); Graphics2D g2=tp.createGraphics(300300,新的DefaultFontMapper()); 矩形2D r2D=新矩形2D.Double(0,0,300,300); 图表绘制(g2、r2D、空); g2.dispose(); cb.addTemplate(tp,0,0); document.close(); 我找不到字节被刮除的原因


非常感谢您的帮助,

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

response.reset();
out.close();
在设置标题之前,几乎不可能已经在响应上设置/写入了某些内容(通常是通过某种自定义
过滤器设置/写入的)

您还需要确保您拨打

response.reset();
out.close();
而不是
out.flush()
,以防止以后将任何其他字节写入响应体

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

FacesContext.getCurrentInstance().responseComplete();

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

哦,是的!它工作得很好。非常感谢,非常感谢。我应该在结束部分更加小心。