ПАВЕЛ ЗАКЛЯКОВ
Медиация Linux и GDI-принтера
На что только не идёт капитализм ради получения сверхприбыли. Так, производители GDI-принтеров реализуют свои упрощённые продукты массовым покупателям дешевле, ожидая, что последние не будут подключать свои принтеры к ОС Linux, а будут покупать лицензии на коммерческие ОС. Как видим, скупой платит дважды, поэтому лучше вообще не покупать дешёвые GDI-принтеры. Но что делать, когда это не скупость, а бедность? Тогда на помощь приходит наша изобретательность.
Обратился ко мне знакомый с просьбой помочь, настроить принтер в Linux. «Нашёл чем удивить», – подумал я. Положил в сумку ноутбук с Linux, сладенькое к чаю и поехал на выходных разбираться с проблемой. По приезду оказалось не всё так просто. Я думал, что в офисах должны жить сетевые принтеры, подключённые к локальной сети, а не к отдельному компьютеру. (Я даже домой подумывал себе такой прикупить, так как частенько раздражает совместное использование печатающего устройства вместе с родственниками, а покупать два принтера – расточительство.) Но, как выяснилось, я ошибался. У нас везде экономят и, если можно купить что-то подешевле, то жди подвоха. Новый принтер, который предстояло настроить для совместной печати в сети, оказался GDI-принтером, а большая часть не понимающих в технике сотрудников уже сроднилась с ОС Linux, из-под которой принтер упорно отказывался печатать.
Что такое медиация
Термин «медиация» относительно молодой и был заимствован из сферы бизнеса. Многие компании сталкиваются с тем, что годами не могут решить проблемы с конкурентами, а то и коллегами. Ни одна из фирм не намерена уступать другой, а повлиять на ситуацию никто не может, обе стороны недовольны и терпят убытки. «Демократический путь» – использовать судебную систему безнадёжно устарел, невыгоден, долог и редко оставляет в выгоде обе стороны.
Медиация – это когда обе стороны не отступают от своих принципов, а соглашаются идти на переговоры с привлечением нейтрального посредника – медиатора. Не вдаваясь в тонкости всего этого процесса, можно отметить, что на «западе» больше половины дел, разрешаемых через медиацию, оставляют довольными обе стороны.
В этой статье я постараюсь выступить в роли медиатора, решив проблему печати из под ОС Linux на GDI-принтеры.
GDI-принтеры
Немного теории. Любой принтер – это устройство, которое может наносить на бумагу или другой носитель (плёнка, компакт-диск и др.) изображение или текст. Принтеры бывают самые разные. Не секрет, что в кондитерском деле существуют пищевые принтеры фирмы Modecor со съедобными чернилами, которые могут печатать тексты и фотографии на вафельных или сахарных пластинах. Существуют принтеры, печатающие рекламные плакаты, наклейки в супермаркетах, заполняющие паспорта, билеты, платёжки и сберкнижки. В общем, «выбирайте на любой вкус и цвет». Чаще всего все эти принтеры подключаются к компьютеру, который подготавливает и отправляет информацию для печати. С этого момента и начинаются все тонкости.
Несмотря на то что за захват, перемещение носителя, нанесение изображения или перемещение печатающей головки отвечают различные механизмы, состоящие из роликов, моторчиков, шестерёнок и др., всеми этими частями управляет некоторое центральное устройство, которое мы назовём процессором или контроллером принтера. Пользователю всё равно, как эти части взаимодействуют между собой, ему важен результат. Поэтому с целью удобства и унификации принтеров их контроллеры должны понимать какой-либо язык описания команд, формирующих задание для печати. Подобных языков существует великое множество: ESC/P-последовательности, Postscript, PCL, HPGL, Lineprinter, Xerox XES/UDK и др. Наиболее распространёнными являются первые три. Они же практически всегда поддерживаются современными ОС. Большинство принтеров делают совместимыми с этими языками. Казалось бы, всё очень удобно и хорошо, но прогресс не стоит на месте.
Проблема перехода на новое была и раньше, вернёмся в 90-е годы прошлого века. У большинства были матричные принтеры, «знающие» только об ESC/P-последовательностях, а лазерные и струйные были уделом немногих в силу их высокой стоимости, но со временем ситуация начала меняться. Пользователи стали печатать всё больше графики. Разрешения, а значит и качество, документов росли.
В переходный момент появления языков Postscript и PCL для поддержания обратной совместимости со старыми программами многие лазерные и струйные принтеры умели эмулировать матричные принтеры, а некоторые умеют делать это и сейчас. С одной стороны, это хорошо и удобно всем, но, с другой, это означает дополнительные накладные расходы.
Например, если на лазерный принтер, эмулирующий матричный, отправить на печать слово «мама», то он должен получить меньше десятка байт (4 байта текста плюс несколько служебных) и напечатать слово. При этом принтер, получив 4 байта текста, должен найти «у себя» таблицу шрифтов и понять, как та или иная буква выглядит. То есть это дополнительная память и вычислительные ресурсы. Когда же мы печатаем изображение, например того же слова «мама», то оно целиком формируется на компьютере и посылается на принтер. С точки зрения пользователя разницы нет, картинка одинаковая в обоих случаях, но с точки зрения технологии и экономии есть.
Обратная совместимость сейчас не очень важна, а если изображение текста может формировать компьютер, то зачем держать аналогичный блок в принтере? Не проще ли сделать принтер без этого блока, будет наверняка надёжнее, т.к. меньше деталей и точно дешевле?
Так и поступили производители, создавая технологию GDI-принтера. GDI – это Graphic Device Interface – не что иное, как библиотека функций ОС Windows для осуществления вывода информации на графические периферийные устройства, такие как дисплеи или принтеры. Вместе с этой библиотекой в связке работает драйвер принтера.
Всё бы хорошо, только производители принтеров в погоне за дешевизной упустили из виду другие операционные системы, как ОС Linux, и забыли предоставить для них свои драйверы. Предполагаю, что тут не обошлось без влияния производителей Windows.
Так как специфический внутренний формат данных GDI-принтеров не был стандартизирован, то у каждого производителя принтеров он свой и каждому принтеру нужен свой драйвер. Даже в такой непростой ситуации драйверы под Linux не понадобились бы, если фирмы удосужились предоставить информацию о своих протоколах. Уверен, что десяток-другой энтузиастов решили бы проблему менее чем за неделю. Но протокол каждого производителя это «know-how» – запатентованная технология, поэтому они не спешат делиться информацией с Open Source-сообществом.
Вместе с тем, большинство пользователей не знакомы с тонкостями технологии печати и не задумываются о совместимости. Обидно, но именно они, массовые покупатели, не разбирающиеся в деталях, чаще всего определяют ход истории, развитие принтеров, операционных систем и многого другого, покупая то, что подешевле. Так и в моём случае – принтер покупали одни люди, а настраивать операционные системы пришлось мне. Большинству администраторов наверняка эта история покажется знакомой.
Медиация
Не всё так плохо, если бы не наша изобретательность!
Существуют две проблемы:
- 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».
-I"C:\Program Files\gs\gs8.62\lib";"C:\ProgramFiles\gs\gs8.62\fonts"
-sDEVICE=mswinpr2
-dNOPAUSE
-dSAFER
-sPAPERSIZE=a4
-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 полным путём и необходимыми ключами:
@"C:\Program Files\gs\winprinter.rsp" –
Имя файла взято в кавычки, перед ним записана «собака», а после имени через пробел стоит дефис. Для «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.
- RedMon – Redirection 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.