我正在使用pdfimages -j bar.pdf /tmp/image
从 PDF 中提取图像。我的目标是让它们在添加时处于原始状态。所以如果是.tif,我想得到一个.tif,如果是jpg,我想得到一个.jpg。对于我提取的所有内容,我不断获得 .ppm。
是否可以获得原始格式的图像或者 ppm 我唯一的选择?
更新:我想要这样做的主要目标是检查文档中包含的所有图像的 DPI,或者检查它们是否是矢量。
首先,在 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
。)
通过查看 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 你不知道。
我同意 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来更改格式
我正在添加另一个答案,它处理原始问题的“更新” :
“我想要这样做的主要目标是检查文档中包含的所有图像的 DPI,或者检查它们是否是矢量。”
您可以使用 Ghostscript 选择性地删除(或保留)每一页上的文本、像素图像和矢量图形区域。
关键是应用新的 CLI 参数
-dFILTERIMAGE
,-dFILTERTEXT
和/或-dFILTERVECTOR
因此。
此处描述了此方法的详细信息;答案包含可视化结果的屏幕截图:
顶行,从左到右:所有“文本”被删除;删除所有“图像”;删除了所有“向量”。底行,左起:只保留“文本”;只保留“图像”;只保留“向量”。
您将需要获取图像 XObject(其中包含原始图像的宽度和高度),然后是实际显示的尺寸,然后您就可以解决这个问题。
对于那些仍然想知道的人来说,pdfimages -all
现代解决方案是:
-all:以原始格式写入 JPEG、JPEG2000、JBIG2 和 CCITT 图像。CMYK 文件被写入为 TIFF 文件。所有其他图像都写为 PNG 文件。这等效于指定选项 -png -tiff -j -jp2 -jbig2 -ccitt。