如何检查PDF页面的嵌入图像的分辨率(DPI)?

有没有免费的库,可以用来获取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(第一页到显示)到4(要显示的页面)。

以下是上述命令的输出,使用我专门为此问题准备的示例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% 

输出显示以下内容:

  1. 三页2-4上有三个图像(如第1 + 2列所示, pagenum )。

  2. 所有三个图像的PDF 对象ID相同: 16 0 (如列11 + 12所示,标题object + ID )。 这意味着PDF只定义了一个不同的对象,但显示了三次(即图像只嵌入一次,但显示在3页上)。

  3. 图像的宽度为697像素,其高度为1238像素,其图像深度(每种颜色的位数)为8 ,其颜色空间为gray其颜色通道/分量的数量为1 ,其压缩方案为jpeg ,其字节大小(如嵌入)为142K ,其压缩率为17% (如第4-9和14 + 15栏所示, 142K widthheightcolorcompbpcsizeratio )。

  4. 但是,相同的图像出现在不同分辨率的不同页面上(以PPI表示 – 每英寸像素数 – 不是DPI ):

    • 第2页显示两个方向的PPI为320

    • 第4页显示两个方向的PPI为151

    • 而第3页显示水平(X)方向的PPI为84 ,垂直(Y)方向的PPI为115 PPI。


现在,如果命令行工具无法为您的目标重新定位:作为上述工具基础的Poppler库肯定是免费的( ‘自由’ ,以及‘免费啤酒’ )。


这是PDF( “my.pdf”链接,我用它来演示上面命令的输出。

PDF不一定在其定义中使用DPI。 PDF允许文档创建者定义他们自己的用户坐标空间,该空间可能会或可能不会映射到类似于每英寸点数的任何内容。

从这里: