8

我正在使用pdfimages -j bar.pdf /tmp/image从 PDF 中提取图像。我的目标是让它们在添加时处于原始状态。所以如果是.tif,我想得到一个.tif,如果是jpg,我想得到一个.jpg。对于我提取的所有内容,我不断获得 .ppm。

是否可以获得原始格式的图像或者 ppm 我唯一的选择?

更新:我想要这样做的主要目标是检查文档中包含的所有图像的 DPI,或者检查它们是否是矢量。

4

6 回答 6

9

首先,在 PDF 中称为“图像”,根据定义始终是光栅图像。没有“矢量图像”之类的东西。即使转换为 PDF 的原始文件包含矢量图形,转换程序也可能决定将这些图像包含为光栅图像。如果你提取它,你不会得到你的矢量图形,而是一个光栅图像。保存在 PDF 中的光栅图形无法通过pdfimages.

其次,不需要使用pdfimages. 如果您使用的是“Poppler”分支的当前版本(高于 v0.20.2),则pdfimages可以使用该-list参数获取特定范围 PDF 页面上所有图像的列表:

pdfimages -list -f 7 -l 8 ct-magazin-14-2012.pdf

  页面编号类型宽度高度颜色comp bpc enc interp 对象ID
  -------------------------------------------------- ------------------
     7 0 图像 581 838 rgb 3 8 jpeg no 39 0
     7 1 图像 4 4 RGB 3 8 图像编号 40 0
     7 2 图像 314 332 RGB 3 8 jpx 无 44 0
     7 3 图像 358 430 RGB 3 8 jpx 无 45 0
     7 4 图像 4 4 RGB 3 8 图像编号 46 0
     7 5 图像 4 4 RGB 3 8 图像编号 47 0
     7 6 图像 4 6 RGB 3 8 图像编号 48 0
     7 7 图像 596 462 RGB 3 8 jpx 无 49 0
     7 8 图像 4 6 RGB 3 8 图像编号 50 0
     7 9 图像 4 4 RGB 3 8 图像编号 51 0
     7 10 图像 8 10 RGB 3 8 图像编号 41 0
     7 11 图像 6 6 RGB 3 8 图像编号 42 0
     7 12 图像 113 27 RGB 3 8 jpx 无 43 0
     8 13 图像 582 839 灰色 1 8 jpeg no 2080 0
     8 14 图像 344 364 灰色 1 8 jpx 无 2079 0

再次注意:这个版本pdfimages是来自 Poppler 的版本(来自 XPDF 的版本不还?)支持这个新功能)。

如您所见,这列出了图像的相应宽度和高度。然而,这并没有(还)给你任何关于 DPI 的线索。如果将较大的光栅图像压缩到 PDF 页面上的小空间中,您的 DPI 值会非常高。(这就是 plinth 对他自己的回答的评论也强调的......)

为了计算 DPI,您必须测量页面上显示的图像的宽度/高度(您可以使用 Acrobat/Reader 中的工具之一进行测量),然后使用来自上面的输出来计算 DPI。


更新

pdfimages现在的最新版本直接在附加列中显示包含图像的 DPI 中的实际分辨率。获取此信息是问题的最初目标:

  pdfimages -list -f 6 -l 7 示例.pdf
  page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
  -------------------------------------------------- ------------------------------------------
     6 0 图像 1901 1901 RGB 3 8 图像无 632 0 1818 1818 468K 4.4%
     6 1 图像 1901 1901 RGB 3 8 图像无 645 0 1818 1818 521K 4.9%

新的输出格式还显示了每个图像('x-ppi''y-ppi')各自的水平和垂直分辨率。它还根据存储('size')及其压缩比('ratio')给出图像的实际大小。

(感谢@Eric 建议更新暗示这些新功能pdfimages。)

于 2013-02-24T16:40:54.810 回答
7

通过查看 PDF 中的图像,您无法(可靠地)知道源图像文件格式。例如,TIFF 图像可以使用(在我脑海中)无、RLE、CCITT(情侣变体)、LZW、Flate、Jpeg 进行压缩。如果 PDF 中的图像使用 DCT (jpeg) 压缩,您如何确定源是 TIFF 还是 Jpeg?如果是用Flate压缩的,怎么区分TIFF和PNG呢?此外,决定压缩的是生成 PDF 的软件,因此我可以使用 Flate 压缩的 TIFF 图像并将其编码为使用 JPEG2000 或 CCITT 压缩图像的 PDF 并使用 Jbig2 或 jpeg 图像压缩,将其压缩为8 位调色图像并使用 Flate 压缩。

TL; DR 你不知道。

于 2013-01-25T13:56:20.120 回答
2

我同意 plinth,您可能无法确定使用的原始图像格式。ppm 不是您唯一的输出选项。

pdfimages 读取 PDF 文件,扫描一页或多页,并为每个图像写入一个PPM、PBM 或 JPEG文件,image-root-nnn.xxx,其中 nnn 是图像编号, xxx 是图像类型(.ppm, .pbm,.jpg)

http://linux.die.net/man/1/pdfimages

此外,您当然可以使用例如image magick's convert来更改格式

于 2013-01-25T14:08:37.550 回答
1

我正在添加另一个答案,它处理原始问题的“更新” :

“我想要这样做的主要目标是检查文档中包含的所有图像的 DPI,或者检查它们是否是矢量。”

您可以使用 Ghostscript 选择性地删除(或保留)每一页上的文本像素图像矢量图形区域。

关键是应用新的 CLI 参数

  • -dFILTERIMAGE,
  • -dFILTERTEXT和/或
  • -dFILTERVECTOR

因此。

此处描述了此方法的详细信息;答案包含可视化结果的屏幕截图:

如何从 PDF 中删除所有图像?

顶行,从左到右:所有“文本”被删除;删除所有“图像”;删除了所有“向量”。底行,左起:只保留“文本”;只保留“图像”;只保留“向量”。
顶行,左起:全部


于 2019-08-27T18:35:38.167 回答
0

您将需要获取图像 XObject(其中包含原始图像的宽度和高度),然后是实际显示的尺寸,然后您就可以解决这个问题。

于 2013-01-26T17:29:16.707 回答
0

对于那些仍然想知道的人来说,pdfimages -all现代解决方案是:

-all:以原始格式写入 JPEG、JPEG2000、JBIG2 和 CCITT 图像。CMYK 文件被写入为 TIFF 文件。所有其他图像都写为 PNG 文件。这等效于指定选项 -png -tiff -j -jp2 -jbig2 -ccitt。

于 2021-03-28T10:32:58.737 回答