通常,所有图像都以 PBM(用于单色图像)、PGM(用于灰度图像)或 PPM(用于彩色图像)文件的形式写入。使用此选项,DCT 格式的图像将保存为 JPEG 文件。所有非 DCT 图像都照常以 PBM/PGM/PPM 格式保存。(内联图像始终以 PBM/PGM/PPM 格式保存。)
—
man pdfimages
来自 Xpdf
默认输出格式为 PBM(用于单色图像)或 PPM(用于非单色图像)。-png 或 -tiff 选项分别更改为默认输出为 PNG 或 TIFF。如果同时指定了 -png 和 -tiff,则 CMYK 图像将写入为 TIFF,而所有其他图像将写入为 PNG。此外,-j、-jp2 和 -jbig2 选项将分别导致 PDF 文件中的 JPEG、JPEG2000 和 JBIG2 图像以其原始格式写入。
—
man pdfimages
来自 poppler
为什么这两种pdfimages
提取图像的实现都是以“神秘的”(我称它们为“神秘”是因为我以前从未听说过)PBM/PGM/PPM 格式(统称为 Netpbm 或 PNM,https://en.wikipedia.org/wiki/Netpbm)而不是 PNG、JPEG 或者 GIF 格式(当然我可能错了)来提取图像?(如果我没记错的话,10 年前和 20 年前它也是最流行的标准)?
netpbm 工具已有几十年历史(自 1988 年以来)。这些格式通常不是目标状态(因为它们的大小不合理),因此您通常不会看到这些文件,而是 GIF/JPG/PNG。
相反,我们的想法是拥有一种中性的无损格式,可以用作文件类型转换的中介。
因此,您无需编写 PNG->JPEG 和 JPEG->PNG 转换器,只需编写 PNG 与中性格式之间的转换器以及 JPEG 与中性格式之间的转换器即可。到目前为止,这听起来很糟糕;需要 4 个程序,而不是 2 个。
但现在我们添加 GIF;我们只需要将 GIF 转换为/转换为该格式,现在我们会自动获得 GIF<->PNG 和 GIF<->JPEG;只需花费 2 个程序即可完成 4 次转换。然后我们将 BMP 转换为/转换为该格式,我们获得 BMP<->GIF、BMP<->PNG、BMP<->JPEG;只需花费 2 个程序即可完成 6 次转换。让我们添加 PDF,这样我们便可获得 2 个程序的 8 次转换。
我们可以看到,我们可以转换为中性格式/从中性格式的格式越多,我们获得的转换就越多,并且所有这两个程序只需要知道它们自己的特殊格式(例如 JPG)和中性中间格式,这对于作者来说更容易处理!
gif 和 jpeg 格式实际上早于 netpbm,但它们是非常复杂的格式,需要专门的库才能成功读取和写入。在创建 netpbm 时,除了现有代码之外,甚至没有针对 gif 格式的正式规范,因此如果没有 gif 库或大量反复试验以找到特殊情况,则无法读取 gif。
pbm/pgm/ppm 格式基本上是带有良好标头的原始数据,因此即使不使用任何复杂的库,编写代码来读取和写入它们也很简单。您甚至可以使用这些来创建带有生成原始数据的 shell 脚本的图像。
除了使用中性格式所带来的优势和灵活性(如另一个答案中所述)之外,创建这些格式是为了让简单的代码可以读取和写入图像,而无需担心复杂格式的特定库,并以最便携的方式执行此操作。