TL;DR:JPEG 和 PDF 之间的往返转换使文件大小翻倍。所用工具:poppler
和imagemagick
我正在做这个
- 从仅包含图像的 PDF(扫描文档)中提取图像,
pdfimags
通过poppler
- 进行无损编辑(旋转)(或不执行任何操作)
- 将图像转换为 pdf,通过
imagemagick
(由于某些平台相关问题,我无法使用 img2pdf)
Original 16M
Images 32M (Few kb images were deleted)
Final 33M
提取时图像大小会加倍。假设进行了某种解压缩,为什么在制作 PDF 时不能无损压缩它们?
编辑:
- 尝试了
-compress
一下LZW
,4倍时间后生成了150M的文件。 - 试过了
-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 页面/图像的人都可以在大学和伦敦政治经济学院