【问题标题】:How to compress images stored in a .pdf如何压缩存储在 .pdf 中的图像
【发布时间】:2018-02-14 09:19:43
【问题描述】:

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

   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 时可以应用无损压缩方案。例如,.png 使用的任何方案可能不会像 .jpg 那样压缩,但它仍然应该压缩。还是我假设它没有被压缩并且 28MB 是压缩大小?

【问题讨论】:

  • “虽然图像最初是 .jpg 图像,但它被读入缓冲图像,因为...” - 然后 这样做 使大小从 3.3MB 扩展到 28MB,而不是将它们添加到 PDF。而且当您“想要使用无损压缩算法来存储图像” 时,尺寸不会再次内爆(即直到您减少颜色等)。

标签: pdf itext


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多