3

我正在创建一个系统,该系统使用 iText for Java 从 servlet 中使用ByteArrayOutputStreamPdfWriter动态创建 PDF ,以防止文件系统使用。

一旦动态内容完成,我希望能够将一些现有的 PDF 文件页面附加到动态创建的 PDF 的末尾。

我查看了使用 iText 连接 PDF 的示例代码,他们使用PdfCopy来完成此操作。PdfCopy的一个重要假设是所有被连接的文件都存在于文件系统上。

是否可以将现有文件连接到作为ByteArrayOutputStream存在的内存 PDF 的末尾?

同时,我为初始动态文档使用了一个临时文件,但如果可能的话,我想删除该依赖项。

谢谢,

艾伦

4

2 回答 2

4

您假设您只能PdfReader使用文件路径创建实例。这个假设是错误的。请参阅API 文档。如果baos是你的ByteArrayOutputStream,你可以像这样轻松地创建你的阅读器实例:

PdfReader reader = new PdfReader(baos.toByteArray());
于 2013-07-09T16:03:50.933 回答
1

拥有InputStream(不同文档)的列表,您可以以这种方式附加它们OutputStream(基于this):

private void doMerge(List<InputStream> list, OutputStream outputStream)
        throws DocumentException, IOException {
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, outputStream);
    document.open();
    int n;
    for (InputStream in : list) {
        PdfReader reader = new PdfReader(in);
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            n = reader.getNumberOfPages();
            // loop over the pages in that document
            for (int page = 0; page < n; ) {
                copy.addPage(copy.getImportedPage(reader, ++page));
            }
            copy.freeReader(reader);
            reader.close();
        }
    }
    outputStream.flush();
    document.close();
    outputStream.close();
}
于 2013-07-09T15:16:51.570 回答