Приборкання принтера

Виникла потреба друкувати щось на принтері :-). Ха-ха, Америку відкрив. Не здогадався натиснути Ctrl+P, напевне. І це правда! Друкувати хочу з Linux, на принтері Canon i320. Драйверів немає (turboprint теж не працює). Від S300 не підходять.

Але є віндовий RDP-сервачок. Там ситуація більш втішна – дрова стоять, девайс успішно функціонує. Використовується як великий плеєр з купою місця на твердих носіях, – розшарені диски по самбі, тому друк робитиму через цей протокол. Було би добре, та драйвера таки потрібні на клієнтську машину, їх нема, а зберігати по самбі на сервачок, заходити на робочий стіл по RDP, відкривати там, і пускати на друк звідти якось пахне мазохізмом.

По гарячих слідах  пробував зробити таку процедуру друку: зберігати експортований в PDF  файлик, в певний каталог через примонтовану самбу, віндовий сервак щосекунди моніторить той каталог, і як тільки там щось зявляється, виводить на друк і витирає. Знаю, збоченець я )

Подібний принцип все ж є. Розібрався, що ж то все таке. Надихнула старенька стаття http://www.nixp.ru/articles/win_printing_in_linux.

Роботою механізмів принтера управляє центральний котролер принтера, подібний на маленький процесор. Користувачу все одно, як ці частини взаємодіють між собою, йому важливий результат. Тому з метою зручності та уніфікації принтерів їх контролери повинні розуміти будь-якої мова опису команд, які формують завдання для друку. Подібних мов існує велика кількість: ESC/P-послідовності, Postscript, PCL, HPGL, Lineprinter, Xerox XES / UDK, більше не знайшов. Найбільш поширеними є перші три. Вони ж практично завжди підтримуються сучасними ОС. Більшість принтерів використовують ці мови управління. Здавалося б, все дуже зручно і добре, але прогрес не стоїть на місці. Проблема переходу на нове була і раніше, повернемося в 90-і роки минулого століття.У більшості були матричні принтери, які розуміли тільки про ESC / P-послідовності, а лазерні та струменеві були у небагатьох в силу їх високої вартості, але з часом ситуація почала змінюватися. Розширення документів росли, користувачі стали друкувати все більше графіки.

У перехідний момент появи Postscript і PCL для підтримки зворотної сумісності зі старими програмами багато лазерних та струменевих принтерів вміли емулювати матричні принтери, а деякі вміють робити це й зараз. З одного боку, це добре і зручно всім, але, з іншого, це означає додаткові витрати на проектування і виробництво.

Наприклад, якщо на лазерний принтер, що емулює матричний, відправити на друк слово «linux», то він повинен отримати менше десятка байт (5 байтів тексту плюс кілька службових) і надрукувати слово. При цьому принтер, отримавши 5 байтів тексту, повинен знайти «у себе» таблицю шрифтів і зрозуміти, як та чи інша буква виглядає. Тобто це додаткова пам’ять і обчислювальні ресурси. Коли ж ми друкуємо зображення, наприклад того ж слова «linux», то воно цілком формується на комп’ютері і посилається на принтер. З точки зору користувача різниці немає, картинка однакова в обох випадках, але з точки зору технології та економії є.

Зворотна сумісність зараз не дуже важлива, а якщо зображення тексту може формувати комп’ютер, то навіщо тримати аналогічний блок в принтері? Чи не простіше зробити принтер без цього блоку, буде, напевно, надійніше, тому що менше деталей і точно дешевше? Так і зробили виробники, створюючи технологію GDI-принтера. GDI – це Graphic Device Interface – не що інше, як бібліотека функцій ОС Windows для здійснення виведення інформації на графічні периферійні пристрої, такі як дисплеї або принтери. Разом з цією бібліотекою у зв’язці працює драйвер принтера. Все б добре, тільки деякі виробники принтерів проігнорували інші операційні системи, як Linux, і забули написати для них свої драйвери. Так як специфічний внутрішній формат даних GDI-принтерів не був стандартизований, то у кожного виробника принтерів він свій і кожному принтеру потрібен свій драйвер. Навіть у такій непростій ситуації драйвери під Linux не знадобилися б, якщо фірми спромоглися надати інформацію про своїх протоколи. Але протокол кожного виробника це запатентована технологія, тому вони не поспішають ділитися інформацією з спільнотою Open Source.

Існують дві проблеми: GDI-принтери не сумісні з іншими принтерами, і Linux не має драйверів під більшість GDI-принтерів. Тому залишається два шляхи: перший – перевірити, чи можливо купити опціональний PCL чи Postcript-апаратний модуль у виробника принтера, тобто зробити принтер сумісним. На жаль, велика частина GDI-принтерів не має такої функції і мій маленький canon i320 також не має.

Друкувати будем за наступною схемою: комп’ютер під управлінням Linux відправляє документ у форматі PostScript по мережі на друк сервачка з віндою. Програма RedMon перехоплює повідомлення і відправляє його на вхід програми Ghostscript, яка, використовуючи штатний драйвер принтера під Windows, друкує повідомлення від свого імені.

Качаємо програмку RedMon з адреси http://pages.cs.wisc.edu/~ghost/redmon/index.htm , а Ghostscript (GPL PostScript) звідси http://pages.cs.wisc.edu/~ghost/ . По останньому посиланню вибираєм найновішу версію (наприклад, в на час написання GPL Ghostscript 8.64 released 2009-02-03), і інсталятор під свою архітектуру.

RedMon ставиться швиденько, лишень запустити і натиснути [OK] після завершення. Ghostscript запитує, куди ставити і т.д, теж нічого складного. Нехай, останній покладем в c:\Program Files\gs .

Пишем конфіг для перенаправлення друку. По прикладу автора статті назву його winprinter.rsp :

-Ic:\Program Files\gs\gs8.64\lib;c:\Program Files\fonts
-sDEVICE=mswinpr2
-dNOPAUSE
-dSAFER
-sPAPERSIZE=a4
-sOutputFile="%printer%Canon i320"

Увага. В першому рядку шлях установки GhostScript. В останньому рядку шлях до принтера. Тому бажано скопіювати його назву (інакше перед друком програма запитуватиме, на який принтер друкувати). Змінна %printer% фактично веде на ‘\\spool\’. Зберігаєм файл, наприклад, в c:\Program Files\gs.

Додаєм в вінді новий віртуальний принтерок, детально так, як на скрінах :-) :

priner_set_step0

printer_set_step1

printer_set_step2

Вибираєм Redirected Port, і в наступному вікні залишаєм без зміни (наприклад RPT1:)

printer_set_step3

HP вибраний для прикладу, насправді можна будь-яку модель, головне, щоб принтер підтримувався Linux, і розумів PostScript.

printer_set_step4

Доцільно назвати так, як і основний, лишень додати “ps”, тобто віртуальний PostScript двійник.

printer_set_step5

printer_set_step6

Тут пишем або не пишем всяку фігню.

printer_set_step7

Ось так приблизно. Залишається настроїти перенаправлення. Тому в властивостях нового принтера у вкладці “Ports” будем настроювати порт RPT1: (або інший, який було вказано):

printer_set_step8

Виставляємо настройки наступним чином:

printer_set_step9

  • Redirect this port to the program – шлях до встановленого бінарника GhostScript. Увага: gswin32c.exe . Буква с в кінці – значить консольна програма;
  • Arguments for this program are – шлях до файлу конфігурації, не забути собачку;
  • Printer – все зрозуміло;
  • Print Errors – при помилці буде друкуватись помилка на принтері;
  • Run: Hidden – прихований режим роботи.

Перевіряємо роботу, виводим щось на віртуальний принтер, а друкує фізичний девайс. Ура.

Тепер лиш встановити принтер в Linux. Користую Ubuntu, в ній є зручна утилітка system-config-printer.py . Основні моменти:

printer_set_step1_linux

По самбі вибираємо наш віртуальний принтер.

printer_set_step2_linux

Вибираєм драйвер до нашого принтера, але обов’язково з позначкою “PostScript”.

Ось і все. Тішусь друком, все не так і складно.

This entry was posted in GNU\Linux, Windows. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

One Comment

  1. Posted 29.11.2009 at 00:10 | Permalink

    Оригінальне рішення, й походу саме правильне.
    В нотатки, може пригодитися :)

Post a Comment

You must be logged in to post a comment.