如何防止 JPEG-PDF 往返转换时文件体积过大?

如何防止 JPEG-PDF 往返转换时文件体积过大?

TL;DR:JPEG 和 PDF 之间的往返转换使文件大小翻倍。所用工具:popplerimagemagick

我正在做这个

  1. 从仅包含图像的 PDF(扫描文档)中提取图像,pdfimags通过poppler
  2. 进行无损编辑(旋转)(或不执行任何操作)
  3. 将图像转换为 pdf,通过imagemagick (由于某些平台相关问题,我无法使用 img2pdf)
Original 16M
Images 32M (Few kb images were deleted)
Final 33M

提取时图像大小会加倍。假设进行了某种解压缩,为什么在制作 PDF 时不能无损压缩它们?

编辑:

  1. 尝试了-compress一下LZW,4倍时间后生成了150M的文件。
  2. 试过了-page A4,没有变化。

命令:

$ pdfimages -all Scanneddoc.pdf ./a
$ rm a-001.jpg 
$ mogrify -rotate -90 a-*.jpg
$ convert a*.jpg Rotated.pdf

文件信息:
pdfimages -list input

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     260   260  rgb     3   8  jpeg   no         8  0   851   851 9.91K 5.0%
   1     1 image    3184  2020  rgb     3   8  jpeg   no        11  0   272   272  674K 3.6%
   2     2 image     260   260  rgb     3   8  jpeg   no        16  0   851   851 9.91K 5.0%
   2     3 image    2556  2968  rgb     3   8  jpeg   no        19  0   309   309  740K 3.3%
   3     4 image     260   260  rgb     3   8  jpeg   no        24  0   851   851 9.91K 5.0%
   3     5 image    2500  3052  rgb     3   8  jpeg   no        27  0   303   303  684K 3.1%
   4     6 image     260   260  rgb     3   8  jpeg   no        32  0   851   851 9.91K 5.0%
   4     7 image    2392  1372  rgb     3   8  jpeg   no        35  0   205   205  242K 2.5%
   5     8 image     260   260  rgb     3   8  jpeg   no        40  0   851   851 9.91K 5.0%
   5     9 image    2360  3148  rgb     3   8  jpeg   no        43  0   286   286  714K 3.3%

pdfimages -list output

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    2020  3184  rgb     3   8  jpeg   no         8  0   272   272  615K 3.3%
   2     1 image    2968  2556  rgb     3   8  jpeg   no        22  0   359   359 1741K 7.8%
   3     2 image    3052  2500  rgb     3   8  jpeg   no        36  0   369   370 1610K 7.2%
   4     3 image    1372  2392  rgb     3   8  jpeg   no        50  0   205   205  509K 5.3%
   5     4 image    3148  2360  rgb     3   8  jpeg   no        64  0   381   381 1493K 6.9%

澄清:解决方案和评论强调图像的旋转。需要明确的是,问题在于图像尺寸过大,因此旋转也无济于事。虽然有损变换可能会阻止有效压缩,导致尺寸过大,但问题确实出在提取部分。

答案1

PDF 和 JPEG 经常一起使用。因为 JPEG 通常以原始格式存储为整个组件插入。而 TIF、GIF、PNG 和任何其他像素化图像都会发生显著变化。

因此,提取的 JPG 通常会以不同的密度插入到其源中,并且在没有 dpi 的提取时它将是字节完美的(100%往返)。

PDF 的一个优点是它忽略 EXIF 方向,可以以任意角度和比例旋转图像。因此,旋转页面不会以任何方式改变图像,提取的图像在插入和提取时将具有完全相同的哈希值。

然而,图像无损旋转必须以不同的方式对 JPEG 图像内部造成附带损害。

最小的损害是如果存在带方向的 EXIF 块,则只需更改这些字节即可。但是,如果您想重新定位像素,则不可避免地会破坏某些东西。例如,通过不同的无损 JPEG 旋转器对一张图像进行旋转。

source image A4 @ 200 dpi

2339 x 1653  Pixels (3.87 MPixels) (1.41)
29.7 x 21.0 cm; 11.69 x 8.27 inches
JPEG, CMYK, quality: 59, subsampling ON (2x2)
16,7 Million colours max (32 BitsPerPixel)
40165 colours used
502.58 KB (514,642 Bytes)

---------------------------
JPG Transformation error: "Perfect" operation is not possible.
Bad image dimensions (not multiples of 16)
---------------------------
OK   
---------------------------
Here are 3 different "lossless" application solutions

Commercial (no names)
undercrop MCU (1653 and cut -5)

1648 x 2339  Pixels (3.85 MPixels) (0.70)
20.9 x 29.7 cm; 8.24 x 11.69 inches
JPEG, CMYK, quality: 59, subsampling ON (2x2)
16,7 Million colours max (24 BitsPerPixel)
40159 colours used
450.43 KB (461,237 Bytes)

IrfanView Graphics app
overcrop MCU (1653 and pad +11)

1664 x 2339  Pixels (3.89 MPixels) (0.71)
21.1 x 29.7 cm; 8.32 x 11.69 inches
JPEG, CMYK, quality: 59, subsampling ON (2x2)
16,7 Million colours max (24 BitsPerPixel)
40160 colours used
452.28 KB (463,131 Bytes)

Open Source Independent JPEG Group 
jpegcrop (retain dimensions)

1653 x 2339  Pixels (3.87 MPixels) (0.70)
21.0 x 29.7 cm; 8.27 x 11.69 inches
JPEG, CMYK, quality: 59, subsampling ON (2x2)
16,7 Million   (24 BitsPerPixel)
40159 colours used
504.13 KB (516,231 Bytes)

因此,显然最好的是经过最长时间开发的开源产品。然而,转换过程中颜色数量减少了,但文件大小却增加了一点点。

因此,对 PDF 中的 JPEG 进行旋转的正确方法是不改变图像,只改变其 EXIF 或者简单地旋转 PDF 页面并在新文件中重复使用。

因此,这里的运行源 200 dpi JPEG 始终是相同的,从未改变过一个字节,但横向扫描缩小了页面尺寸(A4 到 A5)并旋转为纵向,然后保存为 PDF。

在此处输入图片描述

所以上面显示的 JPEG 是由 pdfimages -all 提取的,并恢复到其自然状态(200 dpi A4),然后我们可以重新插入到页面中,它将完全相同。唯一的区别是 PDF 载体有几个额外的字节来描述新的布局。

515426 已增加到 515482,甚至可以压缩到更小的几个字节,因为它是一个 CMD 文件,使用 OS 命令将其转换为文本。 在此处输入图片描述

总结 200 dpi 图像没有任何变化。报告的图像像素 PPI 密度因比例而不同。两幅图像都是直立的,两页都是直立的。

这是在不同对象比例的页面内旋转渲染的图像。

答案2

使用-j (write JPEG images as JPEG files)而不是-all (equivalent to -png -tiff -j -jp2 -jbig2 -ccitt)使得 中的输出合理pdfimages

注意:任何想要了解如何有效地旋转 pdf 页面/图像的人都可以在大学和伦敦政治经济学院

相关内容