据我所知,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大小,特别是如果附录中包含一些大图像和内容。有没有办法以某种方式优化我的文档的大小?
答案 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,则应使用PdfCopy
或PdfSmartCopy
。使用PdfCopy
的优点是可以保留交互式内容,例如链接和注释。使用其子类PdfSmartCopy
的优点是删除了冗余对象。例如:如果同一页面流在同一文档中冗余地存在100次,PdfSmartCopy
将删除99个实例并引用唯一剩余的流对象。