确定PDF页面上的最大分辨率(DPI)

时间:2014-08-06 18:19:32

标签: c# itextsharp ghostscript dpi rasterizing

在将页面图像发送到打印机之前,我正在使用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();
        }

1 个答案:

答案 0 :(得分:1)

PDF页面没有解决方案。其中的图像可以被认为具有分辨率,该分辨率由页面上图像的宽度除以x方向上的图像样本的数量,以及页面上的图像的高度除以y方向的图像样本。

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

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

然而,这肯定不会在一般情况下起作用。