我有一个包含图像的PDF 文档。
现在我想知道这些图像的分辨率。
第一步是以某种方式从 PDF 文档中获取图像。但是怎么做?
可可中提供的东西甚至可能吗?
看看你的另一个问题的答案:
基本上,您现在可以-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中的外观(左)以及正确渲染时的外观的屏幕截图(右,由Ghostscript和Adob e Reader渲染):
(右键单击上面的每个图像。选择“在新选项卡中打开图像”以查看确切的差异...“)
PDF 文件包含一个 2x2 像素的图像,仅嵌入一次(带有 object 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
如果没有旋转和/或不涉及倾斜,则大多数值都是正确的。难怪图像旋转或倾斜会出现差异:因为对于这种情况,您如何可靠地定义andx-ppi
值y-ppi
?这解释了72000 y-ppi
图像编号的(完全错误的)值。5 和14401 x-ppi
图像编号。8.
如您所见,pdfimages
确定其他图像属性相当聪明:
5 0
,表明此图像嵌入了一次,但在页面上显示了多次。2x2
像素。这并不容易,但这是可能的。虽然你不能使用PDFDocument
.,但你可以使用CGPDF*
Quartz 中的东西。简而言之:您将需要使用CGPDFPageGetDictionary()
获取图像所在页面的字典,然后从字典中获取有关其 XObject 的信息(假设它未内联在流中)。即使这也不是很简单——您需要查阅 PDF 标准以了解如何格式化 XObject,然后使用各种CG*
例程深入了解您需要的内容。
我应该补充一点,PDF 文档的默认 DPI(“用户单位”)是 72。此外,PDF 中的许多图像都是用矢量图形创建的,因此它们实际上没有默认 DPI。
您需要通过 Do 命令访问的原始图像 XObject 的尺寸
答案肯定是否定的,因为 PDF 文档并没有真正的内在分辨率。解决方案最终取决于当时谁在处理文档及其元素。它甚至会因您在 Adobe Acrobat 中使用的缩放量而异。
例如,我创建了一个 16x16 像素尺寸的二维条码,并在将其添加到文档之前将其缩放为一英寸宽和一英寸高。它在 adobe acrobat reader 中看起来非常清晰(即每平方元素有很多像素),但是当我将生成的 PDF 发送到传真服务时,它最终是 100x200 分辨率(大约)。当我在激光打印机中打印同一份文档时,它最终更像是 400dpi。当我在 acrobat reader 中单击条形码图像并将其复制/粘贴到 Gimp 中时,它会显示为一个 16x16 的微小位图。
该答案旨在作为@Kurt Pfeifle 答案的附录,并且在Objective C 之外工作。
如果您有 Windows 系统并且没有设置编译器,那么以下是最简单的方法。下载 Windows XPDF 二进制文件;然后使用pdfimages
提取图像,将它们转换为 BMP 格式,然后mspaint
会告诉你分辨率。这种方法的优点是:
您可以通过测量图像大小来获得精确的分辨率,而无需进行估计;
它适用于XPDF的pdfimages
.
缺点是:
这需要更多的工作,包括将文件转换为无需更改分辨率即可打开的格式;
您必须单独为每个文件执行此操作,而不是获取列表。
它为您提供图像本身的分辨率,而不是它们在 PDF 文件中出现的分辨率。(感谢 Kurt Pfeifle 的评论)