Установка фильтров преобразования



Поскольку фильтры преобразования представляют собой программы, не входящие в базовую поставку 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 будет использовать эти аргументы для учета распечатанных страниц.

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

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

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


Дата добавления: 2018-10-26; просмотров: 174; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!