Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Как уже упоминалось, фильтр — это выполняемая программа, запускаемая системой 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 удалит файл.
Поставляемый в составе FreeBSD текстовый фильтр /usr/libexec/lpr/lpf использует аргументы, задающие ширину и длину страницы для определения того, когда посылать символ прогона страницы (form feed) и как учитывать использование принтера. Он использует переданные в качестве аргументов имя пользователя, хост и учетный файл для внесения учетных записей.
При поиске фильтров убедитесь, что они совместимы с системой LPD. Если да, они должны поддерживать описанные выше списки аргументов. Если вы планируете создавать фильтры для общего использования, позаботьтесь о поддержке этих списков аргументов и кодов выхода.
9.4.1.2. Прием заданий с обычным текстом на PostScript®-принтеры
Если вы — единственный пользователь компьютера и PostScript-принтера (или принтера на основе другого языка), и вы обещаете никогда не посылать на принтер обычный текст и никогда не использовать возможностей различных программ, требующих посылки на принтер обычного текста, вам можно не заботиться о том, что описано в этом разделе.
Но, если вы хотите посылать на принтер как задания PostScript, так и обычный текст, рекомендуется дополнить настройку принтера. Для этого надо, чтобы текстовый фильтр определял, является ли поступающее задание обычным текстом или программой на языке PostScript. Все PostScript-задания должны начинаться с %! (для других языков принтеров обратитесь к соответствующей документации). Если первые два символа в задании — именно эти, речь идет о PostScript, и мы можем остальную часть задания передавать непосредственно. Если же первые два символа в файле — другие, фильтр будет преобразовывать текст в PostScript и печатать результат.
Как нам это сделать?
Если вы используете последовательный принтер, хороший способ достичь поставленной цели состоит в установке lprps. lprps — это фильтр для PostScript-принтера, выполняющий двустороннее взаимодействие с принтером. Он обновляет файл состояния принтера, помещая в него подробную информацию, выданную принтером, так что пользователи и администраторы могут узнать, в каком именно состоянии (например, toner low или paper jam) находится принтер. Но еще важнее, что он включает программу psif, которая определяет, является ли входящее задание обычным текстом, и вызывает textps (еще одну программу, поставляемую вместе с lprps) для преобразования его в PostScript. Затем lprps посылает преобразованное задание на принтер.
lprps входит в набор портов FreeBSD (см. Набор портов). Вы, конечно, можете загрузить, собрать и установить его самостоятельно. После установки 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, которую тоже можно попробовать использовать.
Дата публикования: 2015-01-10; Прочитано: 271 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!