Настройка печати на принтерах
HP LaserJet (1005, 1018, 1020, 1022 и др.),
использующих формат печати ZJS

Основное отличие этих принтеров от аналогичных лазерных принтеров HP заключается в использовании иного формата данных, передаваемых принтеру. Это теперь уже не старый добрый PCL, а ZJS (Zenographics ZjStream printer format). Этот формат не понимает основной принтерный фильтр Ghostscript. Но благодаря Рику Ричардсону (Rick Richardson), появилась программа foo2zjs, которая позволяет преобразовывать принтерный вывод в требуемый нам формат. Данная программа находится в портах print/foo2zjs. Необходимо ее установить.

Другой особенностью таких принтеров HP является то, что их программное обеспечение (firmware) не зашито жестко в аппарат, а должно быть загружено с компьютера при включении принтера или перед началом печати. В принципе, это мудрое решение, так как позволяет, при необходимости замены firmware, избежать сложную, и порой небезопасную, процедуру перепрошивки аппарата. Для апгрейда достаточно просто указать новый файл прошивки на компьютере, и даже в случае его недееспособности, ничего страшного не произойдет. Но с другой стороны эта особенность и является тем подводным камнем, на который натыкаются пользователи FreeBSD.

Но сначала нужно выбрать систему печати. Далее будем все рассматривать на примере печати через CUPS (Common Unix Printing System). Устанавливаем из портов print/cups.

После установки cups, если вы хотите печатать с других машин по сети, подредактируйте файл /usr/local/etc/cups/mime.types. Необходимо в нем раскомментировать строку:

application/octet-stream

А в файле /usr/local/etc/cups/mime.convs необходимо раскомментировать строку:

application/octet-stream application/vnd.cups-raw 0 -

И если установлен ghostscript, то закомментировать строку:

application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster

Ну и, конечно, для печати по сети необходимо правильно прописать права доступа в файле /usr/local/etc/cups/cupsd.conf. В этом файле все интуитивно понятно, так что подробно останавливаться на этом не будем.

В некоторых случаях ваш принтер не сможет печатать со штатными утилитами lp, lpq, lpr, lprm. Они находятся в каталоге /usr/bin. Поэтому лучше сразу удалить или переименовать их. А затем сделать ссылки на соответствующие утилиты cups, которые должны быть в каталоге /usr/local/bin:

cd /usr/bin
mv lp lp-
mv lpq lpq-
mv lpr lpr-
mv lprm lprm-
ln -s /usr/local/bin/lp lp
ln -s /usr/local/bin/lpq lpq
ln -s /usr/local/bin/lpr lpr
ln -s /usr/local/bin/lprm lprm

Чтобы не делать лишних манипуляций со штатными утилитами, можно в /etc/make.conf добавить следующее:

CUPS_OVERWRITE_BASE=yes

Тогда при установке CUPS штатные утилиты автоматически заменятся утилитами CUPS.

Также не лишним будет установка порта print/cups-smb-backend. Это позволит подключать сетевые принтеры, расшаренные на машинах под управлением ОС Windows.

Так как возможно вам потребуется в дальнейшем подключение каких-либо других принтеров, то не лишним будет установка print/foomatic-filters, print/foomatic-db и print/foomatic-db-engine. Это позволит работать с широким спектром принтеров.

Но вернемся к установке конкретного принтера, например HP-1020. Это USB-принтер. Первое чего нужно добиться – это автоматическая заливка прошивки при включении принтера или при загрузке системы. Для этого нужно перекомпилировать ядро, закоментировав в конфигурации ядра строку:

#device ulpt

Включить поддержку ulpt, если вдруг понадобится в дальнейшем другой USB-принтер, можно через /boot/loader.conf, прописав в нем:

ulpt_load="YES"

Нужно достать прошивку для устанавливаемого принтера. Для нашего примера – это файл sihp1020.dl. Можно найти этот файл на сайте разработчиков foo2zjs. Также вы можете взять файл sihp1020.img на диске с драйверами принтера для Windows. Чтобы получить прошивку в нужном формате необходимо воспользоваться утилитой arm2hpdl, которая устанавливается из пакета foo2zjs, и выполнить команду:

arm2hpdl sihp1020.img > sihp1020.dl
Полученный файл необходимо положить в /usr/local/share/foo2zjs/firmware/.

Далее необходимо разрешить запуск демона usbd. Этот демон запускается из файла /etc/rc.conf путем включения в него строки:

usbd_enable="YES"

В конфигурационный файл /etc/usbd.conf добавляем следующие строки:

device "HP LaserJet 1020 printer"
	product	0x2b17
	vendor	0x03f0
	attach	"cat /usr/local/share/foo2zjs/firmware/sihp1020.dl \
                > /dev/${DEVNAME}.1"

Также необходимо прописать в /etc/rc.local:

cat /usr/local/share/foo2zjs/firmware/sihp1005.dl > /dev/ugen0.1

Теперь, после перезапуска usbd, каждое включение принтера или перезагрузка компьютера должна сопровождаться загрузкой в принтер программного обеспечения. Обратите внимание, что числовые параметры product и vendor могут потребовать уточнения, т.к. они разные для разных моделей принтеров. При необходимости это можно сделать посмотрев, при включенном принтере, вывод команды:

sysctl -a | grep dev.ugen

Для того чтобы на принтере можно было печатать под любым пользователем, а не только под root пропишите в /etc/rc.conf:

devfs_system_ruleset="localrules"

А в /etc/devfs.rules:

[localrules=10]
add path 'ugen*.1' mode 0660 group cups

Далее остается только добавить принтер через мастер настройки принтеров в KDE. При выборе класса принтера невозможно будет выбрать устройство, под которым определяется принтер, а именно ugen0.1. Поэтому выбирайте пункт «Другой тип принтера» и указывайте URI: parallel:/dev/lpt0. Драйвер выбирайте тот, в котором присутствует упоминание о foo2zjs. После завершения процесса установки принтера необходимо отредактировать файл /usr/local/etc/cups/printers.conf. В файле необходимо найти описание настроек только что установленного принтера и заменить значение DeviceURI на file:/dev/ugen0.1.

Пояснения для FreeBSD 8.x:

В FreeBSD 8.0 произошли значительные изменения в плане работы устройств через USB. Поэтому подключить подобные принтеры стало гораздо проще. Из ядра не надо убирать ulpt. И так как демон usbd удален, то необходимо использовать devd. Для заливки в принтер прошивки достаточно прописать в /etc/devd.conf:

attach 10 {
    device-name "ulpt[0-9]+";
    match "vendor" "0x03f0";
    match "product" "0x2b17";
    action "cat /usr/local/share/foo2zjs/firmware/sihp1020.dl > /dev/$device-name";
};

Этого достаточно для того, чтобы прошивка заливалась и при включении компьютера и при выключении/включении принтера. Узнать vendor и product можно следующим образом:

usbconfig dump_device_desc

Также не нужно никаких дополнительных манипуляций в KDE. Принтеры успешно устанавливаются через мастер установки принтеров.

Внимание!

Ваш ZJS-принтер, да и любой другой USB-принтер может ни с того, ни с сего начать вдруг себя странно вести. Странности могут проявляться совершенно различным образом без определенной закономерности. Например, принтер то печатает, то не печатает, то просто моргает лампочками. В этом случае стоит присмотреться к USB-кабелю принтера. И лучше долго не думая заменить его на толстый кабель с ферритовыми кольцами. Такие обычно используются для USB-сканеров. После замены кабеля 99.9% проблем с печатью на таких принтерах сразу исчезают.