0

我正在使用GhostScript.NET打印 PDF。当我以 96DPI 打印时,PDF 打印效果很好,但有点模糊。如果我尝试以 600DPI 打印文档,则打印的页面会放大很多。

using GhostScript.NET.Rasterizer;
using System.Drawing.Printing;

PrintDocument doc = new PrintDocument();
doc.PrinterSettings.PrinterName="<printer name>";
doc.PrinterSettings.Copies=(short)1;
GhostScriptRasterizer rasterizer = new GhostScriptRasterizer();
rasterizer.Open("abc.pdf");
//Image page = rasterizer.GetPage(96,96); <-- this one prints ok
Image page = rasterizer.GetPage(600,600);
doc.Graphics.DrawImage(page, new Point());

在查看页面对象时我注意到的一件事是,尽管我通过了 GetPage() 600、600 - 返回的图像的 Horizo​​ntalResolution 为 96,VerticalResolution 为 96。

所以我尝试了以下方法:

Bitmap b = new Bitmap(page.Width,page.Height);
b.SetResolution(600,600);
Graphics g = Graphics.FromImage(b);
g.DrawImage(page,0,0);
page = b; 

它的 Horizo​​ntalResolution 为 600,VerticalResolution 为 600,但这打印的图像更大!

有人可以在这里给建议吗?

4

2 回答 2

2

嗨,我遇到了同样的问题。

光栅化器仅缩放到 dpi...

你必须使用 GhostScriptProcessor。

private List<string> GetImageWithGhostGhostscriptProcessor(string psFilename, string outputPath, int dip = 300)
    {
        if (!Directory.Exists(outputPath))
            Directory.CreateDirectory(outputPath);

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

        using (GhostscriptProcessor processor = new GhostscriptProcessor(gv, true))
        {
            processor.Processing += new GhostscriptProcessorProcessingEventHandler(processor_Processing);

            List<string> switches = new List<string>();
            switches.Add("-empty");
            switches.Add("-dSAFER");
            switches.Add("-dBATCH");
            switches.Add("-dNOPAUSE");
            switches.Add("-dNOPROMPT");
            switches.Add(@"-sFONTPATH=" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.Fonts));
            switches.Add("-dFirstPage=" + 1);
            switches.Add("-dLastPage=" + 1);
            //switches.Add("-sDEVICE=png16m");
            switches.Add("-sDEVICE=tiff24nc");
            //switches.Add("-sDEVICE=pdfwrite");

            switches.Add("-r" + dip);
            switches.Add("-dTextAlphaBits=4");
            switches.Add("-dGraphicsAlphaBits=4");

            switches.Add(@"-sOutputFile=" + outputPath + "\\page-%03d.tif");
            //switches.Add(@"-sOutputFile=" + outputPath + "page-%03d.png");
            switches.Add(@"-f");
            switches.Add(psFilename);



            processor.StartProcessing(switches.ToArray(), null);
        }

        return Directory.EnumerateFiles(outputPath).ToList();
    }
于 2014-02-12T08:06:34.213 回答
0

我认为您传递给 DrawImage 方法的参数应该是您希望图像在纸上的大小,而不是默认保留它们,然后 DrawImage 命令将为您处理缩放。可能最简单的方法是使用 DrawImage 命令的以下覆盖。

注意:如果图像的比例与矩形不同,这将使图像倾斜。一些关于图像大小和纸张大小的简单数学运算将允许您创建一个适合纸张边界的新矩形,而不会扭曲图像。

这对我有用:

int desired_x_dpi = 600;
int desired_y_dpi = 600;

Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);

System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
pd.PrintPage += (sender, args) =>
{
    args.Graphics.DrawImage(img, args.MarginBounds);
};
pd.Print();
于 2014-01-31T07:15:39.457 回答