Языки управления печатью

В списке технических характеристик печатающего устройства производители всегда приводят такой параметр, как язык управления принтером. Среди языков могут быть перечислены PCL, PostScript, XPS, PDF, GDI или что-то ещё, являющееся фирменным наименованием того или иного производителя (например CAPT, HYPER-C или PRESCRIBE). Что означают эти наименования и какую практическую пользу можно получить от наличия в печатающем устройстве поддержки того или иного языка управления печатью. Давайте попробуем разобраться.
Что такое язык управления печатью
Чтобы создать на бумаге документ принтер должен получить от компьютера набор команд, которые описывали бы страницу документа тем или иным способом, а принтер, выполняя эти команды, точку за точкой, строчку за строчкой создал бы на бумаге изображение, которое и предполагалось напечатать. Этот процесс называется растеризацией и его суть заключается в создание массива точек, которые будут нанесены на бумагу для создания на ней отпечатка.
На заре печати на бумагу выводился просто текст. Для управления такой печатью были созданы простые системы команд, в первую очередь реализованные на матричных принтерах. ESC/P и ESC/P2 стали первыми стандартами для управления выводом данных на бумагу. Они уже позволили не только выводить символы текста, но добавлять к ним такие атрибуты, как жирность или наклон.
С появлением графических операционных систем в середине 80х годов прошлого века появилась необходимость более полного контроля за формированием печатаемого документа в результате чего сформировалось такое понятие, как языки описания страниц (PDL от Page Description Language). К тому же времени, благодаря усилиям Adobe и Apple, сформировался довольно продвинутый язык описания страниц Adobe PostScript, ставший стандартом «де-факто» в полиграфической отрасли. Его последняя, 3я версия, вышедшая ещё в 1998 году, на сегодня известна как AdobePostScript3 считается стандартом в области профессиональной цветной печати. Популярный на сегодня формат PDF (Portable Document Format – портативный формат документов) в значительной степени основывается как раз на 3й версии языка PostScript.
Параллельно с языком PostScript развивался другой язык описания страниц – PCL (от Printer Command Language – язык команд для принтера). Его автором стала компания Hewlett-Packard, а первая версия этого языка появилась в 1984 году и стала языком для управления струйными принтерами этой компании. По сути, язык PCL стал, в определённом смысле, продолжателем системы команд матричных принтеров, привнеся в эту систему улучшения в плане поддержки разрешающей способности и средств для создания страниц целиком (у матричных принтеров таких средств не было и нет). Впоследствии развитием языка занимался консорциум PCL, в который вошли практически все производители печатающих устройств, благодаря чему этот язык стал наиболее распространённым и при этом не подлежащим лицензированию. Актуальная на сегодня версия языка PCL является PCL 6, известная также как PCL XL.
Отдельной категорией, с точки зрения управления печатью, необходимо считать устройства, работающие в режиме GDI (от Graphical Device Interface – интерфейс графического устройства). Строго говоря, GDI не является языком разметки страниц, а, скорее, является протоколом, согласно которому на устройство передаются обработанные и готовые для печати данные. GDI устройства появились в результате борьбы за снижение стоимости печатающих устройств, когда в «жертву» был принесён дорогостоящий центральный процессор устройства и объём оперативной памяти, достаточный для сохранений в ней всего массива точек, необходимых для формирования документа. Процессом растеризации данных для таких устройств занимается компьютер, с которым эти устройства работают. А они сами только «транслируют» получаемые от компьютера точки прямо на бумагу через несложный и недорогой контроллер. Среди устройств, работающих в таком режиме, нет ни каких общих соглашений, и каждый производитель реализует этот протокол по-своему.
Ещё одним языком разметки страниц, который следует упомянуть, является сравнительно молодой формат XPS (от XML Paper Specification – спецификация XML бумаги). Формат разработан компанией Microsoft в 2006 году и активно поддерживается в операционных системах этого разработчика. Многие производители печатающих устройств поддержали этот стандарт, который изначально задуман как упрощённый, компактный (данные передаются в сжатом виде), свободный от лицензий и базирующийся на открытой разметке XML формат для представления обычных офисных документов. Актуальная версия этого языка – 1.4.
Особенности, преимущества и недостатки языков управления печатью
PostScript. Человеко-читаемый язык, с самого начала ориентированный на цветную профессиональную печать. Поддержка этого языка в печатающем устройстве означает возможность использования входных графических данных как в формате RGB, так и в формате CMYK. Сам язык представляет из себя полноценный объектно-ориентированный язык программирования, содержащий команды, циклы, условия и позволяющий формировать растровое изображение максимального качества. Устройства с поддержкой PostScript гарантировано смогут работать под управлением Linux и MacOS, так как подсистема печати этих операционных систем опирается как раз на PostScript. Для полноценной работы устройства в систему необходимо записать PPD-файл (PostScript Printer Description – описание PostScript принтера) с указанием свойств конкретного печатающего устройства. PostScript позволяет реализовывать систему сквозного согласования цветов при помощи подключения профилей эмуляции и профилей вывода. Обработка данных в формате PostSсript достаточно сильно нагружает процессор принтера, в связи с чем его производительность становится очень значимым параметром. К объёму оперативной памяти, также, применяются повышенные требования. Существует как оригинальная реализация поддержки PostScript, т.е. «родной» Adobe PostScript3, так и «эмуляция» (т.е. подражание) поддержки PostScript3, реализованная самим производителем печатающего устройства. По потребительским свойствам между этими двумя вариантами реализации поддержки PostScript3 существенной разницы нет. Она может возникнуть лишь при использовании профилирования, где предпочтение будет отдаваться оригинальному PostScript3 от Adobe. Печатающие устройства с поддержкой PostScript обычно несколько дороже своих собратьев, не поддерживающих этот язык управления печатью. Использование языка PostScript рекомендовано для работы с графическими приложениями и для вывода высококачественной графики с возможностью точного управления цветом.
PCL. Этот язык представляет из себя набор управляющих двоичных символов и не может быть прочитан человеком. Команды языка компактны, и их обработка требует меньших ресурсов от принтера. Графические данные передаются в запакованном виде, что уменьшает размер передаваемых данных и меньше нагружает интерфейс или локальную сеть. Изначально ориентированный на офисную печать, язык PCL не предполагает поддержки графических данных в цветах CMYK и оперирует только цветами RGB, при этом если изначально данные представлены в формате CMYK, то преобразование их в RGB осуществляется средствами драйвера, что может вызывать проблемы с согласованием цветов изображений. Технически для печатающих устройств на уровне драйвера может быть реализовано согласование цветов при помощи профилей вывода, но сквозная калибровка не поддерживается из-за отсутствия возможности использования профилей эмуляции. Последняя реализация языка PCL – PCL XL – хорошо известна среди пользователей в первую очередь тем, что вместо ожидаемого документа на отпечатке порой появляется сообщение PCL XL Error с дальнейшей расшифровкой проблемы. Классическим решением этой проблемы является использование более старой версии языка, PCL5e для монохромных устройств или PCL 5c для цветных. Благо, что PCL XL обратно совместим со своими предшествующими версиями. Использование PCL можно рекомендовать для обычной печати офисных документов и графических изображений, не требующих точного согласования цветов между различными устройствами. В значительной степени всё, что сказано выше про PCL относится и к XPS: компактность, нетребовательность к ресурсам принтера, отсутствие возможности работы с CMYK. Разве что об упомянутых в связи с PCL XL проблемах по отношению к XPS слышать не доводилось. Как не доводилось встречать и реализаций драйвера XPS с поддержкой профилей вывода. А вот по уровню распространённости XPS значительно проигрывает «старому доброму» PCL: поддерживается он далеко не во всех устройствах и каких-то зримых преимуществ или отличий от традиционного PCL не предоставляет.
GDI. В первую очередь здесь определяющим будет являться цена: GDI-устройства это самые доступные по цене модели. У них мало памяти, у них очень слабый процессор, их производительность в первую очередь зависит от производительности компьютера, с которого производится печать. Данные обрабатываются в компьютере и передаются через интерфейс, причём объём этих данных довольно большой, особенно если речь идёт о цветном печатающем устройстве. Это всё накладывает повышенные требования на качество USB-кабеля, а в случае использования сетевого подключения заметно нагружает локальную сеть организации. Так же, как и в случае с PCL и XPS устройства, работающие в режиме GDI, не поддерживают изображения в формате CMYK и не имеют средств сквозной калибровки цвета. Сфера применения устройств с поддержкой GDI – офисная печать чёрно-белых и цветных документов.
В качестве заключения
Интересно, что в стандартном Каталоге Товаров Работ и Услуг (КТРУ), который используется в системе Госзакупок, ни для принтеров, ни для МФУ не предусмотрен параметр, указывающий на поддержку той или иной системы команд. А ведь как мы могли убедиться чуть выше, практическая ценность от поддержки устройством определённых языков очень даже есть и потребители принтеров и МФУ в государственных учреждениях могли бы использовать преимущества различных языков управления печатью в своей работе, но такую возможность на сегодня КТРУ им не предлагает.
Медиация Linux и GDI-принтера
Один из путей решения – написать свой драйвер принтера. Подобные попытки для некоторых принтеров Canon, Lexmark, Samsung были реализованы в проектах [5-8]. Наиболее информативной и полезной статьёй по созданию собственного драйвера мне показалась статья [7]. Но как быть тем, кто не силён в программировании и его принтер не вошёл в «список счастливчиков» выше? Для них остаётся два пути: первый – проверить, возможно ли купить опциональный PCL или Postcript-аппаратный модуль у производителя принтера, т.е. сделать принтер совместимым. К сожалению, большая часть GDI-принтеров не имеет такой функции и принтер, рассматриваемый в статье (Sharp AR153), также не имеет. Поэтому мне и всем остальным, «невезучим» читателям придётся воспользоваться вторым путём – медиацией.
Как подружить GDI-принтер и Linux? Подобных решений много, например [9]. Важнее разобраться в том, что мы понимаем под словом «подружить». Вышеописанная статья не показалась мне интересной, так как не решает поставленной задачи. Подключить принтер к порту компьютера, получать данные по сети и отправлять их на порт принтера не предоставляется сложным.
Поэтому в качестве основы для медиации было выбрано решение, описанное в [2], где решается именно проблема печати из-под Linux. ОС Linux выступает в роли клиента, а медиатором оказались две программы: – Redirection Port Monitor [3] и Ghostscript [4], запускаемые на Windows.
Печать происходит по следующей схеме: компьютер под управлением ОС Linux отправляет документ в формате PostScript по сети на печать компьютеру с Windows. Программа RedMon перехватывает сообщение и отправляет его на вход программы Ghostscript, которая, используя штатный драйвер принтера под Windows, печатает сообщение от своего имени.
Конечно, ситуация не позволяет при наличии GDI-принтеров полностью мигрировать офисам на Linux, отказавшись от коммерческих лицензий, зато предложенное решение позволяет сократить число Windows-машин до одной и тем самым значительно сэкономить средства. Вполне возможно, что вышеописанные программы кому-то в будущем удастся запустить под эмулятором wine, если последний будет более полно реализовывать эмуляцию библиотек Windows и поддержку драйверов, тогда от использования Windows можно будет отказаться вовсе.
Настройка программ на стороне Windows
Для удобства разобьём процесс на две части: установку и настройку.
C адреса [3] переходим в раздел «Download» и скачиваем архив redmon17.zip, распаковываем и запускаем файл setup.exe. Программа установки RedMon «спрашивает», действительно ли мы хотим установить программу. Отвечаем ей: «Да». Установка проходит быстро, после чего выводится окно завершения процедуры установки.
С адреса [4] переходим в раздел «Windows» и скачиваем архив gs862w32.exe (в нашем случае использовалась 32-битная версия) и запускаем его. Скачанный файл – это самораспаковывающийся архив. Нажимаем кнопку «Setup», после чего на экране появляется небольшое окно, где бежит индикатор прогресса распаковки.
По завершению процесса распаковки появляется диалоговое окно с уточнениями, куда ставить программу и где создавать ярлыки (cм. рис. 1).
Рисунок 1. Диалоговое окно установки GPL Ghostscript
Оставляем указанные значения без изменений (т.е. программа будет установлена в директорию «C:\Program Files\gs») и нажимаем кнопку «Install». Появляется окно, отображающее log-файл процесса установки, после чего установка GPL Ghostscript завершена.
Программы установлены, теперь необходимо их настроить. Создаём текстовый файл winprinter.rsp с помощью блокнота или + в Far. Сохраняя имя «winprinter.rsp» в блокноте, возьмите его в кавычки, иначе у вас получится «winprinter.rsp.txt».
-sOutputFile=»\\spool\SHARP AR-153E N»
Если у вас версия Ghostscript 8.62, и путь установки вы не меняли, то первую строчку править не нужно. В последней строчке «SHARP AR-153E N» – имя вашего GDI-принтера, скопированное из его свойств. Учтите, лучше скопировать и вставить, т.к. важно правильное написание с учётом пробелов и регистра. Если совершить ошибку, то это выльется в то, что программа Ghostscript каждый раз при печати будет выдавать окно и спрашивать: «На какой принтер печатать?».
Добавляем новый виртуальный принтер. Для этого нажимаем: «Пуск -> Настройка -> Принтеры -> Установка принтера». У вас запустится «Мастер установки принтеров», где нажимаем кнопку «Далее». В следующем окне выбираем «Локальный принтер», галочку «Автоматическое определение . » снимаем (cм. рис. 2).
Рисунок 2. Выбор способа подключения принтера
Нажимаем «Далее», в появившемся окне выбираем «Создать новый порт», в типе порта указываем «Redirection port» (cм. рис. 3).
Рисунок 3. Выбор порта подключения принтера
Нажимаем «Далее», появляется окошко с именем порта, где оставляем без изменений «RPT1:».
После переходим к окну выбора принтера. Предлагаю установить любой PostScript-принтер, например «HP LaserJet 6P/6MP PostScript», т.к. большинство Linux-дистрибутивов умеет беспроблемно с ними работать.
Замечание: наиболее ленивые пользователи могут найти какой-нибудь PostScript-принтер на букву «А», т.к. он будет в начале списка, я же предпочитаю проверенную модель HP.
Нажимаем «Далее», и в следующем окне придумываем имя нашему виртуальному принтеру. Имя может быть любым, но удобнее взять имя настоящего принтера, дописав к нему буквы PS, означающие, что этот (пусть и виртуальный) принтер может печатать в формате PostScript. В нашем примере имя будет «SHARP153PS». «Использовать этот принтер по умолчанию. » – выбираем «Нет», т.к. «по умолчанию» пусть используется настоящий принтер, а не виртуальный.
Нажимаем «Далее», после чего открываем общий доступ к виртуальному принтеру из сети и придумываем ему имя. Удобнее всего имя оставить тем же «SHARP153PS». Нажимаем «Далее», появляется окно с полями «Размещение» и «Комментарий». Заполните эти поля на ваше усмотрение и нажмите кнопку «Далее». Появляется окно с вопросом о печати пробной страницы. Отвечаем «Нет», т.к. наш виртуальный принтер ещё не настроен. Нажимаем «Далее». Появляется окно завершения работы мастера установки принтеров.
Нажимаем «Готово». В течение нескольких секунд копируются необходимые файлы.
После чего в списке принтеров («Пуск -> Настройка -> Принтеры») появится новый принтер, но он ещё не настроен. Для настройки мы нажимаем правой кнопкой мыши на значке принтера, после чего выскакивает меню, где мы выбираем пункт «Свойства».
В появившемся окне выбираем вкладку «Порты», где находим порт «RPT1:», после чего нажимаем кнопку «Настройка порта. ».
Заполняем поля появившегося окна «RPT1: Properties». В поле «Redirect this port to the program» заносим имя программы «C:\Program Files\gs\gs8.62\bin\gswin32c.exe». Удобнее всего это сделать с помощью мыши и кнопки «Browse». Обратите внимание, что существуют два файла: gswin32c.exe и gswin32.exe. Нам нужен первый, т.к. он работает из командной строки. В поле «Arguments for this program are:» заносим имя созданного нами ранее файла «winprinter.rsp» c полным путём и необходимыми ключами:
Имя файла взято в кавычки, перед ним записана «собака», а после имени через пробел стоит дефис. Для «Output» выбираем «Copy temporary file to printer». В поле «Printer» выбираем настоящий принтер – «SHARP AR-153E N». В поле «Run» выбираем «Hidden». Shut down delay – оставляем значение 300 секунд. Ставим галочки «Print errors» и «Run as User». Заполнение завершено (cм. рис. 4).
Рисунок 4. Настройка параметров порта «RPT1:»
Нажимаем «OК», чтобы сохранить введённые нами значения.
На этом этапе настройка «виртуального» принтера на стороне Windows завершена. Чтобы убедиться в правильности настроек, открываем любой текстовый документ или какое-нибудь приложение, откуда осуществляем печать на «виртуальный» принтер. Выскакивает стандартное окно настроек печати, где мы видим, что принтер подключён к порту RPT1: и его тип HP Laser Jet 6P/6MP PostScript (cм. рис. 5).
Рисунок 5. Проверяем правильность настройки печатью на виртуальный принтер
Если всё было настроено правильно, ваш настоящий принтер зашумит и выдаст ожидаемый документ через несколько секунд, при этом на экране компьютера не должно выскакивать никаких окон. Если желаемый результат не получен – проверьте наличие бумаги, правильность подключения и работы настоящего принтера, а также все предыдущие настройки.
Настройка принтера в Linux
На предыдущем этапе мы убедились: в работоспособности нового виртуального принтера теперь осталось малое – настроить рабочие станции Linux и проверить печать с них.
Для этого нажимаем в меню «Система -> Администрирование -> Печать».
Далее, так как мы работаем в X от обычного пользователя, а настраивать принтеры привилегия администратора, дополнительным окном будет запрошен пароль root. Вводим пароль и нажимаем «OK».
В появившемся окне «Настройка принтера» нажимаем на значок «Новый принтер», после чего в следующем окне выбираем тип подключения «Windows Printer via SAMBA», а в поле адреса принтера указываем IP-адрес Windows-машины и после знака «/» сетевое имя виртуального принтера из наших прошлых настроек. В моём примере это будет «192.168.2.3/SHARP153PS». После заносим имя и пароль учетной записи, с которой мы будем подключаться к Windows-машине (cм. рис. 6).
Рисунок 6. Настройка адреса подключения для сетевого принтера в Linux
Мы не рассматривали разграничение доступа и аутентификацию пользователей принтера на компьютере Windows, т.к. это другая тема, также в тестовой сети было всего два компьютера без подключения к Интернету. Поэтому я не использовал пароли, а в качестве имени был взят «Администратор».
Далее нажимаем кнопку «Проверить». В случае работы сети мы должны увидеть окно «Проверено».
После этого нажимаем кнопку «Далее» и выбираем принтер из базы данных. Фирма – HP.
Нажимаем «Далее», выбираем модель «Laserjet 6P/MP» и единственный драйвер «foomatic-db-ppds/HP/HP_Laserjet_6MP.ppd.gz».
Нажимаем кнопку «Далее» и заполняем название принтера – как он будет виден для приложений Linux. «Описание» и «размещение» заполняете по своему усмотрению (cм. рис. 7).
Рисунок 7. Выбор названия для принтера в Linux
После чего нажимаем кнопку «Далее» и видим конечное окно установки принтера, где нажимаем «Применить».
Запускаем какое-нибудь приложение под Linux и проверяем печать. Если все настройки были выполнены правильно, то результат не заставит себя долго ждать.
Описанное решение было реализовано на операционных системах Windows 2000 и Linux Fedora 8.
Предлагаемое решение проблемы должно работать для большинства GDI-принтеров. Надеюсь, что в будущем от данного решения и использования Windows-машины в качестве посредника можно будет отказаться, т.к. либо производители принтеров начнут уважать Linux-сообщество и будут выпускать драйверы под Linux, либо эмулятор wine сможет поддержать описанное решение на Linux, либо ваш принтер окажется в списке счастливчиков, для которых энтузиасты предложат альтернативный драйвер. Все три пути имеют шансы быть реализованными, посмотрим, что случится раньше.
- Медиация – http://www.gaap.ru/biblio/management/curp/059.asp.
- Рецепт «приготовления» Win-принтера для печати из Linux – http://www.nixp.ru/articles/win_printing_in_linux.
- Red Mon – Red irect ion Port Monitor – http:// pages.cs.wisc.edu/~ghost/redmon/index.htm .
- Ghostscript, Ghostview and GSview – http://pages.cs.wisc.edu/~ghost.
- CAPT – Linux driver for GDI printers (winprinters) – http://www.opennet.ru/prog/info/2601.shtml .
- CAPT Linux driver – http://www.boichat.ch/nicolas/capt/index.html .
- GDI printers under Linux – http://members.tripod.com/rpragana/gdiprinters.html .
- Установка GDI-принтера Lexmark Z23/33 в Debian – http://www.opennet.ru/base/sys/lexmark_print_install.txt.html.
- CUPS – принт-сервер и GDI-принтер – http://www.linuxcenter.ru/lib/articles/soft/cups_gdi.phtml.
- Теоретические основы печати в системе Windows – http://www.morepc.ru/net/print/windows_printing.html.
- Сайт, посвящённый вопросам печати под Linux – http://www.linuxprinting.org.
Одноклассники
21.10.2010 — 03:54 | Алексей
У кого не устанавливается порт RPT1 в Windows 7, некий jonasoberschweiber доработал исходники, которые можно взять тут http://github.com/jonasoberschweiber/redmon
я не нашел готового бинарника, поэтому собрал сам, если кому еще нужно будет:
http://daidouji.org/files/redmon17w7.zip
Еще в других статьях рекомендуют -sOutputFile=»%printer%REALPRINTER» вместо -sOutputFile=»\\spool\REALPRINTER», объясняя это тем, что в первом случае происходит обращение к физическому принтеру напрямую, а во втором — через сетевую шару. Не уверен, что это так, но оставил себе вариант с %printer% — работает.
И еще, если при печати из сети будет вылазить окошко с выбором принтера для печати (по-видимому Run as User не работает в win7 и печать всегда стартует от уч. записи SYSTEM), добавьте в ветку
[HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Devices]
запись
«printer»=»winspool,FILE:»
где printer — имя вашего физического принтера.
http://daidouji.org/files/printer.reg
P.S. настраивал для печати по сети с линукса на Canon MF3110, подключенный к Windows 7 Home Premium (32bit)
27.10.2010 — 10:06 | Павел
Интересно наблюдать, что тема живёт.
И не только потому, что между Linux и Win7 есть развитие темы, но и то, что летом этого года, 26 июля 2010 года
Подписан закон о введении процедуры медиации при урегулировании споров
http://kremlin.ru/news/8454
А публикация была в мае 2008.
Комментарии могут оставлять только зарегистрированные пользователи
Особенности организации вывода на принтеры (языки описания страниц).
Особенности организации вывода на принтеры (языки описания страниц).
Компания Epson еще в 70-х годах прошлого века придумала язык ESC/P (Epson Standard Code for Printers), который и по сей день поддерживается некоторыми другими производителями в офисно-ориентированных устройствах вывода посредством режима эмуляции. А еще в 1981 году, IBM представила свою версию языка описания страниц под названием PPDS (Personal Printer Data Stream). Фирма HP, примерно в это же время, предложила язык описания страниц PCL (Printer Command Language), который использовался в первых ударных и струйных принтерах. В 1984 году впервые был представлен публике PostScript (PS), который базировался на свободных исходниках Xerox и был создан силами тогда только что основанной компании Adobe.
Фирма Microsoft тоже приняла участие в разработке языков описания страниц (это было ближе к концу 80-х). Разработанный ею интерфейс GDI (Graphics Device Interface) используется в Windows для вывода текстовой и графической информации на принтеры и мониторы по сей день. Разработчики Windows для упрощения проблем с драйверами создали между программным обеспечением и принтерами интерфейс, не зависящий от конкретного типа принтера (рис. 1). Идея GDI состоит в том, чтобы избавить печатающее устройство от дорогостоящего контроллера и переложить его функции на центральный процессор вместе с драйвером. Отсюда же следует первый недостаток GDI: требовательность к системным ресурсам. Этот язык подразумевает конвертацию графической информации и шрифтов в единое растровое изображение, которое затем и отправляется на печать. Поддержкой исключительно языка GDI обладают лишь самые бюджетные принтеры. В большинстве случаев производители стараются оснастить свои продукты как минимум совместимостью с PCL (не говоря уже о PS) хотя бы через эмуляцию, что, опять же, накладывает определённые требования к ресурсам системы. GDI отличает и сравнительно скудные возможности функционирования в рамках локальной сети, а добавить эту опцию можно лишь при помощи дополнительного, далеко не дешёвого сетевого контроллера. Поэтому принтеры GDI рекомендуют использовать для индивидуальных домашних нужд.
GDI является подсистемой Windows , используемой программами для рисования графических изображений на экране. GDI позволяет рисовать на экране, принтере, графопостроителе или на других устройствах отображения с помощью драйверов. Главное в работе GDI — сделать программы в меру независимыми от реальной аппаратуры. В простых операционных системах типа MSDOS , программы должны были подключать свои собственные драйверы устройств. Всякий раз с появлением нового поколения аппаратных средств программное обеспечение либо получало новые драйверы, либо устаревало. С помощью GDI набор драйверов для аппаратуры обновляет прикладные программы. Интерфейс GDI выполняет и другую важную функцию. Он определяет набор операций, которые программа может выполнять. GDI поддерживает следующие операции рисования:
— установку определенного цвета в конкретном пикселе;
— рисование линии с учетом характеристик толщины, шаблона, цвета и стиля кисти;
— рисование эллипса (окружности);
— рисование прямоугольника, прямоугольника со скругленными углами или многоугольника;
— рисование замкнутых фигур, заполненных сплошным цветом или шаблоном;
— рисование текста с указанным шрифтом, цветом и размером;
— перемещение прямоугольника по экрану, возможно, с изменением размеров;
— ограничение операций рисования или операций перемещения в определенной области, чтобы не затрагивать изображение за пределами этой области.
Поэтому команды рисования, представленные простейшими рисующими программами, например, такими как входящая в Windows программа Paintbrush , в основном отражают функции GDI . Более сложные рисующие программы, например CorelDRAW , выполняют команды, реализующие более сложные операции типа закрашивания (заливки) фонтаном и рисования сложных кривых и т. п.
Под управлением Windows прикладные программы печатают страницу, используя тот же интерфейс графических устройств ( GDI ), что и для рисования на экране монитора. GDI посылает команды драйверу принтера, который транслирует их в понятный принтеру язык и с помощью драйвера коммуникационного порта посылает принтеру. Из-за сложности взаимодействия программ и интерфейса GDI проектировщики принтеров вынуждены были усложнять конструкции принтеров. Если бы битовый образ всей страницы составлялся непосредственно центральным процессором, то процесс печати резко замедлился бы из-за пересылки принтеру очень большого объема данных для каждой страницы даже при обработке самого простого текста (особенно при печати в сети). Разработчики поступили иначе – они переложили все, что связано с обработкой растрового изображения, на процессор принтера, но для этого пришлось использовать язык для описания сложных задач, выполняемых интерфейсом GDI .
Первый этап интерпретации данных выполняет собственно программа, отправляющая задание на печать. В Windows любое приложение описывает изображение с помощью стандартного набора команд GDI (модуль Windows, интерпретирующий свои универсальные команды печати в инструкции, понятные драйверам различных устройств ввода-вывода, например, драйверу принтера). В своей работе GDI может пользоваться файлом-буфером в формате EMF или RAW — первый обеспечивает чуть большую производительность и занимает меньше места на диске, второй имеет смысл выбирать лишь при возникновении проблем с печатью (сделать это можно в «Свойствах принтера»). Далее инструкции подхватывает драйвер, алгоритм его работы напрямую зависит от используемого принтером языка описания объектов печати.

Рис. 1. «Программный» GDI-принтер.
Так называемые GDI-принтеры (рис. 1) обитают в низу принтерной иерархии, их легко узнать по чисто символическому объему памяти, как правило, без возможности наращивания. Работают они только под Windows, и всю рутину по преобразованию объектов в стройные шеренги пикселов (образ страницы) выполняет драйвер при поддержке центрального процессора. Что, впрочем, не бог весть как напрягает последний, ведь недорогие принтеры (к ним преимущественно и относятся GDI-модели) работают не быстро и в мощном входном потоке не нуждаются. Для таких принтеров нет ничего страшного в том, что часть страницы не уместится в памяти, в этом случае организуется динамическая подкачка данных во время печати (фактически собственная память принтера служит лишь сглаживающим буфером, на случай временного захвата центрального процессора ресурсоемким заданием).
Языкописаниястраниц PCL (от англ. Printer Command Language) — язык управления принтером разработанный компанией Hewlett-Packard. В первой версии это был просто набор команд для печати ASCII-символов, теперь же, в версиях PCL6 и PCL-X стало возможным печатать в цвете, а также печатать изображения, но вне Microsoft Windows и HP-UX этот язык редко используется.
Язык описания страниц PCL разработан фирмой Hewlett Packard для использования в принтерах собственного производства. В настоящее время язык PCL стал стандартом, который эмулируют многие производители.
К следующему, и самому многочисленному классу принтеров относятся модели, «обученные» языку PCL (Printer Control Language). Этот язык разработала компания Hewlett-Packard для своих струйных DeskJet и лазерных LaserJet, но он оказался очень удачным компромиссом между полностью «программными» моделями и дорогими PostScript-принтерами и был поддержан большинством производителей. В зависимости от версии PCL растеризацией может заниматься как драйвер (PCL 3), так и процессор принтера (современные версии — PCL 5 и PCL 6). PCL-принтеры обычно имеют буфер памяти объемом до 8–16 Мбайт, чего вполне хватает даже для печати сложных документов в разрешении до 1200 dpi, поскольку язык PCL весьма экономичен. Преимущество перед программной растеризацией имеется даже при печати исходно растровых изображений, поскольку в PCL предусмотрен эффективный алгоритм компрессии, ускоряющий передачу данных (рис. 2).

Рис. 2. Принтер с поддержкой языков PCL и/или PostScript.
Поток данных языка PCL, кроме текста, который необходимо напечатать, содержит множество команд, предназначенных для управления принтером:
1.Управляющие коды. Стандартные коды ASCII , которые представляют собой функцию (например, возврат каретки ( CR ) или перевод строки ( LF )), а не символы.
2. Команды PCL. В основном состоят из последовательности esc-кодов, которые используются в матричных принтерах. Эти команды составляют значительную часть управляющего кода PCL-файла и включают специфичные для каждого принтера эквиваленты параметров документа (например, форматирование страницы и используемый шрифт).
3. Команды HP — GL /2 ( Hewlett Packard Graphics Language — язык графики Hewlett Packard ). Служат для печати векторной графики составного документа. Они состоят из двухбуквенных мнемоник и одного параметра (или нескольких), определяющего процесс выполнения команды принтером.
4. Команды PJL ( Printer Job Language — язык выполнения печати). Позволяют принтеру «общаться» с компьютером по двунаправленной линии для обмена информацией о состоянии, процессе печати и других параметрах.
Язык PCL совершенствовался с развитием возможностей принтеров. Первые версии языка (1 и 2) применялись в струйных и портативных принтерах Hewlett Packard в начале 80-х годов и не содержали языка описания страниц. В первой модели лазерного принтера LaserJet , выпущенной в 1984 году, уже использовался язык PCL 3, а последние модели лазерных принтеров поддерживают PCL 6. В табл. 1 приведены различные версии языка PCL и возможности, которые добавлялись при использовании этой версии языка в лазерных принтерах фирмы Hewlett Packard .
Полное форматирование страницы; векторная графика
Дополнительные шрифты; загружаемые макросы; поддержка растровых шрифтов и графики
Сжатые растровые шрифты; изображения
Масштабируемые шрифты; векторные шрифты; векторная графика
Поддержка разрешения 600 dpi ; двунаправленный обмен данными между принтером и компьютером; дополнительные шрифты для Microsoft Windows
Быстрая печать графики и возврат управления приложению
Расширенные команды печати графики; многостраничная печать на одном листе; печать водяных знаков; печать малых размеров шрифтов
Версия языка (PCL6), которая разрабатывалась HP в тесном сотрудничестве с Microsoft, характеризуется высокой скоростью преобразования данных из формата прикладного приложения в формат языка описания страниц и обеспечивает ускоренный возврат ответа в приложение, потому идеально подходит для SOHO-сегмента. Также PCL способен работать непосредственно с TrueType-шрифтами, которые применяются по умолчанию в среде Windows. PCL-принтеры снабжаются некоторым набором TrueType-шрифтов, которые «зашиваются» во внутреннюю память устройства. При печати драйвер напрямую передаёт текст на контроллер принтера, минуя стадию преобразования в изображение (рендеринг шрифта), за счёт чего повышается быстродействие печати. При использовании PCL показатели скорости и качества печати напрямую зависят от драйвера устройства, потому всякого рода несовместимости аппаратной и программной составляющих значительно влияют на количество ошибок при печати. По этому параметру PCL не может сравниться с универсальным PS. Тем не менее PCL на данный момент является, пожалуй, самым распространённым языком, применяемым в офисной и домашней среде.
Язык описания страниц PostScript. Ряд фирм для описания страниц используют аппаратно-независимые языки. В первую очередь, это Adobe PostScript, сюда также можно отнести совместимый с ним язык Kyocera KPDL. Идея «постскрипта» проста и понятна — сделать так, чтобы распечатки одного и того же документа, выполненные на разных принтерах, выглядели бы идентично. Никаких других преимуществ и добавочной функциональности PostScript не несет (напротив, он практически не дает возможности отрегулировать качество изображения из драйвера), а в части объемов захватываемых ресурсов существенно превосходит PCL. Перед печатью каждой страницы все относящиеся к ней данные должны полностью уместиться в памяти принтера, кроме того, должна остаться свободная память для преобразований, иначе распечатка будет обрезана или искажена. Поэтому даже имея PostScript-принтер, особенно подключенный к локальной сети, имеет смысл установить и по умолчанию использовать PCL-драйвер, обращаясь к «постскрипту» лишь в случаях, когда требуется особая точность воспроизведения электронного документа на бумаге. Благо практически всегда такие принтеры опознаются системой двояко, с установкой двух драйверов — PS и PCL.
PostScript это не просто язык описания страниц, а целый язык программирования с типичными командами (циклы, операторы, структуры данных), посредством которого можно писать настоящие программы с максимальной гибкостью. PostScript (PS) с момента своего появления остаётся почти абсолютным стандартом в области профессиональной печати и допечатной подготовки. Но, несмотря на то что PS предоставляет широкие возможности максимально качественной цветной печати, он не совсем подходит для «рутинной» печати простых текстовых документов ввиду своей невысокой скорости и некоторых других недостатков. Первые версии языка PostScript уже обладали такими возможностями, как масштабируемые шрифты и поддержка векторной графики ( в язык PCL эти возможности были добавлены относительно недавно). PostScript остается в настоящее время промышленным стандартом для настольных издательских систем и графических программ. Фирма Adobe лицензировала язык PostScript многим производителям принтеров и фотонаборного оборудования, широко используемого в допечатной подготовке газет, журналов, книг и другой печатной продукции. В отличие от PCL, язык PostScript не поддерживает последовательность esc-кодов — он больше похож на стандартный язык программирования.
PostScript называют объектно-ориентированным языком программирования, поскольку на принтер отправляется не изображение, а геометрические объекты. Для того чтобы напечатать текст определенным шрифтом, драйвер принтера должен указать последнему контур шрифта и его размер. Контур шрифта служит шаблоном для создания символов любого размера. Принтер генерирует изображение символа из его контура, а не загружает его из памяти. Этот тип изображения, который генерируется индивидуально для каждой страницы, называется векторной графикой, в отличие т растровой графики, которая отправляется на принтер в виде готового набора точек. (возможность масштабирования шрифтов была добавлена только в PCL 5 в 1990 году).
Pac т po вый ш p ифт ( bitmap font ). Ta ки e ш p ифты м ory т выв o дить c я н a эк pa н e т o льк o в o дн o м pa зм epe , и o ни o птимизи po в a ны для из o б pa ж e ния им e нн o т a к o г o pa зм epa . Pac т po вы e ш p ифты ce йч ac и c п o льз y ют c я д o в o льн o pe дк o , и x п oc т e п e нн o выт ec няют в e кт op ны e ш p ифты.
Be кт op ный ш p ифт ( outline font ). Эти ш p ифты м o г y т м ac шт a би po в a ть c я д o люб o г o pa зм epa , oc т a в a я c ь pe зкими и o тч e тливыми д a ж e п p и o ч e нь б o льши x pa зм epax . П ep вы e в e кт op ны e ш p ифты были co зд a ны в к o мп a нии Adobe Systems для c и c т e мы PostScript и п o л y чили н a зв a ни e Type 1. П o зж e Apple co вм ec тн o c Microsoft pa з pa б o т a ли ф op м a т TrueType , к o т op ый н a ш e л п p им e н e ни e в o п epa ци o нны x c и c т e м ax Windows и Mac OS . Ho вый тип в e кт op н o г o ш p ифт a , п pe д c т a вл e нный в Windows 2000 и н a зыв ae мый OpenType , в o б pa л в ce бя c в o й c тв a к a к ш p ифт o в тип a Type 1, т a к и TrueType .
При использовании контуров процесс печати шрифтов упрощается. Большинство принтеров содержат встроенные шрифты любого размера, а растровые шрифты должны быть загружены в принтер из компьютера. Различие между векторными и растровыми объектами можно заметить в напечатанном образце. Поскольку векторное изображение генерируется в принтере, его качество определяется возможностями принтера. Векторное изображение, напечатанное на принтере с разрешением 600 dpi , выглядит намного лучше, чем аналогичное изображение, напечатанное на принтере с разрешением 300 dpi .
Большинство PostSript-принтеров поставляются с коллекцией из 39 основных встроенных шрифтов, но можно приобрести дополнительные шрифты или целые коллекции. После покупки контурных шрифтов PostScript Type 1 для работы понадобится программа Adobe Type Manager , с помощью которой можно загружать необходимые для печати документов шрифты в принтер. Существует еще одна распространенная технология масштабируемых шрифтов — TrueType . Появившаяся через шесть лет после создания PostScript , эта технология представляет собой результат совместной работы фирм Apple и Microsoft . Обе фирмы желали интегрировать средства управления масштабируемыми шрифтами типа PostScript в собственные операционные системы и не собирались отдавать фирме Adobe такой важный элемент операционной системы. Несмотря на существующие различия в формировании контуров шрифтов, технологии PostScript и TrueType функционируют одинаково. Основное преимущество технологии TrueType состоит в том, что она уже встроена в операционные системы Windows и Macintosh ; кроме того, для работы со шрифтами не нужно приобретать дополнительное программное обеспечение, наподобие Adobe Type Manager . Многие производители шрифтов выпускают свои продукты в обеих версиях — PostScript и TrueType , а существующие между ними различия практически незаметны. Многие производители принтеров встраивают в свои модели коллекцию шрифтов TrueType , которые через операционную систему становятся доступными для приложений. Вы можете получить комплекты шрифтов при покупке принтера, сканера или графического пакета.
Первые модификации языка PostScript отражали развитие возможностей лазерных принтеров фирмы Apple . Незначительные модификации языка легли в основу версии PostScript Level 2. А в 1997 году появилась следующая версия — PostScript Level 3. В обновленных версиях языка PostScript поддерживается большая производительность PostScript-принтеров, а также реализована возможность использования большего объема установленной памяти принтера и нескольких лотков с бумагой. PostScript хорошо продуман изначально и обладает всеми необходимыми свойствами еще со дня своего появления. Все его существующие версии остаются обратно совестимыми. Для использования принтера в процессе допечатной подготовки, несомненно надо использовать принтер с поддержкой языка PostScript , поскольку он является стандартом в издательском мире. Удобно использовать PostScript-принтер и для распространения документов в Internet .
Эти различия в способах формирования изображения в растровом формате и PS объясняют приверженность профессионалов к последнему, так как кривую в каждой узловой точке можно свободно менять в соответствии с пользовательскими нуждами. PS выгодно отличается от прочих языков полной независимостью от разрешения принтера или плоттера. Команды PS представлены в виде ASCII (American Standard Code for Information Interchange) кодов, поэтому для вывода особых пользовательских шрифтов они должны быть преобразованы в совместимый с PS векторный формат. При отправке на печать изображение формируется «полистно», именно поэтому для профессиональной техники так актуальны большие объёмы кэш-памяти (1-, 2-, 4- и 8-битная монохромная картинка в PS значительно различаются по качеству изображения, но чем выше качество, тем больший объем памяти нужен для ее создания). Своего рода дополнением к PS является популярный графический формат EPS (Encapsulated PostScript). Файлы в этом формате могут содержать как векторные, так и растровые элементы, а особая строгая структура, в соответствии с которой данные упорядочиваются внутри документа, позволяет создавать кросс-платформенные исходники для печати. Изначально PS был стандартом де-факто практически во всех моделях лазерных принтеров класса SOHO, однако в настоящее время он почти не применяется в решениях low-end и middle-end из-за дороговизны лицензирования у фирмы Adobe и RIP (Raster Image Processor) контроллеров, встраиваемых в принтеры (RIP-контроллер с поддержкой PS Level 3 для плоттеров компании HP обходился примерно в $500).
Печать из Mac OS по WiFi на GDI-принтер
Чудные win-принтеры вообще железки капризные при попытках их использовать под *NIX и по сети, а тут возникла необходимость подключить HP LaserJet 1000 к конструктору D-Link DIR-320 для печати без проводов. Принт-сервер из коробочки вроде эту возможность не поддерживает, комплект от йота-самоделкиных не проверял.
Мой рецепт под катом.
Общая концепция
Принтер требует загрузки прошивки, это можно осуществить на рутере при подключении принтера к USB. Сервер печати нужно выбрать такой, который выставит наружу RAW-интерфейс, по которому с клиентов будут приходить полностью подготовленные задания. Для поддержки загрузки прошивки и запуска принт-сервера необходима прошивка рутера с поддержкой USB, а также включение поддежки USB, дополнительной памяти и печати в его настройках.
Есть вариация на эту тему — загружать прошивку с клиентского компьютера. Но она похоже не работает, т.к. чтобы удалённо можно было загрузить прошивку, нужно сначала расшарить принтер, а для этого нужно загрузить прошивку 😉
Конкретика
- Установка прошивки рутера. В данном случае, dd-wrt.v24-13577_NEWD_mini_usb.bin от eko. Инструкции можно посмотреть тут
- Настройка рутера. Не забываем устанавливать пароль и настраивать mac-адрес, выход в интернет и маршрутизацию. После чего включаем на вкладке Администрирование в разделе USB поддержку JFFS2, Core USB Support, USB 1.1 Support, USB 2.0 Support, USP Printer Support. Затем включаем сервис SSHd в разделе сервисов и опцию доступа к рутеру по SSH.
- Принтер и сервер печати. Подключаем принтер к рутеру, ребутим рутер, заходим на него рутом по ssh (192.168.1.1). Готовим прошивку:
mkdir -p /jffs/usr/share/foo2zjs/firmware
cd /jffs/usr/share/foo2zjs/firmware
wget oleg.wl500g.info/hplj/sihp1000.dl
Устанавливаем принт-сервер для печати по протоколу JetDirect:
ipkg update
ipkg install p910nd
По идее, в правильной прошивке рутера уже должны быть модули kmod-usb-core, kmod-usb-uhci, kmod-usb-ohci, kmod-usb2, kmod-usb-printer, которые мы включали в настройках для загрузки.
Модифицируем (с помощью vi или cat) скрипт для подключения:
Файл /jffs/etc/config/usb.startup должен содержать загрузку прошивки и старт сервера
cat /jffs/usr/share/foo2zjs/firmware/sihp1000.dl > /dev/usb/lp0/jffs/usr/sbin/p910nd -b -f /dev/usb/lp0 0
Он также должен быть исполняемым — делаем права с +x и запускаем. В принципе, просто выполнения этих комманд вручную достаточно, если не планируется отключать ни рутер, ни принтер. Проверить статус подключения принтера можно dmesg | grep USB , сервер на порту 9100 netstat -na . Всё можно сделать и без ssh выполнением комманд через веб-админку, но это неудобно, особенно для редактирования файлов.
- Настройка клиентов. В Linux просто ставим foo2zjs и gplgs из пакетов. В Mac OS ставим dmg
foo2zjs
foomatic + ghostscript
Заключение, открытые вопросы
Возможно, будет работать и с виндового клиента. Для Mac видимо работа и установка проще, чем локальное подключение. Минус такой, что по факту драйвер foo2zjs хуже, чем драйвера hplip (опыт использования на локальной машине под Ubuntu 9.x). Возможно, можно установить hplips + cups, но далеко не факт.