【问题标题】:How to check PDF pages for resolution (DPI) of embedded images?如何检查 PDF 页面的嵌入图像的分辨率 (DPI)?
【发布时间】:2015-01-14 08:25:04
【问题描述】:

有没有免费的库,可用于获取 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; 
    }
}

【问题讨论】:

  • 您的代码没有访问任何图像。要获得图像的 DPI,首先必须找到图像。 PDFsharp 不是为此类任务而设计的,因为 PDFsharp 无法呈现 PDF 文件。
  • 好的,那么使用 PDFSharp 获取 DPI 是不可能的吗?如果是这样,我可以用什么代替?不幸的是,我只能使用免费用于商业用途的此类库......所以我不能使用 ItextSharp :(
  • 我不明白你想达到什么目的。 PDF 中的单个图像可以在具有不同 DPI 的 PDF 文件中多次绘制。通过变换,图像顶部可能具有与底部不同的 DPI。获取 DPI 值的目的是什么?它应该适用于任何 PDF 文件还是只适用于由特定应用程序创建的 PDF 文件?

标签: c# pdf dpi pdfsharp


【解决方案1】:

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

但是,您需要基于 Poppler library 的最新版本 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 列所示,标题为 pagenum)。

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

  3. 1234563 1,它的压缩方案是jpeg,它的字节大小(作为嵌入)是142K,它的压缩率是17%(如第4-9列和第14+15列所示widthheightcolorcompbpcsizeratio)。
  4. 但是,相同的图像以不同的分辨率出现在不同的页面上(给出为 PPI -- 每英寸像素数 -- 不是 DPI):

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

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

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


现在,如果命令行工具不能重新用于您的目标:作为上述工具基础的 Poppler 库肯定是免费的('free as in liberty',如以及'像啤酒一样免费')。


这是我用来演示上面命令输出的link to the PDF ("my.pdf")

【讨论】:

    【解决方案2】:

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

    来自here:

    【讨论】:

    • 嵌入的图像仍然有一个确定的尺寸,无论是它们占据了多少页面,还是它们的像素尺寸有多大。这意味着您可以从中计算 dpi。
    • 好的,我可以获取图片的宽度和高度,但是在哪里可以找到像素尺寸?
    • @Joey 嵌入的图像仍然具有确定的大小 - a 不一定是单个;相同的图像资源可以在不同的尺度上多次使用。 b 此外,图像不仅可以缩放,还可以旋转和倾斜。就 dpi 而言,这意味着什么?
    • 这个答案大多不正确。不过,我不会反对它 - 只是想一想并采取适当的行动(我建议改进/修改您的答案,删除它)。请看我给出的例子!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-11-13
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多