2012-04-02 1 views
24

В C# я пытаюсь распечатать изображение с помощью класса PrintDocument с помощью приведенного ниже кода. Изображение имеет размер 1200 пикселей и высоту 1800 пикселей. Я пытаюсь напечатать это изображение на бумаге 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(); 

Когда я распечатать одно изображение с помощью окна Print (правая кнопка мыши и выберите печать, он автоматически масштабирование размера бумаги и правильно печать. Это означает, что все произошло в 4 * 6 бумаге.) Как я сделать то же самое в моей программе на C#?

+3

Если вам понравился ответ, примите это. Он дает кредит тому человеку, который ответил вам, и помогает другим людям, которые ищут ответ, чтобы найти правильный быстрее. –

ответ

31

Параметры, которые вы передаете методу DrawImage, должны быть размером, который требуется для изображения на бумаге, а не размером с самим изображением, тогда команда DrawImage позаботится о масштабировании. Вероятно, самый простой способ - использовать следующее переопределение команды DrawImage.

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

Примечание: это будет искажать изображение, если пропорции изображения не совпадают с прямоугольником. Некоторые простые математические данные по размеру изображения и размера бумаги позволят вам создать новый прямоугольник, который будет помещаться в рамки бумаги без искажения изображения.

+2

Это должен быть ответ! Спасибо за решение, он работает так, как ожидалось. – Crushermike

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.MarginBounds на args.PageBounds –

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

'e.Graphics.DrawImage (img, m);' решена моя проблема .. +1 –

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

3

Решение, предлагаемое BBOY работает отлично. Но в моем случае мне пришлось использовать

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

Это напечатает только форму. Когда я использую MarginBounds, он печатает весь экран, даже если форма меньше экрана монитора. PageBounds решила эту проблему. Благодаря BBoy!

+0

отлично, это сработало для меня! (@BBoy ответ тоже хорош) – iedmrc99

4

Согласитесь с TonyM и BBoy - это правильный ответ на оригинальную печать на этикетке 4 * 6. (args.PageBounds). Это работало для меня для печати ярлыков доставки API 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

Смежные вопросы