Традиционная настройка lpd заканчивается тем, что можно создавать очереди файлов и печатать их. Она не обращает никакого внимания на то понимает ли принтер эти файлы или нет, и скорее всего, не позволит получить приемлимую печать. Тем не менее, это первый шаг к пониманию.
Для добавления очереди печати к lpd, вы должны добавить запись в файл /etc/printcap, и создать новую буферную директорию в каталоге/var/spool/lpd.
Запись в файле /etc/printcap выглядит примерно так:
# ЛОКАЛЬНЫЙ djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
Это определяет принтер, с именами lp, dj, или deskjet, его спул размещается в
директории /var/spool/lpd/dj, без ограничения максимального размера задания,
который печатает на устройство /dev/lp0, и который не имеет страницу с
заголовком (с именем человека, который печатает и т.п. информацией) добавленную
в начало задания печати.
Вышеприведенный пример выглядит очень простым, но он имеет ловушку - хотя вы
посылаете файлы, которые DeskJet 500 может понимать, этот DeskJet будет печатать
странные вещи. Например посыл обычного текстового файла Unix приведет к тому,
что deskjet будет интерпретировать символы новой строки как символы, и выдаст:
This is line one.
This is line two.
This is line three.
Печать файла PostScript на этот принтер выдаст великолепный листинг команд PostScript, напечатанных с этим "лестничным эффектом", а не полезный вывод.
Очевидно требуется что-то сделать, и это является назначением фильтрации. Более наблюдательные из тех кто читал справочную страницу printcap должны были заметить атрибуты принтера if и of. if, или входной фильтр - это все что нам нужно, чтобы заставить принтер печатать то, что нам нужно.
Если мы напишем маленький скрипт, названный filter, который добавляет возврат
каретки до символа новой строки, то лестничный эффект будет ликвидирован. Так
что мы добавим строку if в нашу, вышеприведенную запись в printcap:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
Простой скрипт может выглядеть так:
#!perl
# Предыдущая строка должна содержать полный путь к perl
# Скрипт должен быть исполнимым: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# Вы можете также добавить в конец прогон страницы: print "\f";
Если мы используем приведенный выше пример, у нас появится принтер на котором мы сможем печатать обычные текстовые файлы Unix и получать осмысленные результаты. (Конечно мы можем написать этот фильтр четырьмя миллионами лучших способов, но этот более иллюстративный. Вы можете попытаться сделать это более эффективно).
Проблема в том, что печать простого текста не является злободневной. Чаще всего нам нужна печать PostScript и других типов форматированого и графического вывода. Впрочем это легко сделать. Метод является просто расширением вышеприведенного фильтра для исправления перевода строки. Если вы напишите фильтр, который может воспринимать произвольные типы файлов как ввод и производить вывод для DeskJet для каждого случая, тогда мы безусловно получим "умный" спулер принтера.
Такой фильтр называется magic-фильтр. Не утруждайте себя написанием фильтра, до тех пор, пока они не будут печатать странные вещи - в сети уже существует много хорошо написанных фильтров.
Есть правда ловушка для таких фильтров: некоторые старые версии lpd не запускают фильтр if для удаленных принтеров, а некоторые запускают. Версии lpd используемые в современных дистрибутивах Linux и FreeBSD запускают указанный фильтр; большинство коммерческих юниксов до сих пор поставляются с lpd, которые не запускают фильтр для удаленных принтеров.
Возможно ваш дистрибутив Linux имеет утилиту для настройки принтера, которая сделает всю настройку очень простой. И в самом деле, во всех основных дистрибутивах существуют утилиты для настройки принтера. А если вы используете оконный менеджер - то вполне вероятно, что в нем имеется графическая утилита для
настройки (например в KDE). А разработчики CUPS пошли еще дальше - в качестве менеджера они предоставляют пользователю WEB-интерфейс, что дает возможность конфигурировать устройство печати как угодно и откуда угодно.