1

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

1 回答 1

1

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

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

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

但是,这在一般情况下绝对行不通。

于 2014-08-06T19:09:24.557 回答