gpt4 book ai didi

pdf - 如何从 shell 脚本中判断扫描的 PDF 的分辨率?

转载 作者:行者123 更新时间:2023-12-04 03:02:57 29 4
gpt4 key购买 nike

我有大量扫描成 PDF 格式的文档,我希望编写一个 shell 脚本将每个文档转换为 DjVu格式。一些文档以 200dpi 扫描,一些以 300dpi 扫描,一些以 600dpi 扫描。由于 DjVu 是一种基于像素的格式,我想确保我在目标 DjVu 文件中使用的分辨率与用于扫描的分辨率相同。

有谁知道我可以运行什么程序,或者我如何编写程序,以确定用于生成扫描 PDF 的分辨率? (像素数也可能起作用,因为几乎所有文档都是 8.5 x 11 英寸。)

回复后澄清:我知道布列塔尼强调的困难,我愿意承认这个问题一般是不适定的,但我不是问一般的 PDF 文档。我的特定文件来自扫描仪。它们每页包含一个扫描图像,每页具有相同的分辨率。如果我将 PDF 转换为 PostScript,我可以手动查看并轻松找到像素尺寸;我可能可以通过更多的工作找到图像大小。如果迫切需要我可以修改字典堆栈 gs正在使用;很久以前,我为 PostScript Level 1 写了一个解释器。

所有这些都是我试图避免的。

感谢收到的帮助,我在下面发布了一个答案:

  • 使用 identify 从 PDF 中提取边界框,只取第一页的输出,并理解单位将是 PostScript 点,其中有 72 到一英寸。
  • 使用 pdfimages 从第一页提取图像.
  • 获取图像的高度和宽度。这次identify将给出像素数。
  • 将图像的总面积相加得到点数的平方。
  • 要获得分辨率,以平方英寸计算边界框的面积,将点的平方除以平方英寸,取平方根,然后四舍五入到最接近的 10 的倍数。

  • 脚本的完整答案如下。我在实弹中使用它,效果很好。感谢 Harlequin pdfimages和 Spiffeah 用于每页多张图像的警报(这种情况很少见,但我发现了一些)。

    最佳答案

    如果 pdf 是通过扫描创建的,那么每个页面应该只有一个图像。您可以通过使用 iText 解析 pdf 来找到每个页面图像的每个图像分辨率。 (Java) 或 iTextSharp (.net 端口)库很容易。

    如果您想推出自己的实用程序来执行此操作,请在 iTextSharp 中执行以下操作:

    PdfReader reader = new PdfReader(filename);
    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
    PdfDictionary pg = reader.GetPageN(i);
    PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
    PdfDictionary xobjs = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
    if (xobjs != null)
    {
    foreach (PdfName xObjectKey in xobjs.Keys)
    {
    PdfObject xobj = xobjs.Get(xObjectKey);
    PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(xobj);
    PdfName subtype = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
    if (subtype.Equals(PdfName.IMAGE))
    {
    PdfNumber width = (PdfNumber)tg.Get(PdfName.WIDTH);
    PdfNumber height = (PdfNumber)tg.Get(PdfName.HEIGHT);
    MessageBox.Show("image on page [" + i + "] resolution=[" + width +"x" + height + "]");
    }
    }
    }
    }
    reader.Close();

    对于每个页面,我们通读子类型 Image 的每个 XObject 并获取 WIDTH 和 HEIGHT 值。这将是扫描仪嵌入 pdf 的图像的像素分辨率。

    请注意,此图像的缩放以匹配页面分辨率(如 Acrobat 中呈现的页面大小 - A4、Letter 等)在页面内容流中单独执行,它表示为 postscript 的子集,以及许多不解析后记就很难找到。

    请注意,有些扫描仪会将扫描图像嵌入为较小图像的网格(我假设是为了某种尺寸优化)。因此,如果您看到每个页面弹出 50 个小图像,这可能就是原因。

    如果您必须推出自己的实用程序,希望这在某种程度上有所帮助。

    关于pdf - 如何从 shell 脚本中判断扫描的 PDF 的分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452667/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com