[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по принтерам и печати


Фильтры

Определения виртуальных принтеров состоят из предопределенных и открытых (неопределенных) атрибутов фильтра. Например, для очереди ASCII системы AIX версии 4., связанной с принтером IBM 4029 LaserPrinter, предусмотрены следующие атрибуты фильтров:

Фильтры - это программы, которые располагаются в начале конвейера обработки входного потока данных, задаваемого программой piobe. Они выборочно обрабатывают информацию из этого потока. Для каждого задания можно выбрать свой фильтр, указав его в командной строке. Кроме того, фильтры можно задать в определении виртуального принтера на постоянной основе.

Для выбора фильтра для конкретного задания выполните команду qprt с флагом -f. Аргумент, который указывается с флагом -f, - это вторая буква двухбуквенного имени атрибута фильтра из определения виртуального принтера. Например, для выбора фильтра pr для задания из очереди ASCII с именем asc, связанной с принтером IBM 4029 LaserPrinter, выполните следующую команду:

qprt -Pasc -fp /etc/motd

Для того чтобы выбрать фильтр pr на постоянной основе, измените определение фильтра с помощью команды lsvirprt, указав для атрибута _f значение p. Атрибут _f задает фильтр, который будет применяться для предварительной обработки любого запущенного задания из очереди, связанной с данным определением виртуального принтера.

Если вы хотите выбрать фильтр pr, измените описание виртуального принтера с помощью команды lsvirprt и установите значение атрибута _f равным p. Атрибут _f определяет выбор фильтра, используемого для обработки всех заданий, передаваемых в очередь и связанных с этим описанием виртуального принтера.

Так как команды lp, lpr, и qprt являются клиентами команды enq (точки входа в программу буферизации), команда enq должна поддерживать флаг -f. Однако, при запуске команды enq с флагом -f будет выдано сообщение об ошибке; команда enq не поддерживает флаг -f. Это происходит из за того, что было произведено (Поток данных программы буферизации. Часть II) подключение /bin/echo поверх /bin/enq.

mount /bin/echo /bin/enq

  1. mount /bin/echo /bin/enq
  2. qprt -Pasc -fp /etc/motd
  3. umount /bin/enq

После выполнения второй команды в окне терминала, определяемом переменной среды TERM, появится следующая информация:

-P asc -o -f -o p /etc/motd

Это список аргументов, которые команда qprt передает команде enq. Они отображаются на экране, так как команда qprt сначала передает их команде echo, а не команде enq. Следующая команда эквивалентна команде, описанной выше на шаге 2:

enq -P asc -o -f -o p /etc/motd

Опция -o указывает, что флаги, предназначенные для базовой программы, должны быть переданы базовой программе. Опция -o позволяет избежать синтаксического анализа, который выполняется командой enq перед тем, как она создает файл описания задания и уведомляет процесс qdaemon о появлении нового задания.

Перед тем, как продолжить обсуждение фильтров, рассмотрим более подробно действие флага -o. Предположим, что вам нужно настроить очередь для печати диапазона строк из файла ASCII. Пусть вам нужно напечатать 35 строк из файла /usr/lpp/bos/README, чтобы отправить полученный документ по факсу или повесить его на стену. Для этого добавьте в файл /etc/qconfig следующие строки:

partial:
        device = partial
partial:
        file = FALSE
        backend = /usr/bin/partial

Пусть файл /usr/bin/partial - это сценарий оболочки с правами доступа 755, принадлежащий файлу root.printq. Содержимое этого файла может выглядеть следующим образом:

#!/bin/ksh
BEGIN=$1
END=$2
let DIFF=END-BEGIN+1
FILE=$3
/usr/bin/head -${END} ${FILE} | tail -${DIFF} | /usr/bin/qprt -Pasc

Если вам нужно напечатать строки со 189 по 223 из файла /usr/lpp/bos/README с помощью очереди partial, то введите следующую команду:

qprt -Ppartial -o 189 -o 223 /usr/lpp/bos/README

При выполнении базовой программы параметру BEGIN присваивается значение 189, параметру END - значение 223, а параметру DIFF - значение 35, равное числу строк. Параметру FILE присваивается значение /usr/lpp/bos/README. Команда head отбрасывает все строки файла /usr/lpp/bos/README после последней запрошенной строки. Полученный вывод направляется команде tail, которая выбирает из него последние 35 строк и записывает их в стандартный ввод команды qprt. Команда qprt помещает полученный файл в очередь asc.

Фильтр, преобразующий символ перевода строки в символы возврата каретки и перевода строки

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

Пользователь root с помощью команды lsvirprt может присвоить атрибуту _d значение p. Для очереди ASCII, связанной с принтером IBM 4029 LaserPrinter, это будет означать, что программа piobe будет обрабатывать задание с помощью конвейера ip. Конвейер ip предназначен для печати без преобразования, т.е. форматирующие фильтры применяют процедуру passthru() и передают входной поток данных на принтер в первоначальном виде.

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

Предположим, что приложение не позволяет вставлять символ возврата каретки в поток данных. В этом случае вы можете исправить неполадку с помощью следующего простого фильтра:

#include <stdio.h>
main(int argc, char **argv)
{
int ch ;
while (EOF != (ch = fgetc(stdin)))
 {
  switch (ch)
   {
    case 10: fputc(ch,stdout) ; 
             fputc(0x0D,stdout) ; 
             break ;
    default: fputc(ch,stdout) ;
             break ;
   }
 }
}

Откомпилируйте эту программу и назовите ее cr_mapper. Разместите ее в любом каталоге, например, в /usr/lib/lpd. Выберите владельца фильтра root.printq и права доступа 555.

Пусть у вас есть очередь ASCII с именем asc, связанная с принтером IBM 4029 LaserPrinter. Тогда вы можете выполнить команду lsvirprt для очереди asc и отформатировать атрибут фильтра f1. Появится примерно следующая информация:

Пользовательский фильтр 1
f1 =

У фильтра f1 нет значения по умолчанию, поэтому в определении правая часть отсутствует.

Измените определение атрибута f1 следующим образом:

Пользовательский фильтр 1
f1 =
 '/usr/lib/lpd/cr_mapper'

После сохранения определения фильтра f1 отформатируйте его еще раз командой lsvirprt. Появится следующая информация:

Пользовательский фильтр 1
f1 = /usr/lib/lpd/cr_mapper
 '/usr/lib/lpd/cr_mapper'

Теперь фильтр f1 можно вызывать из командной строки с помощью команд следующего вида:

qprt -Pasc -f1 имя_файла
enq -Pasc -o -f -o 1 имя_файла

Если атрибуту _d не присвоено значение p, то в команде нужно указать флаг -dp.

qprt -Pasc -dp -f1 имя_файла
enq -Pasc -o -d -o p -o -f -o 1 имя_файла

Программа cr_mapper получает символы из стандартного ввода и записывает их в стандартный вывод. При чтении символа перевода строки (шестнадцатеричное A или десятичное 10) эта программа записывает в вывод символ переноса строки и символ возврата каретки (шестнадцатеричное D).


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]