Совет по Linux

Печать файлов DVI при помощи CUPS

Как создать фильтр печати CUPS DVI для Linux

Comments

Серия контента:

Этот контент является частью # из серии # статей: Совет по Linux

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Совет по Linux

Следите за выходом новых статей этой серии.

Common UNIX Printing System (CUPS) -- спулер печати, используемый сегодня на многих Linux и UNIX® системах. Для форматирования и печати различных типов файлов на различных принтерах можно использовать фильтры, входящие в поставку CUPS. Но что делать, если CUPS не поддерживает тип файла, который вы хотите напечатать? Во-первых, вы можете преобразовать файл во что-нибудь, что CUPS напечатает, например, PostScript или PDF. Или создать такой фильтр, что печатная система CUPS распознает ваш файл и напечатает его правильно. В этой статье, взятой из учебника LPI exam 102 prep: Printing, показано, как создать простой фильтр.

Типы MIME и CUPS

Итак, как CUPS решает, какой фильтр применить для форматирования конкретного типа файла? При печати файла CUPS использует типы MIME (Multipurpose Internet Mail Extensions) для определения подходящего фильтра-преобразователя. Обратите внимание, что другие пакеты программ печати могут применять механизм системного кода, который используется, например, командой file. Подробности смотрите в руководстве по командам file или magic.

Типы MIME используются для пересылки различных файлов в виде вложений к письму. Они состоят из типа, например, текст или изображение, и подтипа, как html, postscript, gif или jpeg. Тип и подтип отделяются друг от друга точкой с запятой (;). В необязательных параметрах может быть такая информация, как кодировка или язык. CUPS для определения типа файла использует правила из /etc/cups/mime.types, а затем из перечисленных в /etc/cups/conv.types фильтров берет подходящий для данного типа MIME. Типы MIME зарегистрированы в IANA, Internet Assigned Numbers Authority. Если вам нужен незарегистрированный тип, прибавьте к подтипу префикс 'x-'. В Листинге 1 приведены примеры некоторых типов изображений.

Листинг 1. Некоторые записи типов MIME из /etc/cups/mime.types
image/gif                  gif string(0,GIF87a) string(0,GIF89a)
image/png                  png string(0,<89>PNG)
image/jpeg                 jpeg jpg jpe string(0,<FFD8FF>) &&\
 (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
image/tiff                 tiff tif string(0,MM) string(0,II)
image/x-photocd            pcd string(2048,PCD_IPI)
image/x-portable-anymap    pnm

Рассмотрение формата записей выходит за рамки этой статьи. Посмотрите файлы /usr/share/mime/magic или /usr/share/file/magic, чтобы получить некоторое представление о том, как системные коды используются для идентификации файлов.

После определения MIME типа файла с помощью /etc/cups/mime.convs находится подходящий фильтр. В каждой строке этого файла содержится четыре записи: исходный и конечный тип MIME, затраты и название фильтра. Использоваться будет фильтр с наименьшими затратами. В Листинге 2 приводится несколько примеров.

Листинг 2. Фильтры из /etc/cups/mime.convs
text/plain              application/postscript  33      texttops
text/html               application/postscript  33      texttops
image/gif               application/vnd.cups-postscript 66      imagetops
image/png               application/vnd.cups-postscript 66      imagetops
image/jpeg              application/vnd.cups-postscript 66      imagetops
image/tiff              application/vnd.cups-postscript 66      imagetops
image/x-bitmap          application/vnd.cups-postscript 66      imagetops

Если подходящий фильтр не будет найден, то ваша попытка напечатать файл приведет к сообщению об ошибке. Если вы используете какой-то другой демон печати, не CUPS, то рискуете получить неожиданный вывод. Листинг 3 показывает, как это выглядит на примере файла DVI (нормальный вывод из TeX и LaTex).

Листинг 3. Печать файла неподдерживаемого типа
[ian@attic4 ~]$ lpr samp1.dvi
lpr: Unsupported format 'application/octet-stream'!

Фильтр DVI для печати с CUPS

К счастью, пакет tetex с TeX и LaTeX также предоставляет утилиту dvips для преобразования DVI в PostScript. К несчастью, она не работает как фильтр, потому что не знает, как поддерживать аргументы, которые необходимы фильтру CUPS, а именно, id задания, пользователя, название задания, число копий и опции задания. Первый фильтр в последовательности фильтров также будет иметь дополнительный параметр, имя файла, если ввод происходит из файла.

Решением может быть создание wrapper-скрипта, который станет фильтром. Команда dvips не принимает ввод из stdin, так что скрипту, возможно потребуется создать временный файл и копировать stdin туда перед вызовом dvips. Возможный вариант скрипта приведен в Листинге 4.

Листинг 4. Скрипт фильтра CUPS DVI в PostScript
#!/bin/bash
# CUPS filter to process DVI files using dvips
# Create a sandbox for working if input on stdin
if [ $# -lt 6  ]; then
 sandbox=${TMPDIR-/tmp}/cups-dvitops.$$
 (umask 077 && mkdir $sandbox) || {
 echo "Cannot create temporary directory! Exiting." 1>&2
        exit 1
    }
    fn="$sandbox/cups-dvitops.$$"
    cat > "$fn"
else
    fn="$6"
fi
# Call dvips quietly, securely and with output to stdout
dvips -R -q -o - "$fn"
# Erase sandbox if we created one
if [ $# -lt 6  ]; then
    rm -rf  "$sandbox"
fi

Напомню, что CUPS использует два файла из /etc/cups, чтобы определить тип MIME и фильтр, который потребуется. Эти файлы будут перезаписываться всякий раз при переустановке или обновлении CUPS. К счастью, CUPS будет читать все файлы с расширением .types или .convs, неважно запускается он или перезапускается. Так что вам потребуется создать пару файлов для нового фильтра, например, /etc/cups/dvitops.types и /etc/cups/dvitops.convs. В листинге 5 показано два конфигурационных файла для DVI фильтра.

Листинг 5. Конфигурационные файлы для фильтра CUPS dvitops
[ian@attic4 ~]$ cat /etc/cups/dvitops.types
# Local MIME definition for DVI files
application/x-dvi dvi string(0,<F702>)
[ian@attic4 ~]$ cat /etc/cups/dvitops.convs
# Local DVI to PostScript filter for CUPS
application/x-dvi application/postscript 50 dvitops

В листинге 5 говорится, что DVI файлы идентифицируются по наличию шестнадцатеричных чисел F7 и 02 в двух первых позициях, и что такие файлы должны обрабатываться фильтром dvitopsr.

Далее, как root, скопируйте приведенный выше скрипт в /usr/lib/cups/filter/dvitops и убедитесь, что все могут его читать и выполнять (-rwxr-xr-x). Имя, которое вы дадите скрипту, должно соответствовать тому, которое написано выше в файле /etc/cups/dvitops.convs. Если вы запускаете SELinux в принудительном режиме, то также необходимо выполнить restorecon в каталоге /usr/lib/cups/filter, чтобы обновить контексты безопасности. Иначе ваша команда lpr как будто бы заработает, но файл напечатан не будет.

Наконец, чтобы перезапустить CUPS воспользуйтесь опцией перезапуска в скрипте cups из /etc/rc.d/init.d или /etc/init.d и примените свой новый фильтр.

Если у вас более старый спулер печати, то, вероятно, вы будете применять либо magicfilter или apsfilter в качестве исходных фильтров для преобразования различных входных файлов в PostScript при печати на PostScript принтере либо Ghostscript в случае не-PostScript принтера.

Узнайте больше

Если вы хотите узнать больше о печати в Linux, почитайте руководство LPI exam 102 prep: Printing, из которого была взята эта статья, или посмотрите ниже другие Ресурсы. Не забудьте оценить эту страницу.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=217300
ArticleTitle=Совет по Linux: Печать файлов DVI при помощи CUPS
publish-date=02072007