Печать на Windows-принтер без каких-либо драйверов или PPD-файлов
Материал из База знаний Linux.ру
Кому это HOWTO надо?
Людям, которые имеют как минимум, 1 компьютер с предустановленной ОС Windows и более одного компьютера с Linux соединённых локальной сетью. Данное HOWTO заранее подразумевает тот факт, что компьютер с установленной ОС Windows всегда включён, и принтер на нём правильно установлен и сконфигурирован.
Зачем надо это делать?
Без использования этого метода ваш принтер должен поддерживать печать из ОС Linux, даже если он подключен к ОС Windows и вы хотите печатать на него через протокол SMB. Теоретически, имея компьютер с установленной Windows, и включённый в локальную сеть вы можете печатать на ЛЮБОЙ принтер вне зависимости от его поддержки в ОС Linux. Данный способ был опробован на принтере HP LaserJet 5L (который прекрасно поддерживается ОС Linux), и Canon ImageCLASS MF3110 (который поддерживался на момент написанния данной статьи не полностью). Прошу заметить, что все изменения на компьютере с Windows ограничивались сменой принтера по умолчанию.
Требования / возможности для компьютера с Windows
- Принтер должен быть подключен к компьютеру с ОС Windows и правильно установлен.
- Общий доступ к файлам и каталогам Windows должен быть включен
- Должен быть установлен пакет AFPL Ghostscript (не нужен, если вы будете использовать Acrobat).
- Должен быть установлен пакет GSview (не нужен, если вы будете использовать Acrobat).
- Должен быть установлен пакет Adobe Acrobat (необходим, только если вы будете его использовать)
- Должен быть установлен пакет с языком программирования Python
- Должны быть установлены Python Win32 Extensions.
- Принтер который вы хотите использовать должен быть принтером по умолчанию и в нём должны быть выставлены все необходимые настройки (качество печати, и т.п.).
- Должно работать с большинством версий Windows, хотя для этой статьи пробовались только ОС Windows 2000 и Windows XP.
Требования / возможности компьютера с ОС Linux
- Должен быть установлен и работать пакет CUPS
- Должна быть установлена клиентская часть SAMBA (smbclient)
Настройка компьютера с ОС Windows
Настройка общего доступа к буферу печати
Нам не нужно предоставлять общий доступ к принтеру через протокол SMB, вместо этого мы дадим доступ по сети к общему каталогу, который будет использоваться в качестве места для буфера очереди печати или файлоприёмника. Далее, нам необходимо создать нового локального пользователя на компьютере с Windows. Назовём его print. Также не забудьте назначить ему пароль. После этого мы создадим каталог на диске. Например, пусть он будет располагаться в C:\temp\spool имя вашего компьютера для примера будет windows_pc. К этому каталогу необходимо дать общий доступ и дать пользователю print полный доступ к нему. Теперь, мы протестируем возможность доступа к только что созданному сетевому ресурсу используя smbclient. Для этого необходимо ввести в консоли:
smbclient //windows_pc/spool -U print
После чего попробуйте поместить туда какой-нибудь файл.
Скрипт dirwatch
Следующим шагом у нас будет скачивание и установка скрипта dirwatch.py вот отсюда. Сохраните этот скрипт в сухое и тёплое место, например, в C:\scripts\dirwatch.py. Убедитесь, что вы не забыли переименовать его в dirwatch.py. Я сохранил его на сервере под именем dirwatch.txt, чтобы мой веб-сервер не пытался его выполнить! Данный скрипт основан на превосходном примере Тима Голдена доступном здесь. Не забудьте отредактировать сам скрипт следующим образом:
- Измените переменную path_to_watch (почти в самом начале файла) на ваш каталог для буфера печати (то есть, C:\temp\spool). Будьте ОЧЕНЬ внимательны, проверяйте отсутствие символов одиночного обратного слэша "\", то есть путь к "C:\temp\spool" должен выглядеть как "C:\\temp\\spool".
- Измените значение переменой окружения для cmd (ближе к концу). Удостоверьтесь, что путь до файла gsprint.exe верен. Хочу заметить, что даже если ваш принтер монохромный, то я бы советовал вам всё равно оставит там опцию -color во избежание проблем. Данная опция включает 24-х битную серую шкалу яркости вместо 8-ми битной. Теперь можете попробовать запустить этот скрипт с помощью двойного щелчка по нему. Вы должны увидеть вывод в консольном окне.
Проверьте скрипт с помощью smbclient (как было указано выше), чтобы он помещал и переименовывал Postscript-файл (с расширением .ps) в каталог для очереди печати. Если всё будет правильно, то файл уйдёт на печать, а на экране компьютера с Windows появится терминальное окно Python с выводом.
Важное примечание: скрипт dirwatch.py распознаёт файлы только тогда, когда они ПЕРЕИМЕНОВАНЫ, поэтому необходимо сначала создать файл в нужном каталоге, который был указан в переменной path_to_watch, а затем переименовать его.
Теперь когда мы удостоверились, что всё работает нужно убить процесс со скриптом. Переименуйте dirwatch.py в dirwatch.pyw. Это необходимо для того, чтобы не появлялось окно с выводом при выполнении скрипта.
Запустите скрипт dirwatch.pyw и поместите его в автозапуск, чтобы он автоматически запускался при загрузке.
Примечание: Если вы отправляли файл на печать несколько раз, то в некоторых случаях может появиться две или более копий запущенного скрипта. Чтобы решить проблему, необходимо запустить диспетчер задач Windows и убить необходимое количество лишних процессов с именем pythonw.exe, чтобы он остался один.
Настройка компьютера с ОС Windows полностью закончена.
Настройка компьютера с установленной ОС Linux
Использование PPD-файла
Файл PPD от Adobe должен быть установлен в том место, где CUPS хранит все свои PPD-файлы. Файл PPD с именем ADIST5.PPD в zip-архиве может быть найден тут.
Распакуйте ADIST5.PPD и поместите его с остальными PPD-файлами для CUPS. Обычно, они располагаются в /usr/share/cups/model/. И да, переименуйте его в нижний регистр как adist5.ppd.
Скрипт winp
Скачайте скрипт winp отсюда. Присвойте ему необходимые права для выполнения и поместите в каталог, где CUPS хранит скрипты для бэкэндов. Обычно они лежат в /usr/lib/cups/backend/. Скрипт winp - это модификация скрипта pdfdistiller Майкла Гоффьола.
Создайте каталог для буфера, который будет использоваться скриптом winp. Я, для примера, разместил его в /var/spool/winp. удостоверьтесь в том, что данный каталог доступен для записи тому пользователю из под которого запущен CUPS. Обычно, он находится в группе lp. Убедитесь, что CUPS запущен из под пользователя, который входит в группу lp. Это может быть проверено запуском команды в консоли:
chgrp lp /var/spool/winp
И выполнением следующей команды:
chmod g+w /var/spool/winp
Если вы не знаете из под какого пользователя запущен процесс cupsd, то выполните в консоли следующее:
ps auxw | grep cupsd
В первой колонке вы увидите из под какого пользователя запущен cups, чтобы его можно было вставить в качетсве самого первого аргумента для выполнения команды chgrp, указанной парой примеров выше.
Примечание: Это отдельный каталог для буфера печати, располагающийся на компьютере с ОС Linux. Он не должен быть доступен каким-либо образом с компьютера где установлена Windows. Это всего лишь временный рабочий каталог.
Отредактируйте скрипт winp, внеся в него следующие изменения:
- Измените SPOOLDIR на место расположения каталога с буфером для winp т.е., /var/spool/winp.
- Измените SMBUSER на имя пользователя, которое мы создавали впроцессе настройки Windows, т.е., print.
- Смените SMBPASS на пароль пользователя, которого мы создавали в процессе настройки Windows. Т.е. пароль пользователя print.
Перезапустите CUPS, чтобы он перечитал конфигурационный файл со скриптом winp в каталоге для бэкэндов.
Настройка принтера в CUPS
Настало время создать принтер используя скрипт winp и adobedistiller выполнив от пользователя root следующее:
lpadmin -p windows_printer -E -v winp://windows_pc/spool -m adist5.ppd
Прошу заметить, что Linux чувствительна к регистру букв в именах файлов, поэтому необходимо переименовать windows_printer в нижний регистр и заменить //windows_pc/spool именем вашего компьютера с Windows и названием каталога для буфера, который вы создали. И ещё не забудьте про winp: в самом начале.
Теперь попробуйте напечатать на ваш новый принтер в CUPS. Надеюсь, всё заработает сразу. Если всё же не заработает, то проверяйте содержимое /var/log/cups/ (попробуйте изменить уровень подробности логов и перезапустить CUPS). Как вариант, ещё можно проверить лог самого скрипта winp находящийся в /tmp/winp.log. В одном из этих мест вы сможете продиагностировать проблему.
Используем вместо всего этого Adoba Acrobat (строго по желанию!)
При использовании gsprint могут возникнуть те или иные проблемы, например, проблемы с качеством печати, слишком большое использование ресурсов просцессора или оперативной памяти на вашем компьютере с Windows, то попробуйте способ описанный чуть ниже.
В моём случае я заметил, что при использовании ghostscript под Windows незначительно различаются результаты вывода на печать. Иногда отпечатки сделанные через Acrobat имели очень небольшие проблемы связанные с расположением, когда заполненные объектами области немного расходились с контурами (чтобы это заметить, надо было довольно внимательно вглядываться). В других случаях, ghostscript оказывался несколько лучше (опять же, это можно было заметить при внимательно рассмотрении). Кроме этого, чтобы использовать Acrobatнеобходимо было сначал сконвертировать файлы в формат PDF, что увеличивало время обработки файла (и больше шансов на то, что вылезет какая-нибудь фигня во время процесса конвертации). Ещё одним моментом является то, что при печати с помощью Acrobat появляется окно программы. Оно, конечно, минимизируется в трей, но только вот перед этим оно захватывает фокус окна.
Более аккуратное использование ресурсов процессора/памяти. Тут Acrobat лидирует. Хотя я не уверен на счёт обработки больших PDF вместо PS файлов. Если у вас старый или слабый компьютер с установленной Windows, то использование Acrobat будет предпочтительным вариантом.
Так или иначе, если вы решите использовать Acrobat вместо Ghostscript на компьютере с Windows, то вам потребуется скачать скрипт winp-pdf вот отсюда и отредактировать файл по аналогии с предыдущим вариантом скрипта winp. Удостоверьтесь, что вы указали winp-pdf как протокол, вместо winp во время настройки принтера в CUPS, или переименуйте этот скрипт в winp и отредактируйте строку, где после слова PDFDIR нет опции "-pdf". Кроме того, отредактируйте скрипт dirwatch.py, который мы рассматривали выше и раскомментируйте строку со словом acrord32.exe. и закомментируйте строку где содержится слово gsprint.exe. Также вам потребуется скачать файл gdputil.exe и поместить его куда-нибудь в систему. Например, в c:\winnt\system32.
Ограничения
- Если компьютер с Windows на который вы пытаетесь печатать выключен, то CUPS остановится и не даст ничего сделать. Вам придётся вручную перезапустить CUPS через интерфейс администратора, когда Windows снова запустится.
- Не думаю, что будет возможен полный контроль за печатью документов с компьютера на котором установлен Linux и такими вещами как яркость, качество печати и другие.
- В скрипте winp имя пользователя/пароль "прибиты гвоздями". Поэтому будет лучше, использовать их как часть URI при настройке принтера через CUPS. Можете использовать эту особенность если хотите использовать несколько принтеров с разными паролями.
Решение проблем / Улучшения
Некоторые люди могут предложить мне различные усовершенствования и советы связанные с исправлением возникших проблем. Если вы что-то исправили или доработали, и считаете, что другие люди должны это узнать, то напишите мне, я выложу по возможности.
Настройка уровня журналирования в CUPS
Если у вас имеются проблемы при печати на CUPS, или файлы не появляются в вашем общем каталоге на машине с Windows, то подправьте аргумент опции LogLevel в конфигурационном файле cupsd.conf (как правило он лежит /etc/cups/) на debug и перезапустите CUPS.
Сложности связанные с доступом к Windows через smbclient
Если вы обнаружили, что smbclient у вас запущен, но вы никак не можете подключиться к машине с Windows, то вы можете попробовать подключиться к машине используя ip-адрес (при условии, что он назначен статически). Если этот метод сработал, то запустите команду lpadmin, чтобы можно было использовать ip-адрес вместо имени машины:
lpadmin -p windows_printer -E -v winp://192.168.0.102/spool -m adist5.ppd
Особенности работы за фаерволлом
Если вы пытаетесь подключить к машине через Samba, но не можете понять почему у вас ничего не получается, то вполне возможно, что фаерволл может быть тому причиной. Учтите, что если у вас есть фаерволлы на компьютерах с Windows и Linux, то настраивать надо ОБА.
Протокол SMB для своей работы требует открытия следующих портов: 135 и 139 для протокола TCP, 137 и 138 для протокола UDP. Весьма желательно, чтобы на компьютере с Windows ваш компьютер с установленным Linux был внесён в доверенную зону и viсe verse (лат. "наоборот"). Проверьте также, чтобы на компьютере с Linux были разрешены широковещательные пакеты, путём установки FW_TRUSTED_NETS и FW_ALLOW_FW_BROADCAST_EXT в конфигурационном файле фаерволла. Чтобы успешно выполнить эти две вещи, рекомендуется ознакомиться с документом HowTo Firewall Linux and Windows Hosts in a SOHO LAN для более подробной информации о проблеме. В некоторых случаях печать может не работать по причине того, что вы можете находиться за NAT. Это отдельный вопрос и он выходит за рамки этой статьи.
Всё вроде замечательно, но при попытке отправить документ на печать, файл появляется в общем каталоге, но удаляется через 30 секунд. Сам документ не печатается.
А появляется ли окно Ghostscript на компьютере с Windows? Если файл удаляется, то это означает, что всё работает верно кроме того момента который касается вывода документа на печать. Что можно сделать в этой ситуации? Попробуйте сделать следующие вещи:
- Проверьте, пути к ghostscript в скрипте dirwatch.py. Если у скрипта расширение .py, то при попытке запуска наверняка увидите соответствующую ошибку.
- Скопируйте появившийся файл из каталога spool до того, как он будет удалён куда-нибудь в другое место и попробуйте его открыть. Если вы сможете просмотреть его в Linux, но не Windows, или в какой-нибудь программе, но не программе использующей печать, значит это проблема совместимости. В этом случае попробуйте распечатать его из другого приложения их под Linux, или как вариант воспользуйтесь моими инструкциями по использованию PDF. Некоторые приложения в Linux иногда генерируют не совсем совместимый со стандартами PostScript-файл. В этом замечены некоторые версии браузера Firefox.
- В случае невозможности просмотреть ps-файл на Linux (используя для этого просмотрщики ps-файлов), следует считать, что файл повреждён. В этом случае остаётся попробовать инструкции по использованию PDF-файлов. Если вам удастся распечатать таким образом документ, значит проблема в несовместимости. Если всё равно не помогает, то вы явно что-то сделали не так на этапе установки. Возможно, неправильно работает Ghostscript на машине с Linux. Может быть неправильно настроен CUPS (неверный ppd-файл?) или ещё какие-то ошибки CUPS, которые необходимо искать в файле cups.log
Оригинал документа располагается здесь. Автор документа: Джастин Якоски. Перевод: Буданов Евгений aka r0g3r.
