如何压缩存储在.pdf中的图像

时间:2017-09-06 02:15:53

标签: pdf itext

我在客户端站点上有以下代码:

   private void writeBufferedImage2Pdf(PdfContentByte cb, BufferedImage img)
   {
      com.itextpdf.text.Image BWImage = com.itextpdf.text.Image.getInstance(img, null, false);

      BWImage.setAbsolutePosition(0, 0);  // from the lower left
      BWImage.scaleToFit(612,792);   // 8.5x11 (72 per inch)
      cb.addImage(BWImage, false);
   }

我注意到.pdf的大小比我预期的要大。例如,对于具有8个.jpg图像的.pdf,当使用这8个jpgs生成.pdf时,总计3.3MB的图像将爆炸到28MB。

如何将压缩方案应用于添加到.pdf的图像?

即使原始图像是.jpg,我也想使用无损压缩算法来存储图像。

碰巧图像是文字,所以我们也在考虑转换为黑白,但这是一个单独的问题,可以让我们进一步压缩。

[编辑]虽然图像最初是.jpg图像,但它被读入缓冲图像,因为它在应用程序中被操作。像裁剪,拆分和调整大小一样。也可以添加水印时间戳。

[编辑]我希望在将图像写入.pdf时可以应用无损压缩方案。例如,任何.png使用的方案可能不会像.jpg一样压缩,但它仍然应该压缩。或者我认为它没有压缩,28MB是压缩大小?

1 个答案:

答案 0 :(得分:1)

JPEG是PDF规范支持的图像格式。这意味着iText不需要处理JPEG图像。如果您的代码如下所示,iText只会将图像字节 as as is 放入PDF中:

Image img = Image.getInstance(pathToJPG);
img.setAbsolutePosition(x, y);
cb.addImage(img);

但是,您没有利用JPEG格式。您没有按原样添加JPEG字节,而是使用java.awt.BufferedImage。这使得图像的大小爆炸。在这个过程中,3.3 MB很容易变成28 MB。

请调整您的代码,并确保添加真实的JPEG,而不是BufferedImage。您指称添加3.3 MB JPEG字节的指控并不正确。你正在添加AWT图像,这是一个完全不同的游戏。