我正在使用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 - 返回的图像的HorizontalResolution为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;
它的HorizontalResolution为600,VerticalResolution为600,但是这个图像打印得更大了!
有人可以在这里提出建议吗?
答案 0 :(得分:2)
嗨,我遇到了同样的问题。
Rasterizer只能缩放到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();
}
答案 1 :(得分: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();