Сообщений 0    Оценка 351        Оценить  
Система Orphus

Печать в текстовом режиме

Вариант для .Net

Автор: Иванов С.В.
ОАО "Дорогобуж"
Опубликовано: 25.03.2004
Исправлено: 13.03.2005
Версия текста: 1.0

Предисловие
Класс Dorogobuzh.PrintDirect.Printer
Конструктор
Метод Open
Метод Close
Метод Write
Метод WriteLine
Метод WriteUnescaped
Метод PageBreak
Свойство Active
Пример использования

Исходные тексты

Предисловие

Трудно совместимые понятия - .Net и матричный принтер. Тем не менее, на нашем предприятии это сочетание оказалось не только возможным, но даже не единичным – во многих наших подразделениях стоят более-менее приличные компьютеры, позволяющие использовать .Net, - и при этом матричные принтеры. Разрабатывая систему расчета заработной платы на .Net и, соответственно, рабочие места экономистов с использованием WinForms, мы пришли к пониманию необходимости обеспечить печать некоторых выходных документов (расчетные листки, ведомости и пр.) в текстовом формате. Так как «штатная» печать в .Net базируется на использовании GDI+ (как следствие, принтер используется в графическом режиме), был разработан специализированный класс, обеспечивающий текстовый режим работы принтера.

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

Класс Dorogobuzh.PrintDirect.Printer

Обеспечивает передачу данных непосредственно в спулер печати, что позволяет не только печатать в текстовом режиме, но и передавать на принтер управляющие escape-последовательности.

Технически класс является оберткой вокруг функций WinAPI, обеспечивающих доступ к спулеру печати: OpenPrinter, ClosePrinter, WritePrinter и др.

Класс реализует интерфейс IDisposable, что позволяет использовать его в конструкции using { }.

Ниже обозначены основные члены класса.

Конструктор

public Printer(string printerName) { . . . }

В качестве параметра передается имя принтера, которое должно совпадать с одним из имен зарегистрированных в системе принтеров (в русской версии Windows XP «Панель управления» - «Принтеры и факсы»).

Список доступных принтеров можно получить, например, так:

StringCollection printers = new StringCollection();
foreach(string printer in PrinterSettings.InstalledPrinters)
	printers.Add(printer);

Метод Open

«Открывает» принтер для печати. Предусмотрены два перегруженных варианта:

public void Open()

Открывает неименованное задание на печать

public void Open(string docName)

Открывает именованное задание на печать, имя документа будет отображаться в очереди печати.

Если при попытке доступа к принтеру возникнет ошибка, генерируется исключение Win32Exception с кодом ошибки ErrorCode, возвращаемой функцией WinAPI GetLastError().

Метод Close

public void Close()

«Закрывает» принтер после печати, освобождая используемые ресурсы. При использовании конструкции using вызов метода необязателен.

Метод Write

public void Write(string s)

Выводит на печать указанную строку. Если в строке встречаются специальные управляющие символы, например, табуляция, они передаются на принтер без искажения, что позволяет передавать кроме текста и escape-последовательности.

Метод WriteLine

public void WriteLine(string s)

Аналогично методу Write(), после вывода добавляется перевод строки.

Предусмотрен перегруженный вариант – WriteLine(), который просто переводит строку.

Метод WriteUnescaped

public void WriteUnescaped(string s) 

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

Пример использования:

printer.WriteUnescaped(“Фамилия\tИмя\tОтчество”);

Распечатает с табуляцией между словами

Фамилия	Имя	Отчество

Метод PageBreak

public void PageBreak()

Вставляет перевод страницы.

Свойство Active

public bool Active { get; set; }

Чтение позволяет проверить, активен принтер или нет. Установка значения свойства эквивалентна методам Open() и Close().

Пример использования

В качестве примера используется WinForm-приложение, внешний вид которого изображен на картинке:


Код обработчика нажатия на кнопку «Печать» приводится ниже:

private void printButton_Click(object sender, System.EventArgs e)
{
using (Printer p = new Printer(printers.SelectedItem.ToString()))
	{
		p.Open();
		foreach (string s in text.Lines)
			p.WriteLine(s);
	}
}

Можно и короче:

private void printButton_Click(object sender, System.EventArgs e)
{
using (Printer p = new Printer(printers.SelectedItem.ToString()))
	{
		p.Open();
		p.Write(text.Text);
	}
}

А можно и «умнее»:

private void printButton_Click(object sender, System.EventArgs e)
{
using (Printer p = new Printer(printers.SelectedItem.ToString()))
	{
		p.Open();
		p.WriteUnescaped(text.Text);
		p.PageBreak();
	}
}


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 0    Оценка 351        Оценить