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

如何压缩存储在.pdf中的图像,pdf,itext,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 low

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

   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的大小比我预期的要大。例如,如果一个.pdf文件中有8个.jpg图像,其总容量为3.3MB,那么当使用这8个jpg文件生成.pdf文件时,它将爆炸到28MB

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

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

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

[编辑]虽然图像最初是.jpg图像,但由于在应用程序中进行了操作,因此会将其读入缓冲图像中。完成裁剪、拆分和调整大小等操作。还可以添加水印时间戳


[编辑]我希望在将图像写入.pdf文件时可以采用无损压缩方案。例如,scheme.png使用的任何格式都可能没有.jpg压缩得多,但它仍然应该压缩。或者我假设它没有压缩,28MB是压缩大小?

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

Image img = Image.getInstance(pathToJPG);
img.setAbsolutePosition(x, y);
cb.addImage(img);
但是,您没有利用JPEG格式。您使用的是
java.awt.buffereImage
,而不是按原样添加JPEG字节。这会使图像的大小爆炸。在这个过程中,3.3MB很容易变成28MB

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

“虽然图像最初是.jpg图像,但它会被读取到缓冲图像中,因为…”-然后这样做会使图像大小从3.3MB激增到28MB,而不会将其添加到PDF中。当你“想使用无损压缩算法来存储图像”时,图像的大小不会再次内爆(直到你减少颜色等)。