如何计算PDF文档中嵌入的图像的分辨率(DPI)?

Dan*_*iel 8 pdf cocoa poppler objective-c quartz-graphics

我有一个PDF文档,也包含图像.

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

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

使用Cocoa提供的东西甚至可以实现吗?

Kur*_*fle 10

对于您的其他问题,请查看此答案:

基本上,你现在可以使用的(新)-list为poppler的的参数pdfimages命令行实用程序(它为XPDF的版本的工作pdfimages!).

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

(你也可以用它来从PDF中提取图像:pdfimages -png -f 3 -l 5 some.pdf prefix---将提取从PDF文件中的所有图片为PNG格式,从˚F IRST 3页,结尾 AST第5页,使用的文件名前缀prefix---为每个图像但这个问题.似乎不是你问题的主要焦点...)

例:

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

  page   num  type   width height color comp bpc  enc interp  object ID
  ---------------------------------------------------------------------
     1     0 image    1247  1738  rgb     3   8  jpx    no      3053  0
     2     1 image     582   839  gray    1   8  jpeg   no      2080  0
     2     2 image     344   364  gray    1   8  jpx    no      2079  0
     3     3 image     581   838  rgb     3   8  jpeg   no         7  0
     3     4 image    1088   776  rgb     3   8  jpx    no         8  0
     3     5 image       6     6  rgb     3   8  image  no         9  0
     3     6 image       8     6  rgb     3   8  image  no        10  0
     3     7 image       4     6  rgb     3   8  image  no        11  0
     3     8 image     212   106  rgb     3   8  jpx    no        12  0
     3     9 image     150    68  rgb     3   8  jpx    no        13  0
     3    10 image       6     6  rgb     3   8  image  no        14  0
     3    11 image       4     4  rgb     3   8  image  no        15  0

它不会直接报告DPI分辨率 - 但是从"宽度"和"高度"尺寸可以轻松计算:用一英寸标尺测量屏幕上图像的宽度,然后除以'宽度像素'测量的标尺数......

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

"决议"的概念总是取决于环境.所谓的"高分辨率"图片在宽度和高度上基本上总是有很多像素.如果需要以更高的缩放级别显示或打印图片,则可以获得更好的质量(或"分辨率").


更新

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

$  pdfimages -version
  pdfimages version 0.33.0
  [....]
Run Code Online (Sandbox Code Playgroud)

这也报告了嵌入图像的分辨率,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%
Run Code Online (Sandbox Code Playgroud)

这个新功能首先出现在Poppler版本0.25(2013年12月11日星期三发布)中.它另外报道......

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

...嵌入式图像

的局限性 pdfimages -list

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

一个例子是来自我(最近创建的)GitHub PDF库的手工编码PDF,以帮助初学者学习PDF源代码的语法.

我最初创建此PDF是为了演示Mozilla的PDF.js渲染器错误.这里是一个关于它的外观在截图PDF.js(左)和它是如何应该在正确渲染(右,通过渲染一下Ghostscript的ADOBE READER):

 

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


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

  • ......在不同的位置,
  • ...具有不同的缩放比例
  • ......轮换不同,
  • ......即使有不同的倾斜.

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%
Run Code Online (Sandbox Code Playgroud)

pdfimages -list如果没有旋转和/或没有倾斜,则获得大多数值正确.难怪有差异,如果将图像旋转或倾斜:因为你会怎么连可靠定义x-ppiy-ppi值这样的情况?这解释了72000 y-ppi图像号的(完全错误的)值.5和14401 x-ppi图像号.8.

您可以很容易地看到,pdfimages确定其他图像属性非常聪明:

  1. 它正确地5 0为所显示图像的所有实例报告相同的对象ID ,表示该图像嵌入一​​次,但在页面上多次显示.
  2. 它正确地将图像尺寸报告为2x2像素.


Tur*_*rix 6

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

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