【问题标题】:Determine the max resolution (DPI) on a PDF page确定 PDF 页面上的最大分辨率 (DPI)
【发布时间】:2014-09-29 19:13:40
【问题描述】:

在将页面图像发送到打印机之前,我正在使用 GhostScript.Net 将 PDF 光栅化为页面图像。我这样做是为了始终可以光栅化到 300dpi。这使我可以在合理的时间内打印 PDF,而不管 PDF 中任何图像的大小(主要是扫描的 PDF)。

但是,令我震惊的是,在某些情况下,不需要光栅化高达 300dpi。根据页面的内容,可能会光栅化到 200dpi 甚至 100dpi。

是否有人尝试确定 PDF 页面内容的最大 DPI?也许使用 iTextSharp?

我当前的代码是这样的:

        var dpiList = new List<int> {50, 100, 150, 200, 250, 300, 350, 400, 450, 500};

        string inputPdfPath = @"C:\10page.pdf";
        string outputPath = @"C:\Print\";

        var lastInstalledVersion =
            GhostscriptVersionInfo.GetLastInstalledVersion(
                    GhostscriptLicense.GPL | GhostscriptLicense.AFPL,
                    GhostscriptLicense.GPL);

        var rasterizer = new GhostscriptRasterizer();

        rasterizer.Open(inputPdfPath, lastInstalledVersion, true);

        var imageFiles = new List<string>();

        for (int pageNumber = 1; pageNumber <= 10; pageNumber++)
        {
            foreach (var dpi in dpiList)
            {
                string pageFilePath = System.IO.Path.Combine(outputPath,
                    string.Format("{0}-{1}-{2}.png", pageNumber, Guid.NewGuid().ToString("N").Substring(0, 8), dpi));

                System.Drawing.Image img = rasterizer.GetPage(dpi, dpi, pageNumber);
                img.Save(pageFilePath, ImageFormat.Png);
                imageFiles.Add(pageFilePath);

                Console.WriteLine(pageFilePath);
            }
        }

        var imageCount = 0;

        var pd = new PrintDocument();
        pd.PrintPage += delegate(object o, PrintPageEventArgs args)
        {
            var i = System.Drawing.Image.FromFile(imageFiles[imageCount]);

            var pageBounds = args.PageBounds;
            var margin = 48;

            var imageBounds = new System.Drawing.Rectangle
            {
                Height = pageBounds.Height - margin,
                Width = pageBounds.Width - margin,
                Location = new System.Drawing.Point(margin / 2, margin / 2)
            };

            args.Graphics.DrawImage(i, imageBounds);
            imageCount++;
        };

        foreach (var imagefile in imageFiles)
        {
            pd.Print();
        }

【问题讨论】:

  • 如果是扫描的 PDF,每页一张图像,您可以考虑提取这些图像并在需要时对其进行缩放。结果应该比光栅化页面更好。

标签: c# itextsharp ghostscript dpi rasterizing


【解决方案1】:

PDF 页面没有分辨率。其中的图像可以认为有一个分辨率,它由页面上图像的宽度除以x方向上的图像样本数和页面上图像的高度除以图像的数量给出y 方向的图像样本。

这样就剩下计算页面上图像的宽度和高度了。这是由图像矩阵给出的,由电流变换矩阵修改。因此,为了计算出页面的宽度和高度,您需要将内容流解释到渲染图像的位置,跟踪图形状态 CTM。

对于一般的 PDF 文件,了解这一点的唯一方法是使用 PDF 解释器。在整个页面内容是单个图像的严格限制情况下,您可以赌没有发生缩放,只需将媒体宽度除以图像宽度,将媒体高度除以图像高度即可得到 x 和 y 分辨率.

但是这在一般情况下肯定行不通。

【讨论】:

  • 是的。此外,CTM 不限于缩放,而是还可以倾斜和旋转图像。这使得 dpi 的概念变得毫无意义。
  • @mkl:我的猜测是 PDF 页面上 99% 的图像既不倾斜也不旋转。因此,在 99% 的情况下,计算 PPI/DPI 仍然有意义(分别针对 X 和 Y 方向,因为大约 10% 的图像在不保留纵横比的情况下进行缩放)。
  • @KurtPfeifle 99% - 仍然应该告诉 OP。如果他确信这样的图像对他来说不会成为问题,那就更好了。但可能他处于需要 100% 正确率的情况。或者在 PDF 经常使用倾斜和旋转图像的情况下......
  • @mkl:当然,你说的偏斜和旋转是对的 :-) 我只是想把它放在一个(个人色彩的)角度。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多