iText:添加图片时的PDF尺寸

时间:2017-10-27 07:49:49

标签: image pdf itext pdf-generation

我正在使用iText 5.5.4从Java创建PDF,它是一个很棒的库。

这不是问题或错误行为。这只是一个奇怪的事实,我正在努力理解。

我有一个三页的PDF,包括页眉,页脚,表格等。 它的大小是96KB。

我添加了带有950KB JPEG图像的第4页。它适合A4页面尺寸。 添加96KB + 950KB +第四页元数据+其他(页眉,页脚),我预计新PDF约为1.15MB

但最终尺寸为1.41MB

所以,我有这两个问题:

  • 我估计有什么不对吗?为什么图像添加意味着这种过载?
  • 如果我使用iText将图像缩放到75%,新生成的PDF也是1.41MB大小。 PDF是否包含原始JPEG图像,尽管有所减少?

我坚持认为:行为是正确的。这只是我自己的好奇心。

非常感谢。

编辑:我无权分享图片。我将图像添加到PDF的代码是:

public Document addNewElement(Document input, String imageFilename) throws DocumentException {  

try {       
    input.newPage();

    Image image = Image.getInstance(path + imageFilename);

    input.add(image);           

} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}   

return input;

}

1 个答案:

答案 0 :(得分:0)

使用iText缩放图像不会减少或增加图像的像素数。 PDF内部图像的大小与您使用的缩放系数无关。唯一改变的是感知分辨率。如果您有300 x 300像素的图片,并将其缩放到一英寸,则分辨率将为300 dpi。如果将其缩放到两英寸,则分辨率将降低,但图像字节的大小将保持不变。

添加图片时PDF大小的增加取决于图片类型。

  • 如果添加PNG文件,iText会将PNG解码为像素,创建位图,并添加压缩位图而不是PNG,因为PDF规范不支持PNG。
  • 如果添加透明图像(例如透明GIF或PNG),iText将添加两个图像:不透明图像以及定义透明部分的图像蒙版。为什么?嗯,这就是PDF规范中定义透明度的方式。
  • ...(我的一本书中描述了所有不同类型图像的行为。如果你想了解更多,我可以查一下,或者把它放在官方网站上,如果它还没有某处。)
  • 如果添加JPG,PDF中将显示这些字节的精确副本。它将被包装在一个流对象中,导致一些开销,但不会像四分之一兆字节一样大。

阅读您的问题,我假设您正在添加JPEG,但文件的增加远远高于您的预期。我们应该看看原始PDF和您的代码,以给出一个确定的答案。我会猜一眼。假设使用PDF 1.5规范中引入的压缩(压缩对象+压缩的XRef表)压缩原始PDF,并且您没有告诉压模您希望最终结果使用该压缩,iText可能会创建一个PDF仅使用PDF 1.5之前的PDF规范中定义的压缩。这个原因与添加图像完全无关,但可能导致四分之一兆字节的差异。