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

问题描述 投票:0回答:3

是否有任何免费的库,可用于获取 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; 
    }
}
c# pdf dpi pdfsharp
3个回答
4
投票

您可以使用命令行工具来获取您需要的信息:

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%

输出显示以下内容:

  1. 第 2-4 三页有三幅图像(如第 1+2 栏所示,标题为

    page
    num
    )。

  2. 所有三个图像的 PDF 对象 ID 相同:

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

  3. 图像的宽度为

    697
    像素,其高度为
    1238
    像素,其图像深度(每种颜色的位数)为
    8
    ,其色彩空间为
    gray
    ,其颜色通道/分量的数量为
    1
    ,其压缩方案为
    jpeg
    ,其字节大小(嵌入时)为
    142K
    ,其压缩率为
    17%
    (如第 4-9 和 14+15 列所示,标题为
    width
    height
    color
    ) 、
    comp
    bpc
    size
    ratio
    )。

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

    • 第 2 页显示它在两个方向上的 PPI 为

      320

    • 第 4 页显示它在两个方向上的 PPI 为

      151

    • 而第 3 页显示水平 (X) 方向的 PPI 为

      84
      ,垂直 (Y) 方向的 PPI 为
      115


现在,如果命令行工具无法重新用于您的目标:作为上面所示工具基础的 Poppler 库当然是免费的(“自由中的自由”,以及“自由中的自由”)啤酒')。


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


2
投票

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

这里:


0
投票

更新以提及最新的 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%

enter image description here

这是

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 打印机上打印。导出时将显示该内容。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.