使用iText,在内存上生成在磁盘上生成的PDF代替

问题描述:

我正在从Java应用程序生成PDF。 (伟大工程)的问题是,PDF是在磁盘上生成:使用iText,在内存上生成在磁盘上生成的PDF代替

 Document documento = new Document(PageSize.A4, 25, 25, 25, 25); 
     PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("/Users/sheldon/Desktop/Registry.pdf")); 
     documento.open(); 

     // Put some images on the PDF 
     for(byte[] imagen : imagenes) 
     { 
      Image hoja = Image.getInstance(imagen); 
      hoja.scaleToFit(documento.getPageSize().getHeight(), documento.getPageSize().getWidth()); 
      documento.add(hoja); 
     } 

     documento.addTitle("Generated Registry!"); 

     documento.close(); 

现在,当用户将搜索PDF,并打印出来,我不需要将它们存储在磁盘上。我需要(如果可能)在内存中生成它们并使用命令打开(使用acrobat reader)该文档。

这可能吗?任何想法。

如果不是,您的经验有什么建议。

先谢谢您。

编辑:

是一个标准的Java桌面应用程序。

+0

打开经由命令的PDF听起来OS特定的。你的目标是什么操作系统? – Thilo 2010-01-28 02:23:41

+0

用于开发Mac OS X Snow Leopard。 但该应用只能在Windows系统上运行。 – Sheldon 2010-01-28 02:24:14

对于这项工作打开时,Acrobat将需要能够访问另一个进程的内存(Java)。这不可能。

您可能只是想将文件写入系统的临时目录。

如果您的应用程序在Acrobat中打开PDF后保持打开状态,您可能需要考虑使用File.createTempFile()File.deleteOnExit()的组合来终止JVM时删除该文件。

+0

谢谢亚光。这听起来像是要走的路。 但是,一旦我创建了临时文件,是否有任何方法可以打开acrobat并传递该临时文件的路径,以便直接从Java打开? 感谢。 – Sheldon 2010-01-28 04:17:38

是的......这很容易。您只需将内容流式传输回请求者(即通过Servlet中的Response对象)。您还需要设置页眉

'Content-type: application/pdf' 

你也可能要设置这让它无法在浏览器

'Content-Disposition: attachment; filename="downloaded.pdf"' 
+0

我想他不是在谈论一个网络应用程序... – Thilo 2010-01-28 02:41:57

+0

感谢mlathe,但这是一个桌面应用程序:) – Sheldon 2010-01-28 02:51:24

+0

好点:)但如果有人关心如何做到这一点与Web应用程序! – mlathe 2010-01-28 17:48:59

我不是JAVA程序员,但我现在在iText上工作了一下,而且我有同样的问题。我想如果pdfWriter只需要一个outputStream,那就不妨使用java.io.ByteArrayOutputStream。这将是新的ByteArrayOutputStream()我想,在JAVA中,因为我正在使用ColdFusion。

对我来说,它的工作原理。

+0

谢谢多米尼克,现在我正在使用临时目录,但我会尝试你的方法:) – Sheldon 2010-02-10 13:56:40

如果你不想的iText生成文档到磁盘上,然后就这样做:

Document documento = new Document(PageSize.A4, 25, 25, 25, 25); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
PdfWriter writer = PdfWriter.getInstance(documento, out); 
(...) 
return out.getBytes(); 

这不会帮助你,虽然,因为阅读器无法访问它,直到你的地方写它Acrobat可以访问它。如果你不想把它放在磁盘上,然后在内存磁盘上挂载一个虚拟文件并在那里写你的文件。你如何做到这一点取决于你的操作系统。

+0

谢谢无论如何:) – Sheldon 2010-03-05 00:19:47

该要求可以用于Web应用程序,用户可以下载在运行时生成的PDF。 File.createTempFile()可能会为临时文件创建大量数字,而File.deleteOnExit()只会在JVM退出时调用 - 这不是理想的情况。

在这种情况下,明智地实施@behe建议的内容,最后将ByteArrayOutputStream对象写入ServletOutputStream

ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream(); 

//get ByteArrayOutputStream from behe's code snippet 
ByteArrayOutputStream bout = (...) 
bout.writeTo(servletOutputStream); 

httpServletResponse.setContentType("application/octet-stream"); 
httpServletResponse.setHeader("Content-Disposition", "attachment;filename=\"" + <fileName> + "\"");