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

时间:2012-07-24 18:22:29

标签: objective-c cocoa pdf quartz-graphics poppler

我有PDF document也包含图片。

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

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

在Cocoa中提供的东西是否可以实现?

5 个答案:

答案 0 :(得分:10)

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

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

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

(您也可以使用它从PDF中提取图像:pdfimages -png -f 3 -l 5 some.pdf prefix---将从PDF文件中提取所有图像为PNG,从 f 第一页开始3,以 l 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
  [....]

这也报告了嵌入图像的分辨率,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实用程序的局限性,并举例说明其输出报告不完全正确。

一个例子是(最近创建的)this handcoded PDF 中的 GitHub repository of PDFs to help beginners to study the syntax of PDF source code

我最初创建此PDF是为了演示 bug with Mozilla's PDF.js renderer 。 以下是关于它在 PDF.js (左)中的外观以及在正确呈现时应该如何显示的截图(右侧,由 Ghostscript 呈现)和 Adob​​e 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%
如果没有旋转和/或没有倾斜,

pdfimages -list可以获得大多数正确的值。难怪如果图像旋转或歪斜存在差异:因为对于这种情况,您甚至可以如何可靠地定义 x-ppiy-ppi值?这解释了图像号的72000 y-ppi的(完全错误的)值。 5和14401 x-ppi用于图片号。 8。

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

您需要使用Do命令

访问原始图像XObject的尺寸

答案 3 :(得分:1)

答案绝对不是,因为PDF文档实际上没有内在的解决方案。决议最终取决于当时谁处理文件及其要素。它甚至可以根据您在Adobe Acrobat中使用的缩放量而变化。

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

答案 4 :(得分:-1)

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

可替换地:

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

  • 您可以通过测量图像尺寸来获得精确的分辨率,而无需估算;

  • 适用于XPDF的{{1}}版本。

缺点是:

  • 需要做更多工作,包括将文件转换为您可以在不更改分辨率的情况下打开的格式;

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

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