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

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

据我了解,pdfimages -all从 PDF 中提取图像的格式是其原始格式。

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

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

有什么我不明白的地方吗?pdfimages创建 .ppm 和 .pbm 文件时是否默认添加像素信息?

答案1

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.

现在,让我们使用它来提取它pdfimages -all并将其与原始版本进行比较:

$ pdfimages -all img.pdf img-all
$ cmp device.jpg img-all-000.jpg 
$

提取的 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

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

$ ls -1s device.jpg device-all-000.jpg 
528 device-all-000.jpg
656 device.jpg

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

更新: 什里瓦萨指出img2pdf该实用程序还提供了一种将图像无损转换为 PDF 的方法。非 TeX 用户也可能会发现它使用起来更简单。

相关内容