Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
Java 使用iText,在内存中生成在磁盘上生成的PDF_Java_Pdf Generation_Itext - Fatal编程技术网

Java 使用iText,在内存中生成在磁盘上生成的PDF

Java 使用iText,在内存中生成在磁盘上生成的PDF,java,pdf-generation,itext,Java,Pdf Generation,Itext,我正在从Java应用程序生成PDF。(而且效果很好)问题是PDF是在磁盘上生成的,如下所示: Document documento = new Document(PageSize.A4, 25, 25, 25, 25); PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("/Users/sheldon/Desktop/Registry.pdf")); d

我正在从Java应用程序生成PDF。(而且效果很好)问题是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并打印它们,我不需要将它们存储在磁盘上。我需要(如果可能的话)在内存中生成它们,并使用命令(使用AcrobatReader)打开该文档

可能吗?任何想法

如果没有,你有什么建议(关于你的经历)

提前谢谢你

编辑:


用于标准Java桌面应用程序。

是。。。这很容易。您只需将内容流回到请求者(即通过Servlet中的响应对象)。您还需要设置标题

'Content-type: application/pdf'
您可能还希望将其设置为不在浏览器中打开

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

要使其工作,Acrobat需要能够访问另一个进程(Java)的内存。这是不可能的

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


如果您的应用程序在Acrobat中打开PDF后仍保持打开状态,您可能希望结合使用
File.createTempFile()
和,在JVM终止时删除该文件。

我不是JAVA程序员,但我现在正在使用iText,我有同样的问题。我认为,如果pdfWriter只需要一个outputStream,那么它也可以使用java.io.ByteArrayOutputStream。在JAVA中,我想这将是新的ByteArrayOutputStream(),因为我使用的是ColdFusion


对我来说,它是有效的。

如果您不希望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可以访问的地方之前,读者无法访问它。如果你不想把它放在磁盘上,那么就在内存中安装一个虚拟磁盘,并在那里写入文件。如何做到这一点,取决于您的操作系统。

对于web应用程序,用户可以下载运行时生成的PDF
File.createTempFile()
可能会为临时文件创建大量文件,而
File.deleteOnExit()
只会在JVM退出时调用,这不是一个理想的方案

在这种情况下,明智的做法是实现建议,并最终通过tearrayoutputstream将
对象写入
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> + "\"");
ServletOutputStream ServletOutputStream=httpServletResponse.getOutputStream();
//从behe的代码片段获取ByteArrayOutputStream
ByteArrayOutputStream bout=(…)
writeTo(servletOutputStream);
setContentType(“应用程序/八位字节流”);
setHeader(“内容处置”,“附件;文件名=\”+“\”);

通过命令打开PDF听起来像是操作系统特有的。您的目标是什么操作系统?用于开发Mac OS X Snow Leopard。但该应用程序将仅在Windows系统上运行。谢谢mlathe,但这是一个桌面应用程序:)很好:)但如果有人关心如何使用web应用程序!我愿意!我来这里寻找这个答案,谢谢你!谢谢你,马特。这听起来是个好办法。但是,一旦我创建了临时文件,有没有办法打开acrobat并传递临时文件的路径,以便它直接从Java打开?谢谢。谢谢多米尼克,现在我使用的是临时目录,但我会试试你的方法:)