在iText中创建文档而不指定输出

时间:2013-10-24 14:27:00

标签: java pdf itext

我浏览了一些iText库的例子。我对创建文档很困惑,在我看到的典型示例中:

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter.getInstance(document, new FileOutputStream(PATH));
document.open();
//document.addSomeContent();
document.close();

为什么文档从头开始绑定到文件/输出流?是否可以创建Document以及何时完成,然后将其保存,发送到file / output_stream?

我查看了源代码,getInstance()是:

public static PdfWriter getInstance(final Document document, final OutputStream os)
throws DocumentException {
    PdfDocument pdf = new PdfDocument();
    document.addDocListener(pdf);
    PdfWriter writer = new PdfWriter(pdf, os);
    pdf.addWriter(writer);
    return writer;
}

连接:

Document  < --- > PdfDocument 
                      Λ
                      |
                      |
                      V
                 PdfWriter   < ---- > OutputStream

创建Document之后,它与PdfWriter和OutputStream绑定。这可能是这样的:

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
// document.addSomeContent();
document.save(someOutputStreamObject);

我想摆脱文件和持久性,专注于创建文档的逻辑结构。后来我想将Document对象传递给其他模块,该模块负责将文档保存到文件或发送为http响应或其他任何

1 个答案:

答案 0 :(得分:3)

  

为什么文档从头开始绑定到文件/输出流?

因为数据可以从头开始写入。

通常,您不希望在内存中构建整个PDF文档,最后只将其全部刷新到流中。特别是在服务器端解决方案的情况下,您必须考虑同时创建许多此类文档的情况。即使有足够的内存用于一个甚至几个文档,同时将数百甚至数千个文档完全保存在内存中会大大耗尽资源。

另外,在您创建文件时提供文件也可以防止出现其他问题。正如布鲁诺在评论中所说:

  

会话将在文档完成之前超时。所以我使用构建器模式创建了iText,连续向OutputStream提供字节以防止服务器/浏览器超时

相反,您希望尽快写出来。这需要输出流从一开始就存在。

  

其他模块,负责将文档保存到文件或发送为http响应或其他

由于您似乎没有资源限制,您可以将数据流式传输到ByteArrayOutputStream,然后根据它转发生成的字节数组或某些输入流或数据源。

但是,如果资源很重要,请考虑使用管道输入和输出流进行流水线操作以进行模块化。