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

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

Вы когда-нибудь при попытке напечатать DVI или любой другой файл в Linux® получали сообщение "unsupported format" (неподдерживаемый формат)? Данное руководство покажет вам, как сочетать существующие программы для создания фильтра печати в CUPS для печати DVI файлов.

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, из которого была взята эта статья, или посмотрите ниже другие Ресурсы. Не забудьте оценить эту страницу.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


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