如何以原始格式从PDF中提取图像

时间:2013-01-25 13:04:17

标签: php pdf xpdf

我正在使用pdfimages -j bar.pdf /tmp/image从PDF中提取图片。我的目标是让它们在添加时处于原始状态。所以如果它是.tif我想得到一个.tif,如果它是一个jpg我想得到一个.jpg。我提取的所有东西都持续增加.ppm。

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

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

6 个答案:

答案 0 :(得分:7)

通过查看PDF中的图像,您无法(可靠地)了解源图像文件格式。例如,TIFF图像可以压缩(在我的头顶)无,RLE,CCITT(耦合变化),LZW,Flate,Jpeg。如果使用DCT(jpeg)压缩PDF中的图像,您如何确定源是TIFF还是Jpeg?如果用Flate压缩,你如何区分TIFF和PNG?此外,它是生成决定压缩的PDF的软件,因此我可以使用Flate压缩的TIFF图像并使用JPEG2000或CCITT压缩图像将其编码为PDF并使用Jbig2或jpeg图像对其进行压缩,将其缩小为8位调色板图像并使用Flate进行压缩。

TL; DR你不知道。

答案 1 :(得分:6)

首先,PDF用语中的内容称为“图像”,根据定义,它总是一个光栅图像。没有“矢量图像”这样的东西。即使转换为PDF的原始文件包含矢量图形,转换器程序也可以决定将它们包含为光栅图像。如果你提取它,你将不会得到你的矢量图形,而是一个光栅图像。 pdfimages无法提取保存在PDF中的光栅图形。

第二次,您无需使用pdfimages实际提取图像。如果您使用pdfimages'Poppler'分叉的当前版本(晚于v0.20.2),则可以使用-list参数获取所有版本的列表特定范围的PDF页面上的图像:

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

  page   num  type   width height color comp bpc  enc interp  object ID
  ---------------------------------------------------------------------
     7     0 image     581   838  rgb     3   8  jpeg   no        39  0
     7     1 image       4     4  rgb     3   8  image  no        40  0
     7     2 image     314   332  rgb     3   8  jpx    no        44  0
     7     3 image     358   430  rgb     3   8  jpx    no        45  0
     7     4 image       4     4  rgb     3   8  image  no        46  0
     7     5 image       4     4  rgb     3   8  image  no        47  0
     7     6 image       4     6  rgb     3   8  image  no        48  0
     7     7 image     596   462  rgb     3   8  jpx    no        49  0
     7     8 image       4     6  rgb     3   8  image  no        50  0
     7     9 image       4     4  rgb     3   8  image  no        51  0
     7    10 image       8    10  rgb     3   8  image  no        41  0
     7    11 image       6     6  rgb     3   8  image  no        42  0
     7    12 image     113    27  rgb     3   8  jpx    no        43  0
     8    13 image     582   839  gray    1   8  jpeg   no      2080  0
     8    14 image     344   364  gray    1   8  jpx    no      2079  0
再次

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

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

为了计算DPI,您必须测量图像在页面上显示的宽度/高度(您可以使用Acrobat / Reader中的某个工具执行此操作),然后使用相应的来自上面输出的信息来计算DPI。

答案 2 :(得分:2)

我同意基座,你可能无法确定使用的原始图像格式。 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

答案 3 :(得分:1)

我要添加另一个答案,该答案涉及原始问题的“更新”

  

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

您可以使用Ghostscript在每个页面上有选择地删除(或保留)文本像素图像矢量图形区域。 >

关键是应用新的CLI参数

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

相应地。

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

How can I remove all images from a PDF?

顶行,从左起:删除了所有“文本”;所有“图像”均已删除;删除所有“向量”。 底部一行:从左开始:仅保留“文本”;仅保留“图像”;仅保留“向量”。
Top row, from left: all "text" removed; all "images" removed; all "vectors" removed. Bottom row, from left: only "text" kept; only "images" kept; only "vectors" kept.


答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

<块引用>

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