0

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

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

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

我查看了来源, 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 响应或其他方式发送

4

1 回答 1

3

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

因为数据可以从一开始就写入那里。

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

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

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

因此,您希望尽快编写它。这要求输出流从一开始就存在。

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

由于您似乎不受资源限制的影响,您可以将数据流式传输到 aByteArrayOutputStream然后转发生成的字节数组或基于它的某些输入流或数据源。

但是,如果资源确实很重要,请考虑使用带有管道输入和输出流的管道进行模块化。

于 2013-10-24T19:38:58.310 回答