【问题标题】:Append pdf to itext pdf in memory within a servlet将 pdf 附加到 servlet 内存中的 itext pdf
【发布时间】:2013-07-07 06:29:07
【问题描述】:

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

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

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

是否可以将现有文件连接到内存中 PDF 的末尾,以 ByteArrayOutputStream 的形式存在?

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

谢谢,

艾伦

【问题讨论】:

    标签: java servlets pdf itext


    【解决方案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();
    }
    

    【讨论】:

    • 正如之前多次提到的,这不是应该如何连接 PDF。使用new Document(),您可以创建一个文档,其中所有页面的纵向尺寸均为A4。你怎么知道每个 PdfImportedPage 的大小也是 A4 纵向的?如果原始文档包含注释怎么办?当使用PdfWriterPdfImportedPage 的组合时,它们都将丢失。请调整您的示例,使其使用PdfCopy,如问题所示。
    • 我只是根据我实际拥有的代码提供了响应,很高兴知道新事物;-)
    • +1 谢谢!生成的 PDF 也更加健壮:您现在拥有真实的页面字典和内容流,而不是使用 Form XObjects 导入页面。
    【解决方案2】:

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

    PdfReader reader = new PdfReader(baos.toByteArray());
    

    【讨论】:

    • 完美。正是我想要的。我会尽快实施,希望明天。谢谢布鲁诺。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2012-03-24
    相关资源
    最近更新 更多