使用iText,在内存上生成一个在磁盘上生成的PDF

时间:2010-01-28 02:19:18

标签: 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"));
        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桌面应用程序。

5 个答案:

答案 0 :(得分:7)

如果您不希望iText将文档生成到磁盘,请执行以下操作:

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

这对你没有帮助,因为在你把它写到某个地方之前,Reader无法访问它,Acrobat可以访问它。如果您不希望它在磁盘上,则在内存磁盘中安装虚拟文件并在那里写入文件。如何执行此操作取决于您的操作系统。

答案 1 :(得分:5)

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

'Content-type: application/pdf'

您可能还想将其设置为不在浏览器中打开

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

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

对我来说,它有效。

答案 4 :(得分:0)

要求可以是用户可以下载在运行时生成的PDF的Web应用程序。 set destination=c:\temp\batches\dir3\ FOR /F "delims=" %%f IN ('dir /s/b c:\*.jpg') DO call :copyWithExcludes %%f FOR /F "delims=" %%f IN ('dir /s/b d:\*.png') DO call :copyWithExcludes %%f pause goto:eof :copyWithExcludes XCOPY /H /S /Y "%~1" "%destination%" goto:eof 可能会为临时文件创建一个大数字,File.createTempFile()只会在JVM退出时调用 - 不是理想情况。

在这种情况下,明智地实施@behe建议的内容并最终将File.deleteOnExit()对象写入ByteArrayOutputStream

ServletOutputStream
相关问题