【问题标题】:Inserting multiple copies of a page into a PDF将页面的多个副本插入 PDF
【发布时间】:2013-11-08 06:47:09
【问题描述】:

据我所知,PDF 支持对对象的引用。因此,例如,如果我在一个文档中使用相同的图像 100 次 - 它可以优化为在每个位置使用相同的图像,从而大大节省 PDF 大小。

PDF 是否支持整页数据?如果是,我该如何使用 iText 库?

我的问题是,我有一个大约 500 页的巨大文档,每 2-3 页我需要插入从其他 PDF 文档读取的相同模板页面。代码如下所示:

    protected static void addAppendix(PdfWriter writer, Document document, InputStream appendixStream)
            throws IOException {
        PdfContentByte cb = writer.getDirectContent();
        PdfReader reader = new PdfReader(appendixStream);
        for (int idx = 1; idx <= reader.getNumberOfPages(); ++idx) {
            document.newPage();
            PdfImportedPage imported = writer.getImportedPage(reader, idx);
            cb.addTemplate(imported, 0, 0);
        }
        writer.freeReader();
    }

但是,这会大大增加 PDF 的大小,尤其是在附录包含一些大图像和内容的情况下。有什么办法可以优化我的文档的大小吗?

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

    不要破坏 PdfReader,而是重复使用它。

    步骤:
    1 - 创建指向 output.pdf 的 Document 和 PdfWriter
    2 - 打开指向您的 appendix.pdf 的 PdfReader
    3 - 向您的页面添加内容
    4 - 添加附录页阅读表单 PdfReader
    5 - 根据需要重复第 3 步和第 4 步
    6 - 关闭 PdfRrader
    7 - 关闭 PdfWriter 和 Document

    【讨论】:

    • 谢谢,我会试试看它是否对大小有任何影响。
    【解决方案2】:

    Fabrizio 的回答是正确的:如果您不释放阅读器,则不会冗余添加已添加的页面。

    我想添加一个额外的评论/答案:如果您正在谈论向现有 PDF 添加额外页面,您不想使用 PdfWriter 来执行此操作。我知道:互联网上有很多示例告诉您这样做,但这些示例并未得到 iText 的原始开发者(即:我)的认可。

    如果要向现有 PDF 添加页面,应使用 PdfCopyPdfSmartCopy。使用PdfCopy 的优点是可以保留交互式内容,例如链接和注释。使用其子类PdfSmartCopy 的优点是删除了冗余对象。例如:如果同一个页面流在同一个文档中出现 100 次冗余,PdfSmartCopy 将删除 99 个实例并引用唯一剩下的流对象。

    【讨论】:

    • 感谢您的回复,但我正在即时生成文档并在某些部分之后附加静态 PDF 页面。所以 PdfCopy 对我来说用处不大。
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2012-09-06
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多