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

时间:2016-06-30 13:14:48

标签: c# image pdf itext

我想知道是否可以使用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不够聪明,不知道我正在重新使用相同的图像并简单地引用它。如果它可能真的很棒......

1 个答案:

答案 0 :(得分:2)

图像以PDF格式存储在PDF中。 XObject是eXternal Object的缩写。这意味着图像的位和字节不会存储在页面的内容流中。

正确使用时,iText会在这样的XObject中添加图像的位和字节,并在需要时重复使用。如果您多次添加同一图像并且文件大小增加,则您无法正确使用iText。

请参阅Chapter 3 of the tutorial "iText 7: Building Blocks"并将MaryReillyV2示例与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看起来都与肉眼相同:

enter image description here

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

文件mary_reilly_V1.pdf是一个PDF文件,我们只将图像添加到了一次。正如您所注意到的,文件大小与我们已正确添加图像两次的PDF的差异几乎相同。

额外评论

答案是关于iText 7,但iText 5也是如此。