Печать на принтерах Windows из Linux

Создан: 05.10.2009
Модиф: 06.05.2016
Иванов Аркадий.

 

Здесь у меня маленькая заметка о том, как печатать на принтере, который подключен к Windows-компьютеру и для которого в Linux нет родных драйверов. Такую проблему я решал для Canon LBP-810 и для какого-то МФУ от Canon (брр...). Также иногда приходится работать с дистрибутивами, в которые не хочется прибивать гвоздями новые Linux-драйвера для новеньких типов принтеров, и хочется задачу печати на Windows-компьютерах решить каким-то более универсальным способом.

 

Есть 2 способа решения этой задачи.

Первый требует изменений только на Windows-машине. Рекомендую именно его.

Для глубокого понимания и для отладки глюков можно почитать дополнительно здесь:

 

 

Второй требует изменений и на Linux и на Windows. Конструкция сложновата. Но оно работает и это главное.

 

Замечу, что вам надо установить виртуальный принтер принтером по умолчанию. Некоторые придурковатые системы  управления принтерами под Windows очень любят после перезагрузки , или перевтыкания принтера, или включения/выключения питания на принтере заново его обнаруживать и устанавливать новую копию драйвера, назначая его принтером по умолчанию. Вышеописанные идеи такого самоуправства не выдерживают. Так что, ежели перестало печатать, смотрите сначала в панели управления принтерами Windows на сюрпризы и только потом ругайтесь. :)))

 Для себя просто скопировал оба способа, чтобы лишний раз не шастать по Инету. Добавил небольшие правки.

Ссылки на файлы из первого способа тоже сделал локальные, чтобы не искать лишний раз.

Некоторые файлы уже имеют версии посвежее, но проверил сам, что это не повлияло на работоспособность.

 

Способ 1:

Статья: «Рецепт "приготовления" Win-принтера для печати из Linux»

Автор: Aleksander N.Gorohovski
E-mail: angel на feht.dgtu.donetsk.ua

Постоянная ссылка к статье: http://www.nixp.ru/articles/win_printing_in_linux

    Статья была обновлена в феврале 2008 года.
    Ее модернизировал Anatoly Akatyev (anatoly.akatyev на master-system dot ru).

    Кое-что я добавил после встречи с очередными сюрпризами в Windows 7.

 

1. Предисловие 
Перед нами стоит задача печати документов на Win-принтере (Canon LBP-810) из Linux (ALT Master 2.2/2.4). Canon LBP-810 подключен (USB-подключение) и настроен на Win-компьютере (Windows 98). На другом компьютере с Linux (стандартная установка ALT Master 2.2/2.4, Junior 2.2, Compact 2.3) настроена Samba. Оба компьютера входят в локальную сеть и видят друг друга.

2. Скачиваем необходимые программы 

Для решения поставленной задачи я использовал следующий софт:

RedMon - Redirection Port Monitor (redmon17.zip взял с http://www.cs.wisc.edu/~ghost/redmon/index.htm). Для Win7 нужна версия 1.9.
GhostScript for windows (gs815w32.exe [9,3 МБ] взял с http://www.cs.wisc.edu/~ghost/) 
Этот софт понадобится для настройки виртуального (физически не существующего, но корректно распознаваемого в Linux, например, HP LaserJet 4M Foomatic/Postsript) принтера на Win-компе, на который будем отправлять с Linux-компьютера (через Samba) задания, а он в свою очередь будет их "перенаправлять" (печатать) на реальный Win-принтер (Canon LBP-810). 
P.S.
Не знаю, почему авторы других статей на эту тему рекомендовали дополнительно устанавливать еще и GSView — поставленная задача вполне решается предлагаемым минимумом софта. 


3. Устанавливаем софт 

Здесь все операции выполняются на Win-компе. 

Разворачиваем Redirection Port Monitor redmon17.zip, например, в папку
c:\redmon 
Выполняем его установку:
c:\redmon\setup.exe 
Выполняем установку GhostScript:
gs815w32.exe 
По умолчанию GhostScript устанавливается в c:\gs


4. Устанавливаем виртуальный принтер 

Здесь все операции продолжают выполняться на Win-компе. 

Открываем Блокнот (а еще лучше редактор в Far) и создаем файл настроек параметров c:\gs\mswinpr.rsp для GhostScript, чтобы он мог работать с Win-принтером (Canon LBP-810). В этом файле набираем следующие строки: 
-Ic:\gs\gs8.15\lib;c:\gs\fonts 
-sDEVICE=mswinpr2
-dNoCancel

-dNOPAUSE 
-dSAFER 
-sPAPERSIZE=a4
-sOutputFile="%printer%Canon LPB810"

Первая строка -Ic:\gs\gs8.15\lib;c:\gs\fonts должна начинаться с дефиса и большой латинской буквы "Ай" (а не "1" или "l")!

В последней строке "-sOutputFile" впишите то название принтера, которое в свойствах принтера показывает вам Windows.

Более подробную информацию по этим и другим настройкам можно получить из файлов документации GhostScript: c:\gs\gs8.15\doc\Use.htm и c:\gs\gs8.15\doc\Install.htm

 

Добавляем в систему новый (виртуальный) дополнительный (к физически ранее установленному Canon LBP-810) принтер: 
Пуск->Настройка->Принтеры->Установка принтера 
Появляются окна Мастера установки принтера, в которых выбираем: 
Способ подключения - Локальный принтер. Затем… 
Изготовитель - HP, Принтеры - HP LaserJet 4/4M PostScript. Затем… 
Доступный порт - любой (LPT1: … LPT3:, потом его поменяем на RPT1:). Затем… 
Название принтера - на свой вкус. Затем… 
Напечатать пробную страницу - Нет. 
В окне Принтеры выполняем правый щелчок мышкой по пиктограмме появившегося нового принтера HP LaserJet 4/4M PostScript и в выпавшем контекстном меню выбираем Свойства; 
В появившемся окне диалога Свойства: HP LaserJet 4/4M PostScript выбираем вкладку Сведения, где выполняем: 
Нажимаем кнопку Добавить порт…->Тип добавляемого порта: Другой -> Redirected Port 
В поле Порт указываем RPT1: (Redirected Port); 
Нажимаем кнопку Параметры порта… и в появившемся окне диалога RPT1: Properties определяем: 
В строке Redirect this port to the program: задаем: 
c:\gs\gs8.15\bin\gswin32c.exe 
Именно gswin32c.exe, а не gswin32.exe ! 
В строке Arguments for this program are: задаем: 
@c:\gs\mswinpr.rsp - 
Здесь в конце обязательно должен идти пробел, а за ним дефис!

Ранее файл c:\gs\mswinpr.rsp уже должен быть создан. 
В строке Output: выбираем: 
Copy temporary file to printer 
В строке Printer: выбираем свой Win-принтер (на который будет перенаправлена печать): 
Canon LBP-810 
В строке Run: выбираем: 
Hidden 
(отказываемся от дополнительных всплывающих окон при печати.) 
Можно включить флажок Print Errors 
Можно определить файл лога (на любителя), через кнопку Log File, где в появившемся окне диалога RPT1: Log File Properties установить флажок Log File, а в строке Write standard output to the file: указать: 
c:\gs\logfile.txt 
Все, с диалогом RPT1: Properties покончено. 
Нажимаем кнопку Очередь… и в появившемся окне диалога Параметры очереди устанавливаем Отключить двусторонний обмен данными. Остальные значения можно оставить без изменения (т.е. Начинать печать после помещения в очередь первой страницы; Формат данных в очереди - RAW). 
Теперь в окне диалога Свойства: HP LaserJet 4/4M PostScript выбираем вкладку PostScript, где нажимаем кнопку Дополнительно…. В появившемся окне диалога Дополнительные параметры PostScript сбрасываем (снимаем пометку) флажки: 
Отправить Ctrl+D перед заданием 
Отправить Ctrl+D после задания 
Остальные параметры можно оставить без изменения. 
Теперь в окне диалога Свойства: HP LaserJet 4/4M PostScript выбираем вкладку Доступ, где указываем: 
Общий ресурс 
Сетевое имя - HP
(или другое на свой вкус) 
На этом можно считать, что работа по установке и настройкам виртуального принтера в Windows завершена. Осталось проверить печать через виртуальный принтер. 
В окне диалога Свойства: HP LaserJet 4/4M PostScript выбираем вкладку Общие, где нажимаем кнопку Напечатать пробную страницу.

Для того, чтобы не было проблем с диалоговыми окнами от Ghostscript в Win7, надо патчить реестр. Вот точный рецепт.

Why does the Print Setup dialog appear when I print to the Postscript printer?

This dialog does not appear if you print from the command-line:

%GS_LIB%\gswin32c -dNOPAUSE -I%GS_LIB%;%GS_LIB%\fonts -sDEVICE=mswinpr2 -sOutputFile="\\spool\label" -

The dialog does appear if you put the same code into the RPT1 Port Configuration dialog box. The reason is the code in the mswinpr2 print driver tries to find the printer specified in the -sOutputFile option (without the \\spool\). However, when the spooler runs under the SYSTEM account which has different registry settings, the code in mswinpr2 uses the Win32 GetProfileString to get the entire [Devices] in win.ini. Under Windows NT 4.0, this section is mapped to the user profile.

REGEDIT4 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\win.ini]
"Devices"="USR:Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices"
"PrinterPorts"="USR:Software\\Microsoft\\Windows NT\\CurrentVersion\\PrinterPorts"

On my machine, the administrator account has this in the registry.

REGEDIT4 
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices]
"Brother PTouchPC PS"="winspool,RPT1:"
"label"="winspool,FILE:"

When gswin32c runs under the system account, the above devices are missing and the mswinpr2 driver thinks the devices do not exist. To allow it to find the driver, add the following registry setting to the default user registry.

REGEDIT4
[HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Devices]
"label"="winspool,FILE:"

This information was contributed by muirp at fibersoft.com.




5. Установка доступа к Win-принтеру из Linux

Здесь все операции выполняться на Linux-компе. 

Если у вас ALT Master/Junior 2.2, тогда просто запустите: 
# printerdrake 
далее в диалогах укажите имя Win-компа и принтер HP LaserJet 4M Foomatic/Postsript. 
Если у вас ALT Master 2.4, Compact 2.3 (я думаю, что и для Junior 2.4 эта информация будет в силе), тогда еще проще. Можно выполнить, например, из KDE: 
K -> Принтеры -> Добавить -> Добавить принтер/класс 
и в окнах диалога Мастера установки принтера задать: 
Принтер SMB(Windows). Далее… 
Далее… 
Рабочая группа - (или кнопка Опрос); выбрать Win-комп и принтер HP. Далее… 
Задать производителя - HP; Модель - HP LaserJet 4M. Далее… 
HP LaserJet 4M (Foomatic + Postsript). Далее… 
Далее… 
Далее… 
Далее… 
Имя - HP (или свое). Далее… 
Имя пользователя - root; Пароль - **********. 
Отправьте на печать какой-нибудь документ. Все должно работать превосходно!

 


 

Способ 2:

 

 


 

HOWTO - Печать на принтер под Windows из Linux БЕЗ каких-либо Linux-драйверов или PPD.

Автор Justin Yackoski - (my email address is my first name @ my last name dot name) перевод BuhCIA

Back to English

Для кого эта статья HOWTO?

Для тех, кто имеет хотя бы 1 компьютер под windows, и 1 или несколько компьютеров под linux, объединенные в сеть. Эта статья HOWTO предполагает, что принтер присоединен к компьютеру под windows, который всегда включен, и этот принтер правильно установлен под windows.

Почему Вам это может понадобиться?

Без описываемого метода Ваш принтер должен поддерживаться linux для возможности печатать из-под linux, даже если он присоединен к компьютеру с windows и Вы хотите печатать на нем по сети с помощью SMB. Между тем теоретически при наличии компьютера с Windows в сети, к которому присоединен Ваш принтер, Вы можете печатать на ЛЮБОМ принтере независимо от того, поддерживается ли он в linux. Я проверил этот метод для принтера HP LaserJet 5L (который обычным образом поддерживается под linux), и для принтера Canon imageCLASS MF3110 (который вообще НЕ поддерживается под linux в момент написания статьи). Обратите внимание, что единственное необходимое изменение в подключении принтеров - это назначение принтера по умолчанию на компьютере под windows.

Требования/допущения, относящиеся к компьютеру под Windows

  • Принтер присоединен к компьютеру под windows PC и драйвер правильно установлен
  • Разрешен общий доступ к файлам и принтерам на компьютере под windows
  • Установлен AFPL Ghostscript по ссылке http://www.cs.wisc.edu/~ghost/ (это не требуется для опции использования Acrobat)
  • Установлен GSview по ссылке http://www.cs.wisc.edu/~ghost/ (это не требуется для опции использования Acrobat)
  • Установлен Adobe Acrobat по ссылке http://adobe.com (требуется только для опции использования Acrobat)
  • Установлен Python по ссылке http://www.python.org/download/
  • Установлены расширения Python Win32 Extensions по ссылкеhttp://starship.python.net/crew/mhammond/win32/Downloads.htm
  • Указанный принтер является принтером по умолчанию и желаемые его настройки (качество печати и т.д.) являются текущими настройками принтера
  • Все должно работать с большинством вариантов windows, но я проверял только на win2000

Требования/допущения, относящиеся к компьютеру под Linux

  • Установлен и правильно работает CUPS
  • Установлен клиент SAMBA (smbclient)

Настройка компьютера под Windows

Общий доступ к принтерам

Компьютер под windows реально не дает общий доступ к принтеру через SMB. Вместо этого общий доступ дается к директории (папке), которая будет использоваться как папка для помещения туда данных для печати (spool/dropbox).

Во-первых, создайте пользователя с помощью Панели управления windows. В приводимом примере именем пользователя будет "print", а паролем также "print". Вам следует использовать более надежный пароль.

Во-вторых, создайте папку для общего доступа. В данном примере я использую c:\temp\spool , а имя Вашего компьютера под windows windows_pc

В-третьих, разрешите общий доступ к этой папке и дайте пользователю print полный доступ к ней

Проверьте, что Вы имеете доступ к общей папке с компьютера под linux с помощью smbclient. То есть выполните команду:smbclient //windows_pc/spool -U print и убедитесь, что вы можете выполнять поместить файл командой put в эту общую папку

Скрипт Dirwatch

Далее нам нужен скрипт dirwatch.py , который можно получить по ссылке dirwatch.py. Сохраните его где-нибудь, например, вc:\scripts\dirwatch.pyУбедитесь, что Вы переименовали его в dirwatch.py (я сначала назвал его dirwatch.txt и мой web-сервер не хотел его выполнять!) Скрипт dirwatch основан на Большом примере Тима Голдена (Tim Golden), доступном по ссылке http://tgolden.sc.sabren.com/python/win32_how_do_i/watch_directory_for_changes.html

Откройте для редактирования скрипт dirwatch.py и сделайте следующие изменения:

  • Измените переменную path_to_watch (близко к началу) на Вашу общую папку. УБЕДИТЕСЬ, что обеспечили вывод всех символов \ , например, c:\temp\spool должно быть записано как "c:\\temp\\spool".
  • Измените переменную cmd (близко к концу) так, чтобы путь к файлу gsprint.exe был правильным. ВНИМАНИЕ: даже если Ваш принтер черно-белый, Вы должны все же там оставить опцию -color , иначе возможны проблемы. Эта опция обеспечивает 24-битовую шкалу оттенков серого, вместо 8-битовой.

Выполните скрипт dirwatch двойным кликом мыши на нем. Откроется окно с результатом его выполнения

Проверьте скрипт dirwatch путем использования smbclient (как описано выше) для записи (PUT) и затем переименования (RENAME) файла на языке postscript (с расширением .ps) в Вашу общую папку. Если все работает правильно, этот файл .ps будет напечатан на Вашем принтере и Вы увидите результат в окне терминала python на компьютере под windows

ВНИМАНИЕ: Скрипт dirwatch только распознает файлы, когда они ПЕРЕИМЕНОВЫВАЮТСЯ, поэтому Вам обязательно нужно сначала создать файл в папке, которую Вы указали в переменной path_to_watch, а потом переименовать его.

Теперь, когда скрипт dirwatch работает, прекратите процесс выполнения этого скрипта. Переименуйте dirwatch.py в dirwatch.pyw. С расширением .pyw не будут открываться окна командной строки во время выполнения скрипта.

Выполните новый скрипт dirwatch.pyw и поместите ярлык для него в папку автозагрузки, так чтобы он выполнялся автоматически при загрузке

ВНИМАНИЕ: Если Вы когда-либо заметите, что файлы печатаются в нескольких экземплярах, возможно, что запущены 2 или более копий скрипта dirwatch.pyw . Откройте диспетчер задач и прервите выполнение лишних копий процесса pythonw.exe . Это должно решить проблему.

Теперь компьютер под Windows полностью настроен.

Настройка компьютера под Linux

Установка Distiller PPD (удалитель иусора)

Должен быть установлен Adobe distiller PPD там, где CUPS сохраняют свои PPD. Этот мусорщик distiller PPD называется ADIST5.PPD и упакован в zip-файле, доступном по ссылке http://www.adobe.com/support/downloads/273e.htm

Извлеките из архива ADIST5.PPD и поместите в папку, где CUP хранят PPD. Обычно это /usr/share/cups/model/. Вы должны также переименовать его маленькими латинскими буквами, adist5.ppd.

Скрипт winp

Скачайте скрипт winp по ссылке winp. Разрешите его выполнение и поместите его туда, где CUPS хранит свои backend скрипты, обычно это /usr/lib/cups/backend/. Скрипт winp является модификацией скрипта pdfdistiller , автор которого - Michael Goffioul

Создайте папку для очереди печати в файловой системе linux для использования скриптом winp. В приводимом примере я использую папку /var/spool/winp. Убедитесь, что есть доступ для записи в эту папку для пользователя, под которым выполняется CUPS, обычно этот пользователь входит в группу lp. Предполагая, что CUPS выполняется от имени пользователя, входящего в группу lp, этой цели можно добиться выполнением команды chgrp lp /var/spool/winp и затем chmod g+w /var/spool/winp.

ВНИМАНИЕ: Это ОТДЕЛЬНАЯ папка для очереди печати на компьютере под linux. Это не та папка общего доступа, которая находится на компьютере под windows. Это - просто некоторая локальная папка для временного размещения данных при печати

Откройте скрипт winp для редактирования и сделайте следующие изменения:

  • Измените SPOOLDIR на адрес Вашей папки очереди печати, например, /var/spool/winp
  • Измените SMBUSER на имя пользователя, которое Вы использовали при настройке компьютера под windows, например,print
  • Измените SMBPASS на пароль вышеуказанного пользователя, использованного при настройке компьютера под windows, например, print

Перезапустите CUPS , чтобы он распознал новый скрипт winp среди скриптов backend.

Настройка принтера CUPS

Теперь создайте новый принтер CUPS, который использует этот backend-скрипт winp и сборщика мусора adobe distiller, выполнив с правами root следующую команду: lpadmin -p windows_printer -E -v winp://windows_pc/spool -m adist5.ppdИмейте в виду, что для параметра adist5.ppd малые и большие буквы различаются, так что мы предполагаем, что Вы переименовали этот файл малыми буквами. Параметр windows_printer - это имя Вашего нового принтера, и Вы должны заменить //windows_pc/spool на имя Вашего компьютера под windows и имя папки общего доступа для данных печати на этом компьютере под windows. Не забывайте winp: в начале.

Попробуйте напечатать на Ваш новый принтер CUPS. Надеюсь, он работает!. Если нет, посмотрите журнал ошибок CUPS, обычно это файл /var/log/cups/ (попробуйте изменить уровнь подробности выдачи в журнал - log level - в CUPS и перезапустить CUPS), а также посмотрите журнал winp в файле /tmp/winp.log. Одно из этих двух мест должно помочь Вам найти причину возникших проблем.

Использование вместо этого варианта adobe acrobat (необязательная опция!)

Если у Вас проблема с использованием gsprint, например, проблема с качеством печати или печать использует слишком много ресурсов процессора или памяти на Вашем компьютере с windows, то попробуйте изложенные в этом разделе инструкции.

Я обнаружил, что использование ghostscript на компьютере под windows обеспечивает несколько другое качество печати. Иногда результаты печати с использованием acrobat вызывали очень небольшие проблемы выравнивания текста, когда заполнение областей объекта печати было слегка за пределами границы печати (нужно смотреть очень внимательно, чтобы это заметить). В других случаях ghostscript был немного лучше (опять же нужно смотреть очень внимательно). Кроме того, для использования acrobat Вам нужно сначала преобразовать файл в формат PDF, что увеличит использование процессора (и увеличит шансы загрязнения текста во время преобразования). Наконец, если Вы используете acrobat в то время как кто-то печатает на принтере из-под windows, появится окно acrobat в панели задач. Оно будет свернутым и закроется само, но оно станет активным вместо того, с которым работает пользователь.

По скорости и использованию памяти Acrobat явно лучше. Я не знаю, является ли причиной обработка файлов PDF вместо бОльших по размеру файлов PS, или что-то другое. Если Ваш компьютер под windows имеет медленный процессор или малую память, то опция Acrobat может оказаться лучше для Вас.

В любом случае, если Вы предпочтете использование acrobat на Вашем компьютере под Windows, скачайте скрипт winp-pdf по ссылке winp-pdf и отредактируйте его тем же способом, как описано выше в разделе для скрипта winp. Отредактируйте также скрипт dirwatch.py и уберите знак комментария в строке с acrorc32.exe и соответственно поставьте знак комментария в строке с gsprint.exe . Также Вам нужно будет получить файл gdputil.exe по ссылке http://www.watchdirectory.net/watchDir/GdPUtil.html и поместить его в папку, входящую в системный путь path (например, в папку c:\winnt\system32).

Ограничения

  • Если компьютер под windows выключен, а Вы пытаетесь печатать, то CUPS-принтер остановится самостоятельно. Вам понадобится вручную перестартовать этот принтер, когда Ваш компьютер под windows снова будет включен и доступен, с помощью интерфейса администрирования CUPS.
  • Я не думаю, что исчезнет большое количество параметров настройки из компьютера под linux таких как качество печати, сортировка и т.д.
  • Сетевой пользователь SMB и его пароль явно вводятся в текст скрипта winp. Было бы лучше, если они будут частью URI , использованного, когда Вы устанавливали этот принтер под CUPS. Вам придется добавить эту возможность, если Вы хотите использовать несколько принтеров с разными паролями.