首页 文章

将页面的多个副本插入PDF

提问于
浏览
1

据我所知,PDF支持对象的引用 . 因此,例如,如果我在文档中使用相同的图像100次 - 可以优化它以在每个地方使用相同的图像,大大节省了PDF大小 .

PDF是否支持整页数据?如果是,我怎样才能使用iText库?

我的问题是,我有一个大约500页的大文档,每2-3页我需要插入从其他PDF文档中读取的 the same 模板页面 . 代码看起来像这样:

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大小,特别是如果附录中包含一些大图像和内容 . 有没有办法以某种方式优化我的文档的大小?

2 回答

  • 2

    不要破坏PdfReader但重用它 .

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

  • 3

    Fabrizio的答案是正确的:如果你没有释放阅读器,那么已经添加的页面将不会被冗余添加 .

    我想添加一个额外的评论/答案:如果你想 PdfWriter 想要使用 PdfWriter 这样做 . 我知道:互联网上有很多例子告诉你这样做,但这些都没有得到iText原始开发者的支持(就是:我) .

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

相关问题