针对你之前的问题,可以参考下面这个答案:
基本上,你现在可以使用Poppler的pdfimages
命令行工具中的(新的)-list
参数(但它不适用于XPDF的版本 pdfimages
!)。
它会报告出现在特定页面上的每个图像的尺寸。
(你也可以用它从PDF中提取图像:pdfimages -png -f 3 -l 5 some.pdf prefix---
将从PDF文件中提取所有图像作为PNG,从第f一页3开始,到最后一页l5结束,使用每个图像的文件名前缀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分辨率——但是从“width”和“height”维度可以轻松计算出来:您用英寸尺在屏幕上测量图片的宽度,然后将“宽度像素”除以测量到的尺寸...
您会发现这很奇怪,因为结果取决于您当前的缩放级别?是的!
“分辨率”的概念始终取决于环境。所谓的“高分辨率”图片基本上总是有很多宽度和高度的像素。如果需要使用更高的缩放级别来显示或打印图片,则此方法可提供更好的质量(或“分辨率”)。
与此同时,(Poppler的)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
实用程序的限制,并且举一个例子说明其输出报告并不完全正确。
一个例子是来自我的PDF 语法帮助初学者研究的 GitHub 存储库中的手工编码 PDF。
我最初创建这个 PDF 是为了展示 Mozilla's PDF.js 渲染器的 Bug。
下面是屏幕截图,左边是 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%
pdfimages -list
命令在没有旋转和/或倾斜的情况下可以正确获取大多数值。如果图像被旋转或倾斜,那么不一致是很正常的:因为对于这种情况,您该如何可靠地定义 x-ppi
和 y-ppi
值呢?这就解释了第5张图片完全错误的 72000 y-ppi
值和第8张图片错误的 14401 x-ppi
值。
正如您可以轻松看到的那样,pdfimages
对于确定其他图像属性相当聪明:
5 0
,表明该图像被嵌入一次,但在页面上显示多次。2x2
像素。PDFDocument
是不可能的,但你可以使用 Quartz 中的 CGPDF*
工具。简单来说,你需要使用 CGPDFPageGetDictionary()
来获取图片所在页面的字典,然后从该字典中获取关于其 XObject 的信息(假设它没有被嵌入到流中)。即使这也不是很直接,你还需要查阅 PDF 标准以了解 XObject 可能的格式,并使用各种 CG*
程序来深入挖掘你需要的内容。cpdf -image-resolution <number>
报告,其中number是所需的最低分辨率。因此,我们设置了非常高的分辨率,以便报告所有图像。在Kurt的示例PDF中:cpdf -image-resolution 1000000 111_current-transformation-matrix-ctm.pdf
1, /XOb1, 2, 2, 0.000694, 0.000694
1, /XOb1, 2, 2, 0.000926, 0.000556
1, /XOb1, 2, 2, 0.000545, 0.000958
1, /XOb1, 2, 2, 0.000694, 0.000694
1, /XOb1, 2, 2, 0.000694, 0.000694
1, /XOb1, 2, 2, 0.000491, 0.000694
1, /XOb1, 2, 2, 0.000491, 0.000694
1, /XOb1, 2, 2, 0.000694, 0.000491
1, /XOb1, 2, 2, 0.000139, 0.000098
1, /XOb1, 2, 2, 0.000139, 0.000120
1, /XOb1, 2, 2, 0.000087, 0.000694
1, /XOb1, 2, 2, 0.000694, 0.000087
1, /XOb1, 2, 2, 0.000087, 0.000694
1, /XOb1, 2, 2, 0.000116, 0.000694
1, /XOb1, 2, 2, 0.000087, 0.000694
1, /XOb1, 2, 2, 0.000087, 0.000694
1, /XOb1, 2, 2, 0.000694, 0.000087
这个答案是作为@Kurt Pfeifle答案的补充,适用于Objective C之外的情况。
如果您有Windows系统并且没有设置编译器,则以下是最简单的方法。下载Windows XPDF二进制文件;然后使用pdfimages
提取图像,将它们转换为BMP格式,然后mspaint
将告诉您分辨率。这种方法的优点是:
您可以获得精确的分辨率,而无需通过测量图像大小来估计它;
它将适用于XPDF版本的pdfimages
。
缺点是:
需要更多的工作,包括将文件转换为您可以在不改变分辨率的情况下打开的格式;
您必须针对每个文件单独执行此操作,而不是获取列表。
它提供的是图像本身的分辨率,而不是它们在PDF文件中出现的分辨率。(感谢Kurt Pfeifle的评论)
pdfimages
报告错误的值...) - Kurt Pfeifle