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 方向の画像サンプル。

そのため、ページ上の画像の幅と高さを計算する必要があります。これは、Current Transformation Matrix によって変更された画像マトリックスによって与えられます。したがって、ページの幅と高さを計算するには、画像がレンダリングされるポイントまでのコンテンツ ストリームを解釈し、グラフィックス状態 CTM を追跡する必要があります。

一般的な PDF ファイルの場合、これを知る唯一の方法は、PDF インタープリターを使用することです。ページのコンテンツ全体が単一の画像であるという厳密に制限されたケースでは、スケーリングが行われないことに賭けて、メディアの幅を画像の幅で割り、メディアの高さを画像の高さで割って、x と y の解像度を求めることができます。 .

ただし、これは一般的なケースでは確実に機能しません。

于 2014-08-06T19:09:24.557 に答える