Информационно-справочный портал MorePC.ru

Теоретические основы печати в системе Windows (2007-06-25)

Чтобы понять роль принт-серверов в процессе «овеществления байтов», классифицировать продукты этой области и обрисовать возможные проблемы, необходимо изучить процесс печати в наиболее популярной операционной системе, под которую заточены многие модели принтеров — Microsoft Windows. Принципиальная схема взаимодействия компонентов представлена на рис. 1.

Рис. 1. Технология печати в ОС Windows

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

Получив от приложения последовательность графических команд, подсистема GDI (Graphics Device Interface, «программный интерфейс для работы с графическими устройствами») пропускает их через драйвер, чтобы получить другую последовательность команд — уже специфичных для выбранного принтера. Чаще всего, на этом этапе драйвер выдаёт полностью готовый для печати поток данных, но в общем случае достаточно получить промежуточный метафайл — тогда, если принтер требует растрирования на компьютере, это растрирование может быть выполнено не на компьютере клиента, а на том, к которому подключён принтер, то есть на сервере печати.

GDI: небольшое лирическое отступление

Разумеется, транслировать команды рисования в поток данных для печати можно не только через GDI. Например, при печати на PostScript-принтер система GDI не используется, приложение самостоятельно формирует код на языке PostScript согласно файлу описания возможностей конкретного принтера (PPD, PostScript Printer Description). Cистема GDI, равно как и QuickDraw в Mac OS, для вывода в PostScript не очень подходят, поскольку позволяют указывать цвет только как RGB, исключая прямой контроль CMYK-красок, что для полиграфических задач обычно неприемлемо. Однако для PS-принтеров существуют и GDI-драйверы, чтобы можно было печатать из обычных приложений, работающих только с GDI-объектами. Аналогично и с другими «профессиональными» языками печати, такими как Prescribe. А вот более «народный» язык PCL, как правило, реализуется только в виде GDI-драйвера. Так что, формально, все принтеры, доступные через систему печати Windows — это GDI-принтеры, независимо от того, какой язык разметки для них считается родным.

Но обычно под «GDI-принтером» или «Windows-принтером» понимают host-based печать, когда принтер являет собой упрощённый аппарат, не обладающий собственными способностями по разметке страниц, цветоделению и растрированию, и требует готовые данные с компьютера: «здесь поставь точку, а здесь не надо». Бывают и гибридные устройства, как PCL3GUI, где макетирование осуществляется на компьютере, а растрирование выполняет уже сам принтер. Грубо говоря, провести черту между host-based принтерами и всеми остальными GDI-принтерами, можно по признаку, умеет ли данное устройство принимать шрифты в векторной форме или требует растр. Необходимо понимать, что host-based принтеры не хуже и не лучше остальных — просто у них такой упрощённый язык разметки.

В последнее время, примерно с 2003 г., получил большое распространение в бюджетном ценовом диапазоне ещё один класс устройств, условно называемых Win-принтерами. Этот обиходный термин восходит к «Win-модемам», которые занимаются только модуляцией сигнала, оставляя все прочие задачи на долю центрального процессора, то есть почти целиком реализуются в программных драйверах; а драйверы такие, как правило, выпускаются только под Windows (но бывают и для Mac OS, и для Linux). Точно как Win-модемы, то есть преимущественно программно, функционируют и Win-принтеры. И мало того, что они живут на всём готовом, принимая от компьютера законченный растр страницы, так они даже на это не способны, пока не скачают с компьютера полную версию управляющей программы, потому что в постоянной памяти хранят лишь базовый загрузчик. Соответственно, если подключить такой принтер не к компьютеру, а к обычному принт-серверу, который знать не знает, что принтеру сначала необходим сеанс «гипноза», получится просто груда беспомощного металлолома. Эта стратегия очень выгодна производителям, потому что они экономят не только на микросхемах, но и на разработке микропрограмм, на скорую руку создавая что получится, а потом безболезненно выпуская обновление как обычную заплатку для драйвера, таким образом исключая доверие пользователю довольно опасной процедуры перепрошивки ПЗУ. Нельзя отрицать положительные моменты подобного подхода, однако стремление большинства производителей завуалировать данное обстоятельство трудно счесть невинной недомолвкой.

Для полноты картины следует ещё упомянуть о существовании печатающих устройств, которые полностью контролируются с компьютера в реальном времени. Например, сюда относятся лазерные принтеры, объём памяти которых достаточен для размещения лишь части изображения страницы — ровно на один оборот фотовала. Соответственно, компьютер должен непрерывно отслеживать состояние принтера, чтобы вовремя отправить очередную порцию данных — ведь лазерный механизм печати, в отличие от струйного, не может остановиться и сделать паузу, пока не поступят следующие данные. Теоретически, сама по себе необходимость двухстороннего обмена данными не является помехой для работы в сети, особенно если использовать примитивные протоколы передачи, без высокоуровневых абстракций типа очередей печати. Практически же успех подобного мероприятия вызывает большие сомнения. К счастью, таких динозавров можно считать вымершим видом — теперь их нишу заняли Win-принтеры.

Далее задание попадает в очередь печати, соответствующую выбранному принтеру. Диспетчер очередей (спулер) сохраняет временную копию задания на диск, чтобы освободить оперативную память и уменьшить зависимость от сбоев. Трансформированное слово spool в русском языке пишется как «шпулька»: спулер и в самом деле напоминает эту катушку в швейной машине — сначала наматываем на него нитку (сохраняем задание), а потом она разматывается при шитье (данные уходят на печать).

В зависимости от того, подключён принтер к локальному порту или является сетевым, задание поступает либо к провайдеру местной печати, либо отправляется на сервер сетевой печати, у которого своя система очередей, свой провайдер печати и т. д. Здесь надо сделать важную оговорку относительно того, что такое сервер печати на самом деле. Настоящий сервер печати — это компьютер, к которому подключены принтеры и который обеспечивает общий доступ по сети к этим принтерам: позволяет печатать на них, загружать их драйверы для различных операционных систем, администрировать их. У сервера печати свои вычислительные ресурсы, своя память для хранения заданий. Стандартной для Windows является система сетевой печати на базе универсального протокола SMB (Server Message Block, «блочный обмен информацией»), используемого также для общего доступа к файлам; подробнее об этом и других протоколах см. «Протоколы сетевой печати». Управлять общим доступом к принтеру можно на вкладке Доступ в его свойствах.

Провайдер местной печати преобразует задание на промежуточном языке (метафайл) в понятный принтеру код с помощью подходящего обработчика (процессора) печати. Если нужный код уже был получен на этапе работы GDI и драйвера, преобразование тут не требуется, и задание проходит данную стадию нетронутым (raw). А вообще, это как раз та точка маршрута, где происходит растрирование страниц для т. н. «GDI-принтеров»: если принтер подключён к серверу, то и растрирование выполняется на сервере, избавляя компьютер клиента от лишних нагрузок. Используемый обработчик печати можно определить, нажав соответствующую кнопку на вкладке Дополнительно в свойствах принтера. Windows оснащена стандартным процессором WinPrint, поддерживающим основные виды промежуточных форматов. Популярными среди многих производителей оборудования являются разработки компании Zenographics: например, IMFPrint. Существуют также процессоры, позволяющие эмулировать язык профессиональной печати PostScript на принтерах, не реализующих его аппаратно.

Готовое задание на родном языке принтера можно уже и печатать. Для отправки задания на принтер используются мониторы печати. Термин «монитор печати» не имеет ничего общего с мониторами состояния — фирменными утилитами некоторых производителей, отображающими на экране ход работы. Монитор печати — это своеобразный драйвер протокола печати, который позволяет отправить задание на принтер по тому или иному интерфейсу (но не драйвер этого интерфейса). Мониторы печати подразделяются на языковые мониторы и мониторы портов. Языковые мониторы осуществляют двусторонний диалог с принтером, применяя, например, подмножество команд языка PJL, отвечающее за получение информации о текущем состоянии устройства: готовность, замятие бумаги, уровень чернил и т. п. Вместо PJL, который реализован в стандартной библиотеке функций, могут применяться и другие языки. Мониторы портов просто регулируют передачу информации через порт принтера, посылая порции данных по сигналу готовности к их приёму. Назначение портов осуществляется на одноимённой вкладке в свойствах принтера. Если имеется несколько одинаковых печатающих устройств, их можно объединить в группу (пул, от англ. pool — «объединение»), которая будет действовать как единый объект, распределяя задания между принтерами. Принтеры одной группы должны находиться в одном помещении, потому что заранее нельзя предсказать, какому именно достанется ваш документ.

Как и сами принтеры, порты тоже бывают местными (локальными) и сетевыми (точнее, удалёнными — remote). К местным портам относятся только параллельный LPT и последовательный COM, которые обслуживаются стандартным монитором локальных портов. Сетевые порты представляют собой обёртки для специализированных протоколов сетевой печати, таких как LPD. Собственно, вот здесь и вступают в действие те устройства, которые сейчас стало принятым называть серверами печати (print-server appliance), но они суть обыкновенные сетевые адаптеры принтеров. Некоторые из них более функциональны, другие иначе как конвертерами «USB-Ethernet» назвать трудно. Они тоже являются компьютерами в миниатюре и позволяют печатать по сети — просто реализуют не все функции настоящего сервера печати. Более того, при наличии должных знаний, можно самостоятельно сконструировать такой принт-сервер из старого компьютера и операционной системы типа Linux.

Начинающим пользователям может показаться странным, что принтер, подключённый к сетевому порту, всё равно считается локальным, в то время как принтер, подключённый к локальному порту другого компьютера, считается сетевым. Ещё более странным может выглядеть то, что интерфейс USB не входит в категорию локальных портов — он считается удалённым (remote port), и каждый разработчик применяет собственные методы взаимодействия, усложняя или вовсе пресекая на корню попытки подключения к принт-серверам даже собственной марки.

Помимо отправки готового задания на принтер, его можно сохранить в файл. Такой файл потом распечатывается без повторной обработки, и главное, для этого не требуется наличие на компьютере ни приложения, создавшего файл, ни использованных шрифтов, ни самого исходного документа. Перенаправление в файл выполняется либо при установке соответствующей галочки в диалоге печати, либо после назначения принтеру специального порта FILE. Другим видом перенаправления является создание виртуального порта, монитор которого прогоняет все получаемые данные через назначенную программу и записывает результат её работы в другой порт — более логично использовать для этих нужд специализированный обработчик печати, но зато таким образом, например, удаётся приспособить перенаправитель портов RedMon и интерпретатор GhostScript для эмуляции языка PostScript, не затратив ни копейки на это бесплатно распространяемое ПО.

Выбор модели взаимодействия

Как уже говорилось, используя вместо настоящего компьютерного сервера печати компактное устройство без жёсткого диска и с небольшим объёмом памяти, нельзя рассчитывать на буферизацию больших заданий или растрирование на стороне сервера. Если нужны такие функции, следует отказаться от однорангового режима (peer-to-peer, p2p), при котором клиенты напрямую обращаются к принт-серверу, считая его сетевым портом для своего локального принтера (рис. 2а).

Рис. 2. Одноранговое взаимодействие и архитектура «клиент-сервер»

Необходимо перейти к модели клиент-сервер, где принтер с точки зрения рабочих станций является удалённым, и лишь для самого сервера — локальным (рис. 2б). Здесь выделенный компьютер выступает в роли сервера печати для клиентов и является единственным, кто напрямую обращается к внешнему серверу печати соответствующего принтера. При этом тот сервер печати выступает в роли простого сетевого адаптера, позволяющего вместо интерфейсов USB или LPT передавать информацию по локальной сети со всей её развитой инфраструктурой. Поэтому от такого сетевого адаптера не требуется каких-то особых «наворотов» — лишь бы был совместимым с компьютерным сервером, потому что уровень обслуживания конечных клиентов зависит уже от компьютерного сервера.

Родовое проклятье Win-принтеров

Так всё-таки, из-за чего многие бюджетные модели принтеров, выпускаемых сейчас на рынок, не работают с традиционными принт-серверами? Ведь они прекрасно функционируют при непосредственном подключении к вашему компьютеру или при подключении к другому компьютеру и разделению как общий ресурс. Проблема именно в том, что принт-сервер не загружает в принтер нужную ему управляющую программу. Чтобы научить некоторые принт-серверы выполнять подобные трюки, есть определённые способы, однако они не для рядового пользователя.

Но почему же зависает драйвер при попытке печати на такой принтер, если тот подключен через принт-сервер? И почему он не зависает при печати на этот же принтер, если его подключать к другому компьютеру? А потому что драйвер не совсем глупый: он пытается загрузить прошивку только в локальный принтер. То есть когда идёт печать на локальный принтер, в том числе сидящий на удалённом (сетевом) порту, драйверу необходимо сначала загрузить в принтер прошивку, прежде чем тот сможет принимать данные для печати. Когда же принтер сетевой, драйвер на вашем компьютере оставляет эту задачу драйверу на компьютере-сервере, для которого тот принтер является локальным.

Самсонов А.

По вопросам совместимости принт-серверов с т. н. Windows-принтерами см. статью «Серверы печати — „чёртик из коробки”».