将页面的多个副本插入PDF

时间:2013-11-08 06:47:10

标签: java pdf itext

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

2 个答案:

答案 0 :(得分:3)

不要破坏PdfReader但重用它。

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

答案 1 :(得分:2)

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

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

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