Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

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

9.4.1.4.5. Автоматизированное преобразование: альтернатива фильтрам преобразования

Все эти фильтры преобразования многое дают для среды печати, но требуют от пользователя указывать (в командной строке lpr(1)), какой именно фильтр использовать. Если пользователи не особенно разбираются в компьютерах, необходимость указывать опцию фильтра будет их раздражать. Что еще хуже, однако, при неправильном указании опции фильтрования может быть применен фильтр, не соответствующий типу файла, и принтер испортит несколько сотен страниц бумаги.

Вместо установки фильтров преобразования, можно попытаться заставить текстовый фильтр (поскольку он применяется по умолчанию) определять тип файла, который его попросили напечатать, и затем автоматически вызывать соответствующий фильтр преобразования. В этом могут помочь утилиты вроде file. Конечно, будет сложно различать некоторые типы файлов — и, конечно же, можно задавать фильтры преобразования только для них.

В наборе портов FreeBSD есть текстовый фильтр, выполняющий автоматическое преобразование; это apsfilter. Он может выявлять обычный текст, PostScript и файлы DVI, выполнять соответствующие преобразования и печатать результат.





Дата публикования: 2015-01-10; Прочитано: 309 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...