是否有任何免费的库,可用于获取 PDF 文件中包含的 DPI 图像的分辨率?
我已经使用 PDFSharp 尝试了以下代码,但它返回的 DPI 不正确。例如,它显示 96dpi,而它应该是 150dpi:
using (PdfDocument pdf = PdfReader.Open(sourcePdf))
{
for (int i = 0; i < pdf.Pages.Count; i++)
{
XGraphics xGraphics = XGraphics.FromPdfPage(pdf.Pages[i]);
float dpi = xGraphics.Graphics.DpiX;
}
}
您可以使用命令行工具来获取您需要的信息:
pdfimages
。
但是,您需要一个基于
Poppler 库的最新版本
pdfimages
(不是基于 XPDF 的“pdfimages”!)
最近的 Poppler 版本允许您使用
-list
选项:
pdfimages -list -f 2 -l 4 my.pdf
上述示例命令的输出显示页面范围从 2(f要显示的第一页)到 4(l要显示的最后一页)的所有图像。
这是上述命令的输出,使用我专门为此问题准备的示例 PDF 文件(水平滚动以查看所有列):
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
---------------------------------------------------------------------------------------
2 0 image 697 1238 gray 1 8 jpeg no 16 0 320 320 142K 17%
3 1 image 697 1238 gray 1 8 jpeg no 16 0 151 151 142K 17%
4 2 image 697 1238 gray 1 8 jpeg no 16 0 84 115 142K 17%
输出显示以下内容:
第 2-4 三页有三幅图像(如第 1+2 栏所示,标题为
page
和 num
)。所有三个图像的 PDF 对象 ID 相同:
16 0
(如第 11+12 列所示,标题为 object
+ ID
)。这意味着 PDF 仅定义了一个不同的对象,但显示了三次(即图像仅嵌入一次,但出现在 3 页上)。图像的宽度为
697
像素,其高度为 1238
像素,其图像深度(每种颜色的位数)为 8
,其色彩空间为 gray
,其颜色通道/分量的数量为 1
,其压缩方案为 jpeg
,其字节大小(嵌入时)为 142K
,其压缩率为 17%
(如第 4-9 和 14+15 列所示,标题为 width
、height
、color
) 、 comp
、bpc
、size
和 ratio
)。但是,相同的图像以不同的分辨率显示在不同的页面上(以 PPI - 每英寸像素数 --- 不是 DPI):
第 2 页显示它在两个方向上的 PPI 为
320
,第 4 页显示它在两个方向上的 PPI 为
151
,而第 3 页显示水平 (X) 方向的 PPI 为
84
,垂直 (Y) 方向的 PPI 为 115
。现在,如果命令行工具无法重新用于您的目标:作为上面所示工具基础的 Poppler 库当然是免费的(“自由中的自由”,以及“自由中的自由”)啤酒')。
这是 PDF 的链接(“my.pdf”)我用来演示上面命令的输出。
PDF 在其定义中不一定使用 DPI。 PDF 允许 文档创建者可以定义自己的用户坐标空间 或者可能不会映射到类似于每英寸点数的任何内容。
从这里:
更新以提及最新的 XPDF 版本。
XPDF 从版本 4 开始将列出与 Poppler 类似但不相同的信息。提醒一下,这里是 poppler 命令,用于显示未存储在任何页面上但在 2 3 和 4 中显示的图像。请注意,它不必实际位于任何 PDF 页面内,它只是一个文件对象。
pdfimages -list my.pdf
(请注意,图像的大小与提到的不完全相同,但具有相同的相对位置)
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
2 0 image 697 1238 gray 1 8 jpeg no 18 0 320 320 104K 12%
3 1 image 697 1238 gray 1 8 jpeg no 18 0 151 151 104K 12%
4 2 image 697 1238 gray 1 8 jpeg no 18 0 84 115 104K 12%
这是
pdfimages -list my.pdf .
的 XPDF 输出
.-0000.pgm: page=2 width=697 height=1238 hdpi=320.00 vdpi=320.00 colorspace=DeviceGray bpc=8
.-0001.pgm: page=3 width=697 height=1238 hdpi=151.40 vdpi=150.60 colorspace=DeviceGray bpc=8
.-0002.pgm: page=4 width=697 height=1238 hdpi=115.00 vdpi=84.00 colorspace=DeviceGray bpc=8
一个有趣的区别是最后一个条目以不同的顺序显示为
hdpi=115.00 vdpi=84.00
而不是 xppi=84 and yppi=115
。然而我们可以直观地看到这可能是由于图像旋转造成的。
总而言之,您可以使用任何工具来提示 XY 密度分辨率,但不能依赖它们与输入或导出相关。
所示图像有其自己的内部元数据,设计用于在 600 dpi 打印机上打印。导出时将显示该内容。