2013-11-07 2 views
2

Я использую класс PrintDocument для печати на принтер Brother Brother. Когда я выполняю метод Print(), принтер начинает мигать красным светом ошибки, но все остальное возвращается успешно.Как поймать ошибку с моего принтера с помощью PrintDocument?

Я могу запустить этот же код на моем лазерном принтере, и все работает нормально.

Как я могу узнать, что вызывает ошибку на моем принтере для этикеток?

Код:

public class Test 
{ 
    private Font printFont; 
    private List<string> _documentLinesToPrint = new List<string>(); 

    public void Run() 
    { 
     _documentLinesToPrint.Add("Test1"); 
     _documentLinesToPrint.Add("Test2"); 
     printFont = new Font("Arial", 10); 
     var pd = new PrintDocument(); 
     pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25); 
     pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237); 

     var printerSettings = new System.Drawing.Printing.PrinterSettings(); 
     printerSettings.PrinterName ="Brother QL-570 LE"; 
     pd.PrinterSettings = printerSettings; 
     pd.PrinterSettings.Copies = 1; 
     pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage); 
     pd.Print(); 
    } 

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev) 
    { 
     float linesPerPage = 0; 
     float yPos = 0; 
     int count = 0; 
     float leftMargin = ev.MarginBounds.Left; 
     float topMargin = ev.MarginBounds.Top; 
     string line = null; 

     // Calculate the number of lines per page. 
     linesPerPage = ev.MarginBounds.Height/
      printFont.GetHeight(ev.Graphics); 

     // Print each line of the file. 
     while ((count < linesPerPage) && (count < _documentLinesToPrint.Count)) 
     { 
      line = _documentLinesToPrint[count]; 

      yPos = topMargin + (count * 
       printFont.GetHeight(ev.Graphics)); 
      ev.Graphics.DrawString(line, printFont, Brushes.Black, 
       leftMargin, yPos, new StringFormat()); 

      line = null; 
      count++; 
     } 

     // If more lines exist, print another page. 
     if (line != null) 
      ev.HasMorePages = true; 
     else 
      ev.HasMorePages = false; 
    } 
} 
+0

Обнаружить попытку при попытке печати? –

+1

Если это не сработает, возможно, вам придется переключиться на механизм печати более низкого уровня. И, конечно, проверьте руководство по принтеру. –

+0

Почему бы не связаться с Братом? – NoChance

ответ

1

PrintDocument - очень простой API. Вы получаете простую общую печать, но это связано со снижением функциональности, не относящейся к драйверу печати. Мой принтер HP обычно дает мне печатную ошибку, а не исключение. Не удивительно видеть что-то подобное с тобой.

Мигает, скорее всего, код, который вы можете найти. Если это не удается, вы можете попробовать сохранить формат изображения, PDF или XPS. Или используйте стороннюю библиотеку или напишите свой собственный PCL file. Там много вариантов. Создание вывода, которое вы можете просматривать, в отличие от одного в памяти, должно отлаживать вычисления, такие как поля. Вы можете посмотреть в PDF-формате и посмотреть, не выглядит ли это странным. Просто имейте в виду, что он выглядит на ПК, может отличаться от вывода, особенно при печати рядом с краями.

0

Я бы окружать ваш метод тела с помощью Try/Catch Block затем обработать исключение (ы) в пределах catch каждого метода. В качестве примера:

public class Test 
{ 
    private Font printFont; 
    private List<string> _documentLinesToPrint = new List<string>(); 

    public void Run() 
    { 
     try 
     { 
      _documentLinesToPrint.Add("Test1"); 
      _documentLinesToPrint.Add("Test2"); 
      printFont = new Font("Arial", 10); 
      var pd = new PrintDocument(); 
      pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25); 
      pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237); 

      var printerSettings = new System.Drawing.Printing.PrinterSettings(); 
      printerSettings.PrinterName = "Brother QL-570 LE"; 
      pd.PrinterSettings = printerSettings; 
      pd.PrinterSettings.Copies = 1; 
      pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage); 
      pd.Print(); 
     } 
     catch (InvalidPrinterException exc) 
     { 
      // handle your errors here. 
     } 

     catch (Exception ex) 
     { 
      // handle your errors here. 
     } 
    } 

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev) 
    { 
     try 
     { 
      float linesPerPage = 0; 
      float yPos = 0; 
      int count = 0; 
      float leftMargin = ev.MarginBounds.Left; 
      float topMargin = ev.MarginBounds.Top; 
      string line = null; 

      // Calculate the number of lines per page. 
      linesPerPage = ev.MarginBounds.Height/
       printFont.GetHeight(ev.Graphics); 

      // Print each line of the file. 
      while ((count < linesPerPage) && (count < _documentLinesToPrint.Count)) 
      { 
       line = _documentLinesToPrint[count]; 

       yPos = topMargin + (count * 
        printFont.GetHeight(ev.Graphics)); 
       ev.Graphics.DrawString(line, printFont, Brushes.Black, 
        leftMargin, yPos, new StringFormat()); 

       line = null; 
       count++; 
      } 

      // If more lines exist, print another page. 
      if (line != null) 
       ev.HasMorePages = true; 
      else 
       ev.HasMorePages = false; 
     } 
     catch (InvalidPrinterException exc) 
     { 
      // handle your errors here. 
     } 

     catch (Exception ex) 
     { 
      // handle your errors here. 
     } 
    } 
} 
3

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

Затем Windows берет элементы из очереди и отправляет их через драйвер принтера и на ваш принтер. Если в печати есть ошибка, она должна отображаться как неудачный документ в очереди печати. Я думаю, что слишком поздно ловить эту ошибку как исключение на данном этапе.

Пожалуйста, исправьте меня, если я ошибаюсь.

+0

Я считаю, что событие PrintPage является обратным вызовом, который активно срабатывает во время физического процесса печати. У меня нет моего кода на этом ПК для проверки. –

+0

Я думал, что он был запущен во время процесса буферизации *, а не во время печати. –

+0

Возможно, это так. Я подозревал уровень связи с драйвером, потому что аргумент обработчика события 'PrintPageEventArgs' предоставляет информацию о конкретном принтере, такую ​​как поля. –

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