Руководство FreeBSD

Дополнительные примеры фильтров преобразования


Поскольку нет фиксированного набора шагов для установки фильтров преобразования, я просто представлю дополнительные примеры. Используйте их в качестве руководства при создании собственных фильтров. Используйте их непосредственно, если нужно.

Следующий пример фильтра преобразует растровый файл (точнее, 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

Содержание раздела