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-ppi和y-ppi值这样的情况?这解释了72000 y-ppi图像号的(完全错误的)值.5和14401 x-ppi图像号.8.
您可以很容易地看到,pdfimages确定其他图像属性非常聪明:
5 0为所显示图像的所有实例报告相同的对象ID ,表示该图像嵌入一次,但在页面上多次显示.2x2像素.这并不容易,但这是可能的.虽然你不能使用它PDFDocument,但你可以使用CGPDF*Quartz中的东西.简而言之:您将需要使用CGPDFPageGetDictionary()获取图像所在页面的字典,然后从字典中获取有关其XObject(假设它未在流中内联)的信息.即使这不是直截了当的 - 您需要咨询PDF标准以了解如何格式化XObject,然后使用各种CG*例程深入了解您的需求.
我应该补充一点,PDF文档的默认DPI("用户单位")是72.此外,PDF中的许多图像都是使用矢量图形创建的,因此它们实际上没有默认的DPI.