2012-04-02 83 views
24

在C#中,我试图用下面的代码使用PrintDocument类打印图像。图像大小为1200像素宽,1800像素高。我试图使用小型zeebra打印机在4 * 6纸张上打印此图像。但该程序仅打印4 * 6的大图像。这意味着它不会将图像调整为纸张大小!使用PrintDocument打印图像。如何调整图像以适合纸张尺寸

 PrintDocument pd = new PrintDocument(); 
    pd.PrintPage += (sender, args) => 
    { 
      Image i = Image.FromFile("C://tesimage.PNG"); 
      Point p = new Point(100, 100); 
      args.Graphics.DrawImage(i, 10, 10, i.Width, i.Height); 
    }; 
    pd.Print(); 

当我使用的是Window打印打印相同的图像(点击右键并选择打印,它会自动缩放到纸张大小和打印正确。这意味着所有的东西都在4 * 6纸。)我怎么做的在我的C#程序中也一样?

+3

如果你喜欢答案,接受它。它给予回答你的人信用,并帮助其他人寻找答案,以更快找到合适的人 – 2014-10-14 07:15:39

回答

31

传递到DrawImage方法的参数应该是纸张上图像的大小而不是图像本身的大小,然后DrawImage命令将为您处理缩放。可能最简单的方法是使用DrawImage命令的以下重写。

args.Graphics.DrawImage(i, args.MarginBounds); 

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

+2

这应该是答案!感谢您的解决方案,它按预期工作。 – Crushermike 2015-06-04 19:07:07

20

不要践踏BBoy已经很体面的答案,但我已经完成了保持宽高比的代码。我采纳了他的建议,所以他应该在这里得到部分信用!

PrintDocument pd = new PrintDocument(); 
pd.DefaultPageSettings.PrinterSettings.PrinterName = "Printer Name"; 
pd.DefaultPageSettings.Landscape = true; //or false! 
pd.PrintPage += (sender, args) => 
{ 
    Image i = Image.FromFile(@"C:\...\...\image.jpg"); 
    Rectangle m = args.MarginBounds; 

    if ((double)i.Width/(double)i.Height > (double)m.Width/(double)m.Height) // image is wider 
    { 
     m.Height = (int)((double)i.Height/(double)i.Width * (double)m.Width); 
    } 
    else 
    { 
     m.Width = (int)((double)i.Width/(double)i.Height * (double)m.Height); 
    } 
    args.Graphics.DrawImage(i, m); 
}; 
pd.Print(); 
+1

很好的答案,但我用args.PageBounds – 2017-12-31 10:33:29

2

你可以使用我的代码在这里

//Print Button Event Handeler 
private void btnPrint_Click(object sender, EventArgs e) 
{ 
    PrintDocument pd = new PrintDocument(); 
    pd.PrintPage += PrintPage; 
    //here to select the printer attached to user PC 
    PrintDialog printDialog1 = new PrintDialog(); 
    printDialog1.Document = pd; 
    DialogResult result = printDialog1.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
     pd.Print();//this will trigger the Print Event handeler PrintPage 
    } 
} 

//The Print Event handeler 
private void PrintPage(object o, PrintPageEventArgs e) 
{ 
    try 
    { 
     if (File.Exists(this.ImagePath)) 
     { 
      //Load the image from the file 
      System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:\myimage.jpg"); 

      //Adjust the size of the image to the page to print the full image without loosing any part of it 
      Rectangle m = e.MarginBounds; 

      if ((double)img.Width/(double)img.Height > (double)m.Width/(double)m.Height) // image is wider 
      { 
       m.Height = (int)((double)img.Height/(double)img.Width * (double)m.Width); 
      } 
      else 
      { 
       m.Width = (int)((double)img.Width/(double)img.Height * (double)m.Height); 
      } 
      e.Graphics.DrawImage(img, m); 
     } 
    } 
    catch (Exception) 
    { 

    } 
} 
+0

'替换args.MarginBounds''e.Graphics.DrawImage(img,m);'解决了我的问题.. +1 – 2018-01-24 12:00:35

2

答:

public void Print(string FileName) 
{ 
    StringBuilder logMessage = new StringBuilder(); 
    logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "-------------------[ START - {0} - {1} -------------------]", MethodBase.GetCurrentMethod(), DateTime.Now.ToShortDateString())); 
    logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "Parameter: 1: [Name - {0}, Value - {1}", "None]", Convert.ToString(""))); 

    try 
    { 
     if (string.IsNullOrWhiteSpace(FileName)) return; // Prevents execution of below statements if filename is not selected. 

     PrintDocument pd = new PrintDocument(); 

     //Disable the printing document pop-up dialog shown during printing. 
     PrintController printController = new StandardPrintController(); 
     pd.PrintController = printController; 

     //For testing only: Hardcoded set paper size to particular paper. 
     //pd.PrinterSettings.DefaultPageSettings.PaperSize = new PaperSize("Custom 6x4", 720, 478); 
     //pd.DefaultPageSettings.PaperSize = new PaperSize("Custom 6x4", 720, 478); 

     pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); 
     pd.PrinterSettings.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); 

     pd.PrintPage += (sndr, args) => 
     { 
      System.Drawing.Image i = System.Drawing.Image.FromFile(FileName); 

      //Adjust the size of the image to the page to print the full image without loosing any part of the image. 
      System.Drawing.Rectangle m = args.MarginBounds; 

      //Logic below maintains Aspect Ratio. 
      if ((double)i.Width/(double)i.Height > (double)m.Width/(double)m.Height) // image is wider 
      { 
       m.Height = (int)((double)i.Height/(double)i.Width * (double)m.Width); 
      } 
      else 
      { 
       m.Width = (int)((double)i.Width/(double)i.Height * (double)m.Height); 
      } 
      //Calculating optimal orientation. 
      pd.DefaultPageSettings.Landscape = m.Width > m.Height; 
      //Putting image in center of page. 
      m.Y = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Height - m.Height)/2); 
      m.X = (int)((((System.Drawing.Printing.PrintDocument)(sndr)).DefaultPageSettings.PaperSize.Width - m.Width)/2); 
      args.Graphics.DrawImage(i, m); 
     }; 
     pd.Print(); 
    } 
    catch (Exception ex) 
    { 
     log.ErrorFormat("Error : {0}\n By : {1}-{2}", ex.ToString(), this.GetType(), MethodBase.GetCurrentMethod().Name); 
    } 
    finally 
    { 
     logMessage.AppendLine(string.Format(CultureInfo.InvariantCulture, "-------------------[ END - {0} - {1} -------------------]", MethodBase.GetCurrentMethod().Name, DateTime.Now.ToShortDateString())); 
     log.Info(logMessage.ToString()); 
    } 
} 
+0

上面的代码测试自己并在我的wpf kisok应用程序中正常工作。 – KhanSahib 2015-03-09 12:50:35

3

由BBOY提供的解决方案正常工作。但在我的情况下,我不得不使用

e.Graphics.DrawImage(memoryImage, e.PageBounds); 

这将只打印表格。当我使用MarginBounds时,即使窗体小于监视器屏幕,它也会打印整个屏幕。 PageBounds解决了这个问题。感谢BBoy!

+0

完美,为我工作! (@Boy答案也不错) – iedmrc99 2017-11-05 14:01:33

4

同意TonyM和BBoy--这是原始4 * 6标签打印的正确答案。 (args.PageBounds)。这对我印刷Endicia API服务运输标签很有帮助。

private void SubmitResponseToPrinter(ILabelRequestResponse response) 
    { 
     PrintDocument pd = new PrintDocument(); 
     pd.PrintPage += (sender, args) => 
     { 
      Image i = Image.FromFile(response.Labels[0].FullPathFileName.Trim()); 
      args.Graphics.DrawImage(i, args.PageBounds); 
     }; 
     pd.Print(); 
    } 
+0

'PageBounds'在我的工作中'MarginBounds'的打印方式太小。谢谢! – Goose 2017-11-10 17:49:08

相关问题