是否可以在 iTextsharp 中创建图像库?

Is it possible to create an image library in iTextsharp?

我想知道是否可以使用 iTextsharp 将图像添加到 PDF,这样您就不必将图像直接添加到页面上,而是先将它们添加到库中,然后您按照 PDF 中的要求引用了图书馆。

这种方法的优点是,如果您重复使用同一张图片,它将不再将图片的精确副本添加到 PDF 中,而只是重复使用图片的当前副本。

到目前为止我已经做了一些测试:

Actual image size: 102kB
1 copy of the image in the PDF + other text: 259kB
2 copies of the image in the PDF + other text: 481kB
3 copies...: 704kB
4 copies...: 926kB

从这里可以清楚地看出 PDF 不够智能,无法知道我正在重复使用相同的图像并只是引用它。要是能这样就好了...

图像以图像 XObject 的形式存储在 PDF 中。 XObject 是外部对象的缩写。这意味着图像的位和字节不存储在页面的内容流中。

如果使用得当,iText 会在此类 XObject 中添加图像的位和字节,并在需要时重新使用它。如果多次添加相同的图像并且文件大小增加,则说明您没有正确使用 iText。

参见 Chapter 3 of the tutorial "iText 7: Building Blocks" and compare the MaryReillyV2 example with the MaryReillyV3 示例。

这是正确的:

Image img = new Image(ImageDataFactory.create(MARY));
document.add(img);
document.add(img);

它创建一个文件大小为 16 KB 的文档。

这是错误的:

Image img1 = new Image(ImageDataFactory.create(MARY));
document.add(img1);
Image img2 = new Image(ImageDataFactory.create(MARY));
document.add(img2);

它创建一个文件大小为 31 KB 的文档。

两个 PDF 肉眼看起来完全相同:

唯一的区别是 16 KB 的 PDF 是由阅读手册的人创建的,而 31 KB 的 PDF 是由没有阅读手册的人创建的。

文件 mary_reilly_V1.pdf 是一个 PDF 文件,我们只向其中添加了一次图像。如您所见,我们两次正确添加图像的 PDF 的文件大小差异几乎相同。

补充说明

答案是关于iText 7的,但同样的原理也适用于iText 5。