pcBSD можно использовать для печати на широком
спектре принтеров, от старых матричных до новейших лазерных и струйных,
без исключений, что позволяет создавать высококачественные распечатки из
используемых приложений.
pcBSD можно также сконфигурировать для работы в качестве
сервера печати в сети; в этом качестве pcBSD может получать задания
печати от множества других компьютеров, включая другие компьютеры под
управлением ОС pcBSD, хосты Windows® и Mac OS®. pcBSD будет
гарантировать печать заданий по одному и может сохранять информацию о
том, какие пользователи и машины выполняют основную часть печати,
выдавать страницы-''баннеры'', показывающие, кому принадлежит
распечатка, и многое другое.
При прочтении этого поста:
- Как конфигурировать спулер печати pcBSD.
- Как устанавливать фильтры печати для
специфической обработки определенных заданий печати, включая
преобразование поступающих на печать документов в форматы, которые
понимает принтер.
- Как включить при печати колонтитулы или выдачу
страниц-баннеров.
- Как печатать на принтеры, подключенные к другим
компьютерам.
- Как печатать на принтеры, подключенные
непосредственно к сети.
- Как задавать ограничения для принтера, включая
ограничение размера заданий печати и запрет печати для отдельных
пользователей.
- Как сохранять статистическую информацию о печати и
учитывать использование принтера.
- Как решать проблемы печати.
Для использования принтеров в ОС pcBSD вы можете настроить их
для работы с системой спулинга печати Беркли (Berkeley line printer
spooling system), также известной как система спулинга LPD. Это -
стандартная система управления принтером во pcBSD. В этой главе
представлена система спулинга LPD и описано ее конфигурирование.
LPD управляет всеми аспектами работы принтеров хоста.
Она отвечает за несколько вещей:
- Она управляет доступом к непосредственно подключенным принтерам
и принтерам, подключенным к другим хостам в сети.
- Она позволяет пользователям посылать файлы на печать; эти
данные называют заданиями.
- Она предотвращает одновременный доступ к принтеру
нескольких пользователей путем поддержки очереди для каждого принтера.
- Она позволяет печатать страницы заголовка (их также
называют баннерными или начальными страницами), чтобы пользователи могли
легко находить распечатанные задания в пачке распечаток.
- Она обеспечивает установку параметров взаимодействия для
принтеров, подключенных к последовательным портам.
- Она может отправлять задания по сети спулеру LPD на другом
хосте.
- Она может применять специальные фильтры для форматирования
заданий для печати на разных языках описания страниц или задействования
специфических возможностей принтера.
- Она учитывает использование принтера.
С помощью файла конфигурации (/etc/printcap) и за счет
предоставления специальных программ фильтрования, можно потребовать от
системы LPD выполнять все или некоторые из перечисленных выше функций на
широком спектре принтерного оборудования.
Зачем использовать спулер
Если вы - единственный пользователь системы, вы можете
спросить, зачем возиться со спулером, если управление доступом, страницы
заголовка или учет использования принтера вам не нужны. Хотя можно
обеспечить непосредственный доступ к принтеру, в любом случае следует
использовать спулер, поскольку:
LPD печатает задания в фоновом режиме; вам не придется ждать, пока
данные будут скопированы на принтер.
LPD позволяет легко пропустить задание печати через фильтры для
добавления заголовков с датой/временем или преобразования специального
формата файлов (такого как TeX DVI) в формат, который понимает принтер.
Вам не придется выполнять эти шаги вручную.
Многие свободно распространяемые и коммерческие программы,
обеспечивающие возможность печати, обычно предполагают взаимодействие со
спулером системы. Путем настройки системы спулинга вы упростите
поддержку другого программного обеспечения, которое может быть добавлено
в дальнейшем или уже установлено.
Расширенная настройка принтера
фильтр - это выполняемая программа, запускаемая
системой LPD для поддержки специфических особенностей устройства при
взаимодействии с принтером.
Когда системе LPD надо напечатать входящий в задание файл,
она запускает программу-фильтр. Стандартный входной поток фильтра
связывается с файлом, который надо распечатать, его стандартный выходной
поток -- с принтером, а стандартный поток ошибок перенаправляется в
файл регистрации ошибок (задается характеристикой lf в файле
/etc/printcap, или используется стандартное устройство /dev/console).
Запускаемый системой LPD фильтр и его аргументы зависят от
того, что указано в файле /etc/printcap, и какие аргументы указал
пользователь для задания в команде lpr(1). Например, если пользователь
ввел команду lpr -t, система LPD должна запустить фильтр troff, заданный
характеристикой tf для соответствующего принтера. Если пользователь
хочет печатать обычный текст, система должна запустить фильтр if (это
верно в большинстве случаев: подробнее см. в разделе Выходные фильтры). В
файле /etc/printcap можно задавать три вида фильтров:
Текстовый фильтр, который в документации LPD двусмысленно
называют входным фильтром, обеспечивает печать обычного текста.
Рассматривайте его как стандартный фильтр. Система LPD предполагает, что
любой принтер может по умолчанию печатать обычный текст, а на текстовый
фильтр возлагается задача обеспечить, чтобы символы забоя, табуляции
или другие специальные символы не сбивали принтер с толку. Если вы
работаете в среде, где надо учитывать использование принтера, текстовый
фильтр должен также учитывать количество напечатанных страниц, обычно,
подсчитывая количество напечатанных строк и сравнивая их с количеством
строк на страницу, поддерживаемых принтером. Текстовый фильтр
запускается со следующим списком аргументов:
имя-фильтра [-c] -wширина -lдлина -iсдвиг -n имя-пользователя -h
хост учетный-файл
где
-c
указывается, если задание послано командой lpr -l
ширина
значение из характеристики pw (page width -- ширина
страницы), указанной в файле /etc/printcap, по умолчанию -- 132
длина
значение из характеристики pl (page length -- длина
страницы), по умолчанию -- 66
сдвиг
сдвиг, заданный командой lpr -i, по умолчанию -- 0
имя-пользователя
регистрационное имя пользователя, печатающего файл
хост
имя хоста, с которого было послано задание
учетный-файл
имя учетного файла, задаваемое характеристикой af.
Фильтр преобразования преобразует специфичный формат файла в
то, что принтер может воспроизвести на бумаге. Например, данные системы
набора ditroff нельзя печатать непосредственно, но можно установить
фильтр преобразования для файлов ditroff, чтобы преобразовывать данные
ditroff в тот вид, который принтер может воспринять и напечатать. В
разделе Фильтры преобразования написано всё об этих фильтрах. Фильтры
преобразования также необходимы для учета, если предполагается учет
использования принтера. Фильтры преобразования запускаются со следующими
аргументами:
имя-фильтра -xширина-пиксела -yвысота-пиксела -n
имя-пользователя -h хост учетный-файл
где ширина-пиксела -- значение характеристики px (по
умолчанию -- 0), а высота-пиксела -- значение характеристики py (по
умолчанию -- 0).
Выходной фильтр используется только если нет текстового
фильтра или если включена выдача начальных страниц. Судя по моему опыту,
выходные фильтры используются редко. Они описаны в разделе Выходные
фильтры. У выходного фильтра есть всего два аргумента:
имя-фильтра -wширина -lдлина
которые идентичны аргументам -w и -l текстового фильтра.
Фильтры также должны завершать работу со следующим статусом
выхода:
exit 0
Если фильтр успешно напечатал файл.
exit 1
Если фильтр не смог напечатать файл, но хочет, чтобы система LPD
попыталась распечатать файл ещё раз. Система LPD перезапустит фильтр,
если его работа завершена с этим статусом.
exit 2
Если фильтр не смог напечатать файл и не хочет, чтобы система LPD
пыталась его печатать еще раз. Система LPD удалит файл.
Поставляемый в составе pcBSD текстовый фильтр
/usr/libexec/lpr/lpf использует аргументы, задающие ширину и длину
страницы для определения того, когда посылать символ прогона страницы
(form feed) и как учитывать использование принтера. Он использует
переданные в качестве аргументов имя пользователя, хост и учетный файл
для внесения учетных записей.
При поиске фильтров убедитесь, что они совместимы с системой
LPD. Если да, они должны поддерживать описанные выше списки аргументов.
Если вы планируете создавать фильтры для общего использования,
позаботьтесь о поддержке этих списков аргументов и кодов выхода.
Прием заданий с обычным текстом на PostScript®-принтеры
Если вы -- единственный пользователь компьютера и
PostScript-принтера (или принтера на основе другого языка), и вы
обещаете никогда не посылать на принтер обычный текст и никогда не
использовать возможностей различных программ, требующих посылки на
принтер обычного текста, вам можно не заботиться о том, что описано в
этом разделе.
Но, если вы хотите посылать на принтер как задания
PostScript, так и обычный текст, рекомендуется дополнить настройку
принтера. Для этого надо, чтобы текстовый фильтр определял, является ли
поступающее задание обычным текстом или программой на языке PostScript.
Все PostScript-задания должны начинаться с %! (для других языков
принтеров обратитесь к соответствующей документации). Если первые два
символа в задании -- именно эти, речь идет о PostScript, и мы можем
остальную часть задания передавать непосредственно. Если же первые два
символа в файле -- другие, фильтр будет преобразовывать текст в
PostScript и печатать результат.
Как нам это сделать?
Если вы используете последовательный принтер, хороший способ
достичь поставленной цели состоит в установке lprps. lprps -- это фильтр
для PostScript-принтера, выполняющий двустороннее взаимодействие с
принтером. Он обновляет файл состояния принтера, помещая в него
подробную информацию, выданную принтером, так что пользователи и
администраторы могут узнать, в каком именно состоянии (например, "toner
low” или "paper jam”) находится принтер. Но еще важнее, что он включает
программу psif, которая определяет, является ли входящее задание обычным
текстом, и вызывает textps (еще одну программу, поставляемую вместе с
lprps) для преобразования его в PostScript. Затем lprps посылает
преобразованное задание на принтер.
lprps входит в набор портов pcBSD (см. Набор портов). Вы,
конечно, можете загрузить, собрать и установить его самостоятельно.
После установки lprps просто укажите путь к программе psif, входящей в
состав пакета lprps. Если вы установили lprps из Коллекции Портов,
используйте следующий текст в записи для последовательного
PostScript-принтера в файле /etc/printcap: :if=/usr/local/libexec/psif:
Надо также задать характеристику rw; она требует от системы
LPD открывать принтер в режиме чтения и записи.
При использовании параллельного PostScript-принтера (что не
позволяет обеспечить двустороннее взаимодействие с принтером,
необходимое для системы lprps), можно использовать в качестве текстового
фильтра следующий скрипт командного интерпретатора:
#!/bin/sh
#
# psif - Печать PostScript или обычного текста на PostScript-принтере
# Скрипт, а НЕ версия, входящая в состав lprps
# Установлен в /usr/local/libexec/psif
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# Задание PostScript, печатать его.
#
echo "$first_line" && cat && printf "\004"
&& exit 0
exit 2
else
#
# Обычный текст, преобразовать его, а затем напечатать.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps &&
printf "\004" && exit 0
exit 2
fi
В представленном выше скрипте, textps -- отдельно
установленная программа для преобразования обычного текста в PostScript.
Можно использовать любую программу преобразования текста в PostScript.
Коллекция Портов FreeBSD включает полнофункциональную программу
преобразования текста в PostScript под названием a2ps, которую тоже
можно попробовать использовать.
Альтернативы стандартному спулеру
LPRng
Система LPRng, имя которой означает ''LPR: the Next
Generation'' (LPR: следующее поколение) -- это полностью переписанная
система PLP. Патрик Пауэл (Patrick Powell) и Джастин Мейсон (Justin
Mason) (основной специалист, занимающийся поддержкой PLP) объединили
усилия для создания системы LPRng. Основной сайт по системе LPRng - http://www.lprng.org/.
CUPS
Система CUPS (сокращение от Common UNIX Printing System)
предоставляет переносимый механизм печати для операционных систем,
основанных на UNIX®. Она была разработана компанией Easy Software
Products в качестве стандартного механизма печати для всех
производителей и пользователей UNIX. Система CUPS использует протокол
Internet Printing Protocol (IPP) для управления заданиями и очередями.
Протоколы Line Printer Daemon (LPD), Server Message Block (SMB) и
AppSocket (известный также как JetDirect) также поддерживаются, но с
меньшими возможностями. Система CUPS добавляет поиск сетевых принтеров и
опции печати на основе PostScript Printer Description (PPD), для
поддержки практической печати в UNIX. Основной сайт по системе CUPS - http://www.cups.org/.
После выполнения простого тестирования с помощью команды
lptest(1) вы можете получить один из следующих результатов вместо
корректной распечатки:
Все работает, после определенной задержки; или не выдается
распечатанная страница.
Принтер напечатал все, что нужно, но он на некоторое время
задумывался и ничего не делал. Фактически, могло потребоваться нажать
кнопку PRINT REMAINING или FORM FEED на принтере, чтобы результаты были
выданы.
Если это произошло, вероятно, принтер ждал, нет ли в задании
еще данных, прежде чем что бы то ни было печатать. Для решения этой
проблемы можно посылать в текстовом фильтре на принтер символ FORM FEED
(или любую необходимую последовательность символов). Этого обычно
достаточно, чтобы принтер немедленно распечатал любой остающийся в его
внутреннем буфере текст. Также полезно убедиться, что каждое задание
печати заканчивается полной страницей, чтобы следующее задание не
начиналось где-то с середины последней страницы предыдущего задания.
Следующий измененный скрипт командного интерпретатора
/usr/local/libexec/if-simple выдает символ прогона страницы после
посылки задания на принтер:
#!/bin/sh
#
# if-simple - Простой текстовый входной фильтр для lpd
# Установлен в /usr/local/libexec/if-simple
#
# Просто копирует stdin в stdout. Игнорирует все аргументы
фильтра.
# Выдает символ прогона страницы (\f) после печати
задания.
/bin/cat && printf "\f" && exit 0
exit 2
Принтер печатает ''лесенкой''. Вы получаете на бумаге следующее: !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456
Вы стали очередной жертвой эффекта лесенки, вызванного
различными интерпретациями того, какие символы должны обозначать новую
строку. Операционные системы UNIX®-стиля используют один символ:
ASCII-код 10, перевод строки (line feed -- LF). MS-DOS®, OS/2® и другие
используют пару символов, ASCII-код 10 и ASCII-код 13 (возврат каретки,
carriage return или CR). Многие принтеры используют соглашение MS-DOS
для представления новых строк.
При печати из pcBSD в тексте используется только символ
перевода строки. Принтер, встретив символ перевода строки, переходит на
следующую строку, но оставляет ту же горизонтальную позицию на строке
для следующего печатаемого символа. Вот зачем нужен символ возврата
каретки: чтобы перенести следующий печатаемый символ на левый край
бумаги.
Вот что ОС FreeBSD хочет от принтера:
Принтер получает CR Принтер печатает CR
Принтер получает LF Принтер печатает CR + LF
Вот несколько способов этого добиться:
Использовать переключатели конфигурации принтера или панель
управления, чтобы изменить его интерпретацию этих символов. Поищите как
это сделать в руководстве по своему принтеру.
Замечание: Если вы загружаете другие операционные системы, кроме pcBSD,
может иметь смысл переконфигурировать принтер для использования такой
интерпретации символов CR и LF, которая принята в этих операционных
системах. Затем можно использовать одно из представленных далее решений.
Заставить драйвер последовательного порта FreeBSD автоматически
преобразовывать LF в CR+LF. Конечно, это подойдет только для принтеров,
подключенных к последовательным портам. Для включения этой возможности
используйте характеристику ms# и установите режим onlcr для принтера в
файле /etc/printcap.
Послать управляющий код на принтер, заставляющий его временно
обрабатывать символы LF по-другому. Управляющие коды, которые может
поддерживать ваш принтер, поищите в руководстве своего принтера. Когда
найдете соответствующий управляющий код, измените текстовый фильтр для
посылки сначала этого кода, а затем -- задания печати.
Вот пример текстового фильтра для принтеров, понимающих
управляющие последовательности языка Hewlett-Packard PCL. Этот фильтр
заставляет принтер обрабатывать символы LF как LF и CR; затем он
посылает задание; наконец, он посылает символ прогона страницы для
выдачи последней страницы задания. Он должен работать практически со
всеми принтерами Hewlett Packard.
#!/bin/sh
#
# hpif - Простой текстовый входной фильтр для lpd для принтеров на базе
HP-PCL
# Установлен в /usr/local/libexec/hpif
#
# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
# Требует от принтера обрабатывать LF как CR+LF. Выдает страницу по
окончании.
printf "\033&k2G" && cat && printf "\033&l0H"
&& exit 0
exit 2
Вот пример файла /etc/printcap с хоста orchid. К нему через
первый параллельный порт подключен один принтер, Hewlett Packard
LaserJet 3Si, по имени teak. Для него в качестве текстового фильтра
используется представленный выше скрипт:
#
# /etc/printcap для хоста orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
Строки напечатаны одна поверх другой.
Принтер так и не перешел на следующую строку. Все строки текста были
напечатаны одна поверх другой, на одной строке.
Эта проблема ''обратна'' эффекту лесенки, описанному выше, и встречается
намного реже. Каким-то образом, символы LF, которые ОС pcBSD использует
для завершения строк, обрабатывались как символы CR и вызывали перевод
позиции печати на левый край бумаги, но не переход на следующую строку.
Используйте переключатели конфигурации принтера или панель управления
для обеспечения следующей интерпретации символов LF и CR:
Принтер получает
Принтер печатает
CR CR
LF CR + LF
Принтер теряет символы.
По ходу печати принтер не печатает несколько символов в
каждой строке. Проблема со временем может становиться все хуже, так что
теряется все больше символов. Проблема состоит в том, что принтер не
справляется с той скоростью, с которой компьютер посылает данные по
последовательной линии (эта проблема не должна возникать на принтерах,
подключенных к параллельным портам). Есть два способа решить проблему:
Если принтер поддерживает управление потоком XON/XOFF, заставить pcBSD
использовать его, указав режим ixon в характеристике ms#.
Если принтер поддерживает управление несущим потоком (carrier flow
control), укажите режим crtscts в характеристике ms#. Убедитесь, что
кабель, соединяющий принтер с компьютером, правильно распаян для
управления несущим потоком.
Напечатан мусор.
Принтер напечатал нечто похожее на случайный мусор, а не требуемый
текст.
Это, обычно, -- еще один симптом неправильных параметров взаимодействия с
последовательным принтером. Перепроверьте скорость взаимодействия в
характеристике br и установку четности в характеристике ms#; проверьте,
что принтер использует те же установки, которые заданы в файле
/etc/printcap.
Ничего не произошло.
Если ничего не произошло, проблема, вероятно, связана с pcBSD, а не с
оборудованием. Добавьте характеристику журнального файла (lf) в файл
/etc/printcap для принтера, работу с которым отлаживаете.
Например, вот запись для принтера rattan с характеристикой lf:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
Затем попытайтесь напечатать снова. Поищите в журнальном
файле (в нашем примере -- /var/log/rattan.log) возможные сообщения об
ошибках. На основе полученных сообщений попытайтесь решить проблему.
Если вы не зададите характеристику lf, система LPD использует
по умолчанию /dev/console. (FreeBSD Foundation)
также можно настроить через Центр управления КДЕ: Центр
управления > периферия > принтеры |