После завершения простой настройки, описанной в разделе
Простая настройка принтера
, прежде всего, вам может потребоваться установить фильтры преобразования для любимых форматов файлов (кроме обычных текстов ASCII).
10.4.1.4.1. Зачем устанавливать фильтры преобразования?
Фильтры преобразования упрощают печать различного рода файлов. В качестве примера, предположим, что активно используется издательская система TeX и имеется PostScript®-принтер. При каждой генерации DVI-файла из TeX, мы не можем печатать его непосредственно, пока не преобразуем в PostScript®. Для этого используется такая последовательность команд:
% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps
Установив фильтр преобразования для файлов DVI, мы можем не конвертировать файл каждый раз вручную, возложив эту задачу на систему LPD. Теперь при каждом получении DVI-файла нас от его распечатки отделяет только один шаг:
% lpr -d seaweed-analysis.dvi
Для каждой из опций преобразования, которая должна поддерживаться принтером, установите
фильтр преобразования
и укажите его полное имя в файле
/etc/printcap
. Фильтр преобразования аналогичен текстовому фильтру для простой настройки принтера (см. раздел
Установка текстового фильтра
), но вместо печати обычного текста он преобразует файл в формат, который может понять принтер.
10.4.1.4.2. Какие фильтры преобразования следует устанавливать?
Устанавливать надо те фильтры преобразования, которые предполагается использовать. Если вы часто печатаете файлы DVI, значит, фильтр преобразования DVI необходим. Если вам часто приходится печатать результаты работы troff, может потребоваться фильтр troff.
В следующей таблице представлены фильтры, с которыми работает система LPD, их соответствующие характеристики для файла
/etc/printcap
, а также способ их вызова в команде
lpr
:
В нашем примере использование
lpr -d
означает, что для принтера должна быть задана характеристика
df
в записи в файле
/etc/printcap
.
Вопреки мнению многих, форматы вроде текста на языке FORTRAN и plot, вероятно, устарели. У себя на машине вы можете дать новые значения этим или любым другим опциям форматирования, установив соответствующие специализированные фильтры. Например, пусть необходимо напрямую печатать файлы Printerleaf (файлы настольной издательской системы Interleaf), но вообще вы не собираетесь печатать файлы типа plot. Можно установить фильтр преобразования Printerleaf в качестве значения характеристики
gf
и научить своих пользователей, что команда
lpr -g
означает "печатать файлы Printerleaf".
10.4.1.4.3. Установка фильтров преобразования
Поскольку фильтры преобразования представляют собой программы, не входящие в базовую поставку FreeBSD, их, видимо, надо помещать в каталоге
/usr/local
. Популярное местонахождение - каталог
/usr/local/libexec
, поскольку эти фильтры являются специализированными программами для выполнения системой LPD; обычным пользователям никогда не понадобится их выполнять.
Для включения фильтра преобразования, укажите его полное имя в качестве значения соответствующей характеристики для принтера в файле
/etc/printcap
.
В качестве примера, давайте добавим фильтр преобразования DVI в запись для принтера
bamboo
. Вот опять пример файла
/etc/printcap
, с новой характеристикой
df
для принтера
bamboo
.
#
# /etc/printcap для хоста rose - добавлен фильтр df для bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Фильтр DVI - скрипт командного интерпретатора по имени
/usr/local/libexec/psdf
. Вот его текст:
#!/bin/sh
#
# psdf - фильтр принтера, преобразующий DVI в PostScript
# Установлен в /usr/local/libexec/psdf
#
# Вызывается системой lpd при выполнении пользователем команды lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
Это скрипт выполняет команду
dvips
в режиме фильтрования (аргумент
-f
) входного потока, представляющего собой задание для печати. Затем запускается фильтр PostScript®-принтера
lprps
(см. раздел
Прием заданий с обычным текстом на PostScript®-принтеры
) с аргументами, переданными системой LPD этому скрипту. Команда
lprps
будет использовать эти аргументы для учета распечатанных страниц.
10.4.1.4.4. Дополнительные примеры фильтров преобразования
Поскольку нет фиксированного набора шагов для установки фильтров преобразования, я просто представлю дополнительные примеры. Используйте их в качестве руководства при создании собственных фильтров. Используйте их непосредственно, если нужно.
Следующий пример фильтра преобразует растровый файл (точнее, GIF-файл) для печати на принтере Hewlett Packard LaserJet III-Si:
#!/bin/sh
#
# hpvf - Преобразовать GIF-файлы в HP/PCL и напечатать
# Установлен в /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
Он работает путем преобразования GIF-файла в переносимый формат anymap, его - в переносимый формат graymap, затем - в переносимый bitmap, а уже его - в данные, подходящие для LaserJet/PCL.
Вот файл
/etc/printcap
с записью для принтера, в которой используется представленный выше фильтр:
#
# /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:\
:vf=/usr/local/libexec/hpvf:
Следующий скрипт является фильтром преобразования для печати данных troff, получаемых из системы набора groff, на PostScript®-принтере
bamboo
:
#!/bin/sh
#
# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
# Установлен в /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
Представленный выше скрипт снова использует команду
lprps
для взаимодействия с принтером. Если принтер подключен к параллельному порту, придется использовать следующий скрипт:
#!/bin/sh
#
# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
# Установлен в /usr/local/libexec/pstf
#
exec grops
Вот и все. Вот какую запись надо добавить в файл
/etc/printcap
, чтобы включить этот фильтр:
:tf=/usr/local/libexec/pstf:
Вот пример, который пригодится старым специалистам по языку FORTRAN. Это фильтр для печати текста программы на языке FORTRAN на любом принтере, который может непосредственно печатать обычный текст. Мы установим его для принтера
teak
:
#!/bin/sh
#
# hprf - Фильтр текста на языке FORTRAN для LaserJet 3si:
# Установлен в /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\033&l0H" &&
exit 0
exit 2
Надо добавить следующую строку к записи в файле
/etc/printcap
для принтера
teak
, чтобы включить этот фильтр:
:rf=/usr/local/libexec/hprf:
Перейдем к последнему, более сложному примеру. Мы добавим фильтр DVI для уже использовавшегося принтера LaserJet по имени
teak
. Сначала простая часть: изменить файл
/etc/printcap
, указав местонахождение фильтра DVI:
:df=/usr/local/libexec/hpdf:
А теперь - часть посложнее: создать фильтр. Для этого нам понадобится программа преобразования DVI в LaserJet/PCL. Набор портов FreeBSD (см.
Набор портов
) содержит одну: соответствующий пакет называется
dvi2xx
. Установка этого пакета дает нам необходимую программу,
dvilj2p
, которая преобразует DVI в коды, подходящие для LaserJet IIp, LaserJet III и LaserJet 2000.
Команда
dvilj2p
требует создания достаточно сложного фильтра
hpdf
, поскольку она не может читать стандартный входной поток. Она хочет работать с именем файла. Что еще хуже, имя файла должно завершаться расширением
.dvi
, так что использование стандартного входного потока
/dev/fd/0
тоже проблематично. Мы можем обойти эту проблему, создав (символическую) связь (с именем, завершающимся суффиксом
.dvi
) с устройством
/dev/fd/0
, тем самым, заставив команду
dvilj2p
читать из стандартного входного потока.
Единственная оставшаяся проблема состоит в том, что мы не можем создавать временную связь в каталоге
/tmp
. Символьные связи принадлежат пользователю и группе
bin
. Фильтр же работает от имени пользователя
daemon
. А у каталога
/tmp
установлен sticky bit. Фильтр сможет создать связь, но не сможет почистить за собой и удалить ее, поскольку связь будет принадлежать другому пользователю.
Вместо этого, фильтр будет создавать символическую связь в текущем рабочем каталоге, которым является каталог спулинга (задаваемый характеристикой
sd
в файле
/etc/printcap
). Это отличное место для выполнения фильтрами своих действий, особенно потому, что (иногда) в каталоге спулинга места больше, чем в
/tmp
.
Вот, наконец, и сам фильтр:
#!/bin/sh
#
# hpdf - Печать данных DVI на принтере HP/PCL
# Установлен в /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Определяем функцию для удаления временных файлов. Они существуют
# в текущем каталоге - в каталоге спулинга для принтера.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Определяем функцию для обработки критических ошибок: напечатать заданное
# сообщение и выйти с кодом 2. Код выхода 2 сообщает системе LPD, что не
# надо повторно пытаться печатать задание.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# Если пользователь удаляет задание, система LPD будет посылать сигнал SIGINT,
# поэтому перехватываем SIGINT (и пару других сигналов), чтобы убрать за собой.
#
trap cleanup 1 2 15
#
# Гарантируем, что не конфликтуем с существующими файлами.
#
cleanup
#
# Связываем входной файл DVI со стандартным входным потоком (файлом для печати).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Заменяем LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Преобразуем и печатаем. Значение, возвращаемое программой dvilj2p, не надежно,
# так что мы его игнорируем.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Убираем за собой и завершаем работу
#
cleanup
exit 0
10.4.1.4.5. Автоматизированное преобразование: альтернатива фильтрам преобразования
Все эти фильтры преобразования многое дают для среды печати, но требуют от пользователя указывать (в командной строке
lpr(1)
), какой именно фильтр использовать. Если пользователи не особенно разбираются в компьютерах, необходимость указывать опцию фильтра будет их раздражать. Что еще хуже, однако, при неправильном указании опции фильтрования может быть применен фильтр, не соответствующий типу файла, и принтер испортит несколько сотен страниц бумаги.
Вместо установки фильтров преобразования, можно попытаться заставить текстовый фильтр (поскольку он применяется по умолчанию) определять тип файла, который его попросили напечатать, и затем автоматически вызывать соответствующий фильтр преобразования. В этом могут помочь утилиты вроде
file
. Конечно, будет сложно различать
некоторые
типы файлов - и, конечно же, можно задавать фильтры преобразования только для них.
В наборе портов FreeBSD есть текстовый фильтр, выполняющий автоматическое преобразование; это
apsfilter
. Он может выявлять обычный текст, PostScript® и файлы DVI, выполнять соответствующие преобразования и печатать результат.