Настройка и управление печатью

121

До сих пор все внимание было сосредоточено на двух методах класса PrintDialog: PrintVisual() и PrintDocument(). Это все, что необходимо для получения удовлетворительного вывода на печать, но если нужно управлять настройками принтера и заданиями печати, понадобится еще кое-что. Начальной точкой будет класс PrintDialog().

Поддержка настроек печати

В примерах из предыдущих статей было показано, каким образом класс PrintDialog позволяет использовать принтер и его настройки. Однако если эти примеры будут использоваться для более чем одного вывода на печать, то станет заметной некоторая аномалия. При каждом возврате в диалоговое окно Print восстанавливаются настройки печати по умолчанию. Снова приходится выбирать принтер и полностью настраивать его.

Имеется возможность сохранить эту информацию и повторно использовать ее. Один хороший подход состоит в сохранении PrintDialog как переменной-члена окна. Таким образом, создавать PrintDialog перед каждой новой операцией печати не понадобится — просто будет использоваться существующий объект. Это работает потому, что PrintDialog инкапсулирует выбор принтера и установки принтера через два свойства: PrintQueue и PrintTicket.

Свойство PrintQueue ссылается на объект System.Printing.PrintQueue, который представляет очередь печати для выбранного принтера. PrintQueue также инкапсулирует значительный объем средств для управления принтером и его заданиями.

Свойство PrintTicket ссылается на объект System.Printing.PrintTicket, который определяет настройки для задания печати. Он включает такие детали, как разрешение печати и двусторонняя печать. При желании настройки PrintTicket можно скорректировать программно. Класс PrintTicket даже включает в себя методы GetCmlStream() и SaveTo(), позволяющие сериализовать объект в поток, и конструктор, который позволяет пересоздать объект PrintTicket в потоке. Это интересная опция, когда требуется сохранить определенные настройки принтера между сеансами приложения. (Например, эта возможность пригодилась бы для создания средства "профилей печати".)

До тех пор, пока свойства PrintQueue и PrintTicket остаются согласованными, выбранный принтер и его свойства будут одинаковыми при каждом открытии диалогового окна Print. Поэтому, если нужно многократно создавать диалог PrintDialog, можно просто устанавливать эти свойства, чтобы сохранять пользовательские настройки.

Печать диапазонов страниц

Одно из средств класса PrintDialog пока еще не рассматривалось. Можно позволить пользователю выбирать для печати только подмножество печатного вывода, используя текстовое поле Pages (Страницы) в области Page Range (Диапазон страниц).

Текстовое поле позволяет пользователю указывать группу страниц, вводя начальную и конечную страницы (например, 4-6), или выбрать определенную страницу (например, 4). Оно не позволяет вводить несколько диапазонов страниц (наподобие 1-3,5). Текстовое поле Pages по умолчанию отключено. Чтобы включить его, перед вызовом ShowDialog() нужно установить свойство PrintDialog.UserPageRangeEnabled в true.

Опции Selection (Выделенный фрагмент) и Current Page (Текущая страница) останутся отключенными, потому что они не поддерживаются классом PrintDialog. Установкой свойств MaxPage и MinPage ограничиваются страницы, которые пользователь может выбирать.

После отображения диалогового окна Print можно определить, имеет ли пользователь возможность вводить диапазон страниц, проверив свойство PageRangeSelection. Если в нем указано значение UserPages, значит, диапазон страниц присутствует. Свойство PageRange представляет начальную страницу (PageRange.PageFrom) и конечную страницу (PageRange.PageTo). Код может принимать во внимание эти значения и печатать только запрошенные страницы.

Управление очередью печати

Обычно клиентское приложение обладает ограниченными возможностями взаимодействия с очередью печати. После того, как задание запущено, может понадобиться отобразить его состояние или (редко) предоставить возможность для приостановки, возобновления или отмены задания. Классы печати WPF идут много дальше этого уровня и позволяют строить инструменты, которые могут управлять локальной или удаленной очередями печати.

Классы в пространстве имен System.Printing предлагают поддержку для управления очередью печати. Для выполнения большей части работы служат несколько ключевых классов, которые перечислены в таблице:

Классы управления печатью
Наименование Описание
PrintServer и LocalPrintServer Представляют компьютер, который предоставляет принтеры или другое устройство. ("Другим устройством" может быть принтер с сетевым оборудованием, который служит сервером печати.)
Используя класс PrintServer, можно получать коллекцию объектов PrintQueue для заданного компьютера. Можно также использовать класс LocalPrintServer, унаследованный от PrintServer, который всегда представляет текущий компьютер. Он добавляет свойство DefaultPrintQueue, с помощью которого можно получить (или установить) принтер по умолчанию, и статический метод GetDefaultPrintQueue(), который можно использовать без создания экземпляра LocalPrintServer.
PrintQueue Представляет конфигурированный принтер на сервере печати. Класс PrintQueue позволяет получить информацию о состоянии принтера и управлять его очередью печати. Можно также получить коллекцию объектов PrintQueueJoblnfo для этого принтера.
PrintSystemJobInfo Представляет задание, которое было отправлено в очередь принтера. Можно получить информацию о его состоянии или удалить его.

Используя эти базовые ингредиенты, можно создать программу, которая инициирует вывод на печать без какого-либо вмешательства пользователя:

PrintDialog dialog = new PrintDialog(); 
            
// Выбрать принтер по умолчанию
dialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
            
// Напечатать что-либо
dialog.PrintDocument(someDocument, "Автоматическая печать");

Можно также создать и применить объект PrintTicket к PrintDialog, чтобы сконфигурировать другие настройки печати.

Пройди тесты
Лучший чат для C# программистов