据我所知,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 回答
不要破坏PdfReader但重用它 .
脚步:
1 - 创建指向output.pdf的Document和PdfWriter
2 - 打开指向appendix.pdf的PdfReader
3 - 向您的网页添加内容
4 - 添加阅读表格PdfReader的附录页面
5 - 根据需要重复步骤3和4
6 - 关闭PdfRerader
7 - 关闭PdfWriter和Document
Fabrizio的答案是正确的:如果你没有释放阅读器,那么已经添加的页面将不会被冗余添加 .
我想添加一个额外的评论/答案:如果你想
PdfWriter
想要使用PdfWriter
这样做 . 我知道:互联网上有很多例子告诉你这样做,但这些都没有得到iText原始开发者的支持(就是:我) .如果要将页面添加到现有PDF,则应使用
PdfCopy
或PdfSmartCopy
. 使用PdfCopy
的优点是您可以保留交互式内容,例如链接和注释 . 使用其子类PdfSmartCopy
的优点是删除了冗余对象 . 例如:如果同一页面流在同一文档中冗余地存在100次,PdfSmartCopy
将删除99个实例并引用唯一剩余的流对象 .