为什么使用 -all 标志时 pdfimages 生成的图像不同?

Ori*_*751 6 command-line pdf imagemagick image-processing

我的理解是pdfimages -all从原始格式的 PDF 中提取图像。

因此,我希望从该命令中提取的 JPG(有损)图像与在没有该-all选项的情况下生成的 .ppm 和 .pbm 文件具有相同的像素信息,以及在我右键单击时创建的 PNG(无损)文件并将图像保存在 Evince 中。

但是,我使用 ImageMagickcompare命令告诉我,与上述其他选项相比,JPG 文件中包含的图像存在差异。要重现,请在此链接 ( https://fccid.io/document.php?id=2149405 ) 中下载 PDF ,将其用作pdfimagesand的参数,pdfimages -all并使用第一个 .ppm 文件和第一个 .jpg 文件作为compare. 当我这样做时,它会生成一个包含红色的图像文件,以指示图像中的差异。

有什么我不明白的吗?是pdfimages默认添加的像素信息时,它会创建.ppm格式和.pbm文件?

Joh*_*024 7

pdfimages -all返回存储在 pdf 中的确切文件。

我们可以通过来回测试:从一张 jpg 图像开始,我们使用 LaTeX 将其添加到 pdf 中,使用 提取它pdfimages -all,然后将其与原始图像进行比较。(使用 LaTeX 的原因将在后面解释。)

我有从您的链接中提取的第一张 jpg 图像,并将其命名为device.jpg. 让我们使用 LaTeX 将其放入 PDF 文件中:

$ cat img.tex 
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=5in,keepaspectratio]{device}
\end{document}
$ pdflatex img
[...snip...]
Output written on img.pdf (1 page, 672455 bytes).
Transcript written on img.log.
Run Code Online (Sandbox Code Playgroud)

现在,让我们使用提取它pdfimages -all并与原始文件进行比较:

$ pdfimages -all img.pdf img-all
$ cmp device.jpg img-all-000.jpg 
$
Run Code Online (Sandbox Code Playgroud)

提取的 jpg原始文件逐字节相同

脚注:使用 LaTeX 的原因

仅使用任何 PDF 创建者都无法完成上述测试。这是因为并非所有 PDF 创建者都会将图像不受干扰地放入 PDF。例如,让我们试试 ImageMagick 的convert

$ convert device.jpg device.pdf
$ pdfimages -all device.pdf device-all
$ cmp device.jpg device-all-000.jpg 
device.jpg device-all-000.jpg differ: byte 4, line 1
Run Code Online (Sandbox Code Playgroud)

convert 在将图像放入 pdf 之前,将图像重新采样为较小的尺寸。

$ ls -1s device.jpg device-all-000.jpg 
528 device-all-000.jpg
656 device.jpg
Run Code Online (Sandbox Code Playgroud)

图像准确性是 pdflatex 设计目标的一部分。默认情况下,其他 PDF 创建软件可能会在将图像放入 PDF 之前“优化”图像。

更新: ShreevatsaR指出img2pdf实用程序还提供了一种将图像转换为 PDF 的无损方法。非 TeX 用户也可能会发现它更易于使用。