Как отловить ошибку на моем принтере с помощью PrintDocument?
Я использую класс PrintDocument для печати на своем принтере этикеток Brother. Когда я выполняю метод Print(), принтер начинает мигать красным светом ошибки, но все остальное возвращается успешно.
Я могу запустить этот же код на моем лазерном принтере, и все работает нормально.
Как я могу увидеть причину ошибки на моем принтере этикеток?
Код:
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;
}
}
3 ответа
PrintDocument - это очень простой API. Вы получаете простую обычную печать, но это происходит за счет ограниченной функциональности, не относящейся к драйверу принтера. Мой принтер HP обычно выдает мне печатную ошибку, а не исключение. Не удивительно, что с тобой происходит нечто подобное.
Мигание - это, вероятно, код, который вы можете найти. Если это не удастся, вы можете попробовать сохранить в формате изображения, PDF или XPS. Или используйте стороннюю библиотеку или напишите свой собственный файл PCL. Там тонна вариантов. Создание вывода, которое вы можете просматривать, а не выводимое в памяти, должно отлаживать вычисления, такие как поля. Вы можете посмотреть PDF-файл и посмотреть, выглядит ли он странно. Просто имейте в виду, что то, как он выглядит на ПК, может немного отличаться от выходного, особенно при печати вблизи краев.
Я могу быть совершенно неправ в этом, но, насколько я понимаю, когда вы печатаете с этим кодом, это не имеет ничего общего с самим принтером, но с операционной системой. Windows устанавливает очередь печати, помещает в нее выходные данные, и ваш код возвращается.
Затем Windows извлекает элементы из очереди и отправляет их через драйвер принтера и на ваш принтер. Если при печати произошла ошибка, она должна появиться как сбойный документ в очереди на печать. Я думаю, что уже слишком поздно, чтобы перехватить ошибку как исключение на данном этапе.
Пожалуйста, поправьте меня, если я ошибаюсь.
Я бы окружил ваши тела методов с помощью блока Try/Catch, а затем обработал исключение (я) внутри 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.
}
}
}