Глава 11. Печать

Глава 11. Печать

Русский перевод: Михаил Сгибнев

В этой главе мы рассмотрим настройку печати для принтера HP Deskjet 690C, подключенного к первому параллельному порту, используя систему печати lpd, входящей в состав NetBSD. Сперва система должна быть сконфигурирована для печати текстовых документов, затем последует настройка печати документов PostScript, используя программу Ghostscript. Пожалуйста, обратите внимание на то, что в коллекции пакетов доступны альтернативные системы печати, такие как lprng и Common Unix Printing System (CUPS). Они не будут рассматриваться в этой главе.

11.1. Активация демона печати

Сразу после завершения установки печать невозможна, так как не активирован демон печати lpd. Для его активации необходимо изменить в /etc/rc.conf следующую строку:

lpd=NO

на

lpd=YES

Изменения вступят в силу после следующей перезагрузки, хотя можно запустить демон вручную:

# sh /etc/rc.d/lpd start

Проверить, запущен ли lpd можно следующей командой:

# ps ax | grep lpd
 179 ?? Is  0:00.01 lpd 

Если вы не увидели строку для lpd в выводе предыдущей команды, то демон не активен.

Конфигурирование lpd происходит с помощью /etc/printcap. Перед началом конфигурирования будет хорошей идеей провести тест принтера, в ходе которого будет возможность проверить правильность физического соединения и работоспособность самого принтера. В этом тесте на принтер посылаются некие данные. В нашем примере используется принтер, подключенный к параллельному порту, поэтому мы будем использовать устройство /dev/lpt0; в случае работы с USB-принтером, необходимо обращаться к устройству /dev/ulpt0. Пожалуйста, проверьте страницы руководства man для этих устройств (lpt(4), ulpt(4)) для получения более полной информации.

Выполним проверку:

# lptest 70 5 > /dev/lpt0

Увидеть, что должно появиться на принтере, можно выполнив эту команду без перенаправления ее на принтер:

# lptest 70 5
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdef
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefg
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefgh
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghi
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghij 

Часто встречающейся проблемой является то, что принтер некорректно выводит столбцы, это обычно означает то, что принтер сконфигурирован начинать новую строку после получения символов <CR> (carriage return, ASCII 13) и <LF> (line feed, ASCII 10). NetBSD посылает только символ <LF>. Для устранения этой проблемы есть два пути:

  • изменить конфигурацию принтера

  • использовать фильтр (описано ниже)

Замечание

В предыдущем примере не используется спулер lpd, потому что программа посылает данные непосредственно на устройство принтера (/dev/lpt0) и не ставится в очередь.

11.2. Конфигурирование /etc/printcap

В этом разделе мы сконфигурируем принтер для печати текстовых документов.

Принтер должен иметь запись в файле /etc/printcap; она содержит идентификатор (имя) и описание принтера. По умолчанию, многими программами используется идентификатор lp. Рассмотрим пример:

Пример 11.1. /etc/printcap

lp|local printer|HP DeskJet 690C:
  :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:
  :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

Формат файла и доступные опции подробно описаны в printcap(5). Пожалуйста, обратите внимание на то, чтобы был определен input filter (с опцией if), который будет бороться с проблемой ступенчатости:

if=/usr/local/libexec/lpfilter

Драйвер принтера и принтеры HP

Для обозначения принтера в Пример 11.1, «/etc/printcap» использует устройство lpa0 (polled driver) вместо lpd0 (interrupt driven driver). Использование прерываний вызывает проблемы на некоторых принтерах и HP Deskjet 690C из их числа, то есть печать идет очень медленно и печать одной страницы в формате PostScript может занять часы. Для решения этой проблемы и предназначен драйвер lpa. Этот драйвер также может быть включен в состав ядра.

в записи для принтера также определяется каталог очереди, который должен быть предварительно создан. Этот каталог будет использоваться демоном lpd для сбора заданий, поступающих на печать:

# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp

Единственная отсутствующая у нас часть -- это фильтр lpfilter, который еще предстоит написать. Этот фильтр предназначен для конфигурирования принтера, чтобы устранить проблему ступенчатой печати.Принтер, используемый в этом примере требует следующей строки инициализации: «<ESC>&k2G».

Пример 11.2. /usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "33&k2G" && cat && exit 0
exit 2

После того, как вы сохраните этот скрипт, убедитесь, что он выполним:

# chmod 755 /usr/local/libexec/lpfilter*

Замечание

Есть другой фильтр, который может использоваться:

if=/usr/libexec/lpr/lpf:

Этот фильтр намного сложнее предыдущего. Он написан для обработки вывода утилиты nroff, отображения подчеркивания и сноски, символов табуляции и конвертации LF в CR + LF. Исходный текст этой программы может быть найден в /usr/src/usr.sbin/lpr/filters/lpf.c.

После выполнения вышеуказанных действий можно снова запустить утилиту lptest, на сей раз используя команду lpr, которая сначала пошлет данные в очередь печати lpd, а затем выполнит фильтр и отошлет данные на принтер:

# lptest 70 5 | lpr -h

Программа lpr печатает текст, используя спулер для посылки данных на принтер; опция -h отключает печать титульного листа (не является необходимой в виду наличия опции sh в /etc/printcap). Пользователи, больше знакомые с системой печати System V могут использовать в качестве альтернативы команду lp(1) вместо lpr(1).

11.3. Конфигурирование Ghostscript

Теперь, когда настроены начальные функции печати, можно добавить возможность печатать файлы PostScript. Принтер, используемый в этом примере, достаточно примитивен и не обладает встроенной поддержкой печати файлов PostScript, поэтому мы должны обеспечить конвертацию команд документа PostScript в последовательность команд, понимаемых принтером. Программа Ghostscript может быть найдена в коллекции портов (смотри Глава 30, Коллекция пакетов). В этом разделе мы рассматриваем конфигурирование lpd для использования Ghostscript, с помощью которой осуществляется печать документов PostScript на принтер HP Deskjet 690C.

Необходимо создать второй идентификатор принтера в /etc/printcap: он будет использовать другой входящий фильтр, который будет вызывать Ghostscript для непосредственной печати документов PostScript. Поэтому, текстовые документы будут печататься на принтере lp, а документы PostScript на принтере ps, то есть используется один физический принтер с разными фильтрами.

Тотже самый результат может быть достигнут при использовании разных конфигураций. Для примера, может быть использован одна запись с одним фильтром, но сам фильтр в этом случае должен быть способен распознавать формат входящего документа. Этот подход требует более сложного фильтра, для его реализации стоит рассмотреть программу magicfilter из коллекции портов.

Для нашего случая, файл /etc/printcap будет выглядеть так:

Пример 11.3. /etc/printcap

lp|local printer|HP DeskJet 690C:
  :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:
  :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ps|Ghostscript driver:
  :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:
  :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:

Опция mx#0 очень важна для печати документов PostScript, так как устраняет ограничения на размер входящего файла, так как такие документы могут быть очень большими. Опция if указывает на новый фильтр, так же указывается новый каталог очереди печати.

Следующим шагом мы создадим каталог очереди печати и программу-фильтр. Порядок создания каталога представлен ниже:

# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps

Фильтр для PostScript более сложен, чем фильтр обработки текста: печатаемый файл должен сперва быть конвертирован в последовательность команд, понимаемых принтером, после чего будет послан на принтер. Итак, мы вплотную подошли к тому, чтобы превратить дешевенький принтер в устройство, понимающее язык PostScript, используя при этом операционную систему NetBSD и несколько свободно распространяемых пакетов. Опции для конфигурации Ghostscript подробно описаны в документации: cdj550, поскольку именно это устройство обычно используется для управления принтерами HP.

Пример 11.4. /usr/local/libexec/lpfilter-ps

#!/bin/sh
# Treat LF as CR+LF
printf "33&k2G" || exit 2
# Print the postscript file
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2

Подведем итоги: мы создали два различных описания одного физического принтера, использующего разные опции, фильтры и каталоги очереди печати. Могут печататься текстовые файлы и файлы PostScript. Печать файлов PostScript осуществляется с помощью установленного нами пакета Ghostscript, входящего в коллекцию пакетов.

11.4. Команды управления принтером

В этом разделе приведен список наиболее распространенных команд BSD для управления принтером и заданиями печати. Помимо уже упомянутых нами команд lpr и lpd у нас имеются:

lpq

выводит список заданий на печать.

lprm

удалает задание из очереди принтера.

lpc

проверяет систему печати, включает/отключает принтеры и их дополнительные функции.

11.5. Удаленная печать

Система печати может быть настроена для посылки документов на принтер, подключенный к удаленному хосту. Для примера, пусть мы работаем за компьютером с именем wotan, а принтер подключен к компьютеру loge. Файл /etc/printcap на хосте loge соответствует файлу Пример 11.3, «/etc/printcap». Возможность печати с хоста wotan мы будем реализовывать с помощью Ghostscript на loge.

Первый наш шаг будет заключаться в том, что мы должны указать хосту loge принимать задания на печать, посланные с wotan. Для этого мы должны добавить строку с именем wotan в файл /etc/hosts.lpd на loge:

# hostname
loge
# cat /etc/hosts.lpd
wotan 

Формат этого файла предельно прост: в каждой строке указывается имя машины, которой разрешено печатать на локальном принтере. По умолчанию, демон lpd прослушивает только локальные сокеты UNIX и не принимает сетевых подключений. Для прослушивания сетевого трафика так же необходимо добавить параметр в /etc/rc.conf:

lpd_flags=""

Затем необходимо отредактировать файл /etc/printcap на машине wotan, чтобы тот посылал задания на loge. Для примера:

lp|line printer on loge:
	:lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:
	:rm=loge:rp=lp

ps|Ghostscript driver on loge:
	:lp=:sd=/var/spool/lpd/ps:lf=/var/log/lp-errs:
	:mx#0:
	:rm=loge:rp=ps

Есть четыре основных отличия этой конфигурации от представленной на Пример 11.3, «/etc/printcap».

  1. Отсутствует определение «lp».

  2. Запись «rm» (удаленная машина) определяет имя хоста, к которому подключен принтер.

  3. Запись «rp» (удаленный принтер) определяет имя принтера, подключенного к удаленной машине.

  4. Нет необходимости определять фильтры, так как они уже определены на машине loge.

  5. Каталог очереди печати должен быть определен на хосте wotan:

    # cd /var/spool/lpd
    # mkdir lp
    # chown daemon:daemon lp
    # chmod 770 lp
    # mkdir ps
    # chown daemon:daemon ps
    # chmod 770 ps 

Теперь задания на печать для очередей «lp» и «ps» с хоста wotan будут автоматически посылаться на принтер, подключенный к loge.

Обновлено: 16.03.2015