2014-01-30 79 views
0

我正在使用GhostScript.NET來打印PDF。 當我用96DPI打印時,PDF打印效果不錯,但有點模糊。 如果我嘗試在600DPI上打印文檔,打印頁面會非常放大。我在看網頁對象時注意到使用GhostScript.NET DPI打印問題打印PDF

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 - 返回的圖像具有96 Horizo​​ntalResolution和96

所以我一VerticalResolution嘗試以下內容:

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

這有一個水平分辨率600和垂直分辨率600,但這打印圖像甚至更大!

任何人都可以在這裏提供建議嗎?

回答

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(); 
    } 
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();