12

我有一个包含图像的PDF 文档。

现在我想知道这些图像的分辨率。

第一步是以某种方式从 PDF 文档中获取图像。但是怎么做?

可可中提供的东西甚至可能吗?

4

5 回答 5

14

看看你的另一个问题的答案:

基本上,您现在可以-list为 Poppler 的pdfimages命令行实用程序使用(新)参数(它不适用于 XPDF 的版本pdfimages!)。

它将报告出现在查询页面上的每个图像的尺寸。

(您也可以使用它从 PDF 中提取图像:pdfimages -png -f 3 -l 5 some.pdf prefix---将从 PDF 文件中提取所有图像为 PNG,从第一3 开始,到最后一页 5 结束prefix---使用每个图像的文件名前缀。但是这个问题似乎不是你问题的主要焦点......)

例子:

pdfimages -list -f 1 -l 3 /Users/kurtpfeifle/Downloads/ct-magazin-14-2012.pdf

  页面编号类型宽度高度颜色comp bpc enc interp 对象ID
  -------------------------------------------------- ------------------
     1 0 图像 1247 1738 RGB 3 8 jpx 无 3053 0
     2 1 图像 582 839 灰色 1 8 jpeg no 2080 0
     2 2 图像 344 364 灰色 1 8 jpx 无 2079 0
     3 3 图像 581 838 RGB 3 8 jpeg 无 7 0
     3 4 图像 1088 776 RGB 3 8 jpx 无 8 0
     3 5 图像 6 6 RGB 3 8 图像编号 9 0
     3 6 图像 8 6 RGB 3 8 图像编号 10 0
     3 7 图像 4 6 RGB 3 8 图像编号 11 0
     3 8 图像 212 106 RGB 3 8 jpx 无 12 0
     3 9 图像 150 68 RGB 3 8 jpx 无 13 0
     3 10 图像 6 6 RGB 3 8 图像编号 14 0
     3 11 图像 4 4 RGB 3 8 图像编号 15 0

它不直接报告 DPI 分辨率 - 但从“宽度”和“高度”维度您可以轻松计算它:您使用英寸标尺测量屏幕上图片的宽度,然后将“宽度像素”除以测量的尺数...

您觉得这很奇怪,因为结果取决于您当前的缩放级别?是的!

“分辨率”的概念始终取决于环境。所谓的“高分辨率”图片基本上总是在宽度和高度上有很多像素。如果需要以更高的缩放级别显示或打印图片,这允许更好的质量(或“分辨率”)。


更新

同时有一个新版本的 (Poppler's) pdfimages

$  pdfimages -version
  pdfimages version 0.33.0
  [....]

这也报告了嵌入图像的分辨率,以 PPI(每英寸像素数)、水平 ( x-ppi) 和垂直 ( y-ppi) 方向为单位:

page num  type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
-------------------------------------------------------------------------------------
   1   0 image  1247  1738  rgb     3   8  jpx    no    3053 0   151   151  228K 3.6%
   2   1 image   582   839  gray    1   8  jpeg   no    2080 0    72    72  319B 0.1%
   2   2 image   344   364  gray    1   8  jpx    no    2079 0   150   150 4325B 3.5%
   3   3 image   581   838  rgb     3   8  jpeg   no       7 0    73    73 1980B 0.1%
   3   4 image  1088   776  rgb     3   8  jpx    no       8 0   150   151  106K 4.3%
   3   5 image     6     6  rgb     3   8  image  no       9 0   150   150  108B 100%
   3   6 image     8     6  rgb     3   8  image  no      10 0   150   150  158B 110%
   3   7 image     4     6  rgb     3   8  image  no      11 0   150   150   73B 101%
   3   8 image   212   106  rgb     3   8  jpx    no      12 0   150   150 2396B 3.6%
   3   9 image   150    68  rgb     3   8  jpx    no      13 0   150   150 1878B 6.1%
   3  10 image     6     6  rgb     3   8  image  no      14 0   150   150   81B  75%
   3  11 image     4     4  rgb     3   8  image  no      15 0   150   150   50B 104%

此新功能首次出现在 Poppler 0.25 版(2013 年 12 月 11 日星期三发布)中。它还报告...

  • ... (文件)大小
  • ... (压缩)比率

...嵌入图像。

的限制pdfimages -list

也许我还应该让您了解该pdfimages实用程序的局限性,并举一个其输出报告不完全正确的示例。

一个例子是我(最近创建的) GitHub 存储库中的这个手工编码的 PDF,它可以帮助初学者学习 PDF 源代码的语法

我最初创建此 PDF 是为了演示Mozilla 的 PDF.js 渲染器的错误。这是关于它在PDF.js中的外观(左)以及正确渲染时的外观的屏幕截图(右,由GhostscriptAdob ​​e Reader渲染):

 

(右键单击上面的每个图像。选择“在新选项卡中打开图像”以查看确切的差异...“)


PDF 文件包含一个 2x2 像素的图像,仅嵌入一次(带有 object ID 5 0),但在页面上多次显示并使用不同的设置,每次放置图像时...

  • ...在不同的位置,
  • ...具有不同的缩放比例,
  • ...不同的旋转,
  • ...即使有不同的skew

在这些极端情况下pdfimages -list,当试图确定此图像实例的某些分辨率时,它会一头雾水:

page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
------------------------------------------------------------------------------------
   1   0 image    2     2  rgb     3   8 image  no        5 0     4     4   13B 108%
   1   1 image    2     2  rgb     3   8 image  no        5 0     5     3   13B 108%
   1   2 image    2     2  rgb     3   8 image  no        5 0     3     5   13B 108%
   1   3 image    2     2  rgb     3   8 image  no        5 0     6     3   13B 108%
   1   4 image    2     2  rgb     3   8 image  no        5 0     3    10   13B 108%
   1   5 image    2     2  rgb     3   8 image  no        5 0     4 72000   13B 108%
   1   6 image    2     2  rgb     3   8 image  no        5 0     4     2   13B 108%
   1   7 image    2     2  rgb     3   8 image  no        5 0     2     4   13B 108%
   1   8 image    2     2  rgb     3   8 image  no        5 0 14401     1   13B 108%
   1   9 image    2     2  rgb     3   8 image  no        5 0     1     2   13B 108%
   1  10 image    2     2  rgb     3   8 image  no        5 0 0.950     4   13B 108%
   1  11 image    2     2  rgb     3   8 image  no        5 0     4 0.950   13B 108%
   1  12 image    2     2  rgb     3   8 image  no        5 0 0.950     4   13B 108%
   1  13 image    2     2  rgb     3   8 image  no        5 0     1     4   13B 108%
   1  14 image    2     2  rgb     3   8 image  no        5 0 0.950     4   13B 108%
   1  15 image    2     2  rgb     3   8 image  no        5 0 0.950     4   13B 108%
   1  16 image    2     2  rgb     3   8 image  no        5 0     4 0.950   13B 108%

pdfimages -list如果没有旋转和/或不涉及倾斜,则大多数值都是正确的。难怪图像旋转或倾斜会出现差异:因为对于这种情况,您如何可靠地定义andx-ppiy-ppi?这解释了72000 y-ppi图像编号的(完全错误的)值。5 和14401 x-ppi图像编号。8.

如您所见,pdfimages确定其他图像属性相当聪明:

  1. 它为显示的图像的所有实例正确报告了相同的对象 ID 5 0,表明此图像嵌入了一次,但在页面上显示了多次
  2. 它正确地将图像尺寸报告为2x2像素。
于 2012-07-28T09:30:55.560 回答
6

这并不容易,但这是可能的。虽然你不能使用PDFDocument.,但你可以使用CGPDF*Quartz 中的东西。简而言之:您将需要使用CGPDFPageGetDictionary()获取图像所在页面的字典,然后从字典中获取有关其 XObject 的信息(假设它未内联在流中)。即使这也不是很简单——您需要查阅 PDF 标准以了解如何格式化 XObject,然后使用各种CG*例程深入了解您需要的内容。

我应该补充一点,PDF 文档的默认 DPI(“用户单位”)是 72。此外,PDF 中的许多图像都是用矢量图形创建的,因此它们实际上没有默认 DPI。

于 2012-07-24T18:40:35.427 回答
1

您需要通过 Do 命令访问的原始图像 XObject 的尺寸

于 2012-07-25T07:23:53.713 回答
1

答案肯定是否定的,因为 PDF 文档并没有真正的内在分辨率。解决方案最终取决于当时谁在处理文档及其元素。它甚至会因您在 Adob​​e Acrobat 中使用的缩放量而异。

例如,我创建了一个 16x16 像素尺寸的二维条码,并在将其添加到文档之前将其缩放为一英寸宽和一英寸高。它在 adobe acrobat reader 中看起来非常清晰(即每平方元素有很多像素),但是当我将生成的 PDF 发送到传真服务时,它最终是 100x200 分辨率(大约)。当我在激光打印机中打印同一份文档时,它最终更像是 400dpi。当我在 acrobat reader 中单击条形码图像并将其复制/粘贴到 Gimp 中时,它会显示为一个 16x16 的微小位图。

于 2015-01-23T00:40:24.663 回答
-1

该答案旨在作为@Kurt Pfeifle 答案的附录,并且在Objective C 之外工作。

或者:

如果您有 Windows 系统并且没有设置编译器,那么以下是最简单的方法。下载 Windows XPDF 二进制文件;然后使用pdfimages提取图像,将它们转换为 BMP 格式,然后mspaint会告诉你分辨率。这种方法的优点是:

  • 您可以通过测量图像大小来获得精确的分辨率,而无需进行估计;

  • 它适用于XPDFpdfimages.

缺点是:

  • 这需要更多的工作,包括将文件转换为无需更改分辨率即可打开的格式;

  • 您必须单独为每个文件执行此操作,而不是获取列表。

  • 它为您提供图像本身的分辨率,而不是它们在 PDF 文件中出现的分辨率。(感谢 Kurt Pfeifle 的评论)

于 2015-06-12T14:57:28.333 回答