diff options
Diffstat (limited to 'ru_RU.KOI8-R/books/handbook/printing/chapter.sgml')
-rw-r--r-- | ru_RU.KOI8-R/books/handbook/printing/chapter.sgml | 4853 |
1 files changed, 4853 insertions, 0 deletions
diff --git a/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml b/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml new file mode 100644 index 0000000000..ebeb75e8aa --- /dev/null +++ b/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml @@ -0,0 +1,4853 @@ +<!-- + The FreeBSD Russian Documentation Project + + $FreeBSD$ + $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml,v 1.15 2006/06/25 08:59:40 marck Exp $ + + Original revision: 1.96 +--> + +<chapter id="printing"> + <chapterinfo> + <authorgroup> + <author> + <firstname>Sean</firstname> + <surname>Kelly</surname> + <contrib>Написал </contrib> + </author> + <!-- 30 Sept 1995 --> + </authorgroup> + <authorgroup> + <author> + <firstname>Jim</firstname> + <surname>Mock</surname> + <contrib>Реструктурировал и обновил </contrib> + <!-- Mar 2000 --> + </author> + </authorgroup> + <authorgroup> + <author> + <firstname>Валерий</firstname> + <surname>Кравчук</surname> + <contrib>Перевод на русский язык: </contrib> + </author> + </authorgroup> + </chapterinfo> + + <title>Печать</title> + + <sect1 id="printing-synopsis"> + <title>Краткий обзор</title> + <indexterm><primary>система спулинга LPD</primary></indexterm> + <indexterm><primary>печать</primary></indexterm> + + <para>FreeBSD можно использовать для печати на широком спектре принтеров, от + старых матричных до новейших лазерных, без исключений, что позволяет + создавать высококачественные распечатки из используемых приложений.</para> + + <para>FreeBSD можно также сконфигурировать для работы в качестве сервера + печати в сети; в этом качестве FreeBSD может получать задания печати от множества + других компьютеров, включая другие компьютеры под управлением ОС FreeBSD, хосты &windows; + и &macos;. FreeBSD будет гарантировать печать заданий по одному и может сохранять + информацию о том, какие пользователи и машины выполняют основную часть печати, + выдавать страницы-<quote>баннеры</quote>, показывающие, кому принадлежит распечатка, + и многое другое.</para> + + <para>При прочтении этой главы вы узнаете:</para> + + <itemizedlist> + <listitem> + <para>Как конфигурировать спулер печати FreeBSD.</para> + </listitem> + + <listitem> + <para>Как устанавливать фильтры печати для специфической обработки определенных + заданий печати, включая преобразование поступающих на печать документов в + форматы, которые понимает принтер.</para> + </listitem> + + <listitem> + <para>Как включить при печати колонтитулы или выдачу страниц-баннеров.</para> + </listitem> + + <listitem> + <para>Как печатать на принтеры, подключенные к другим компьютерам.</para> + </listitem> + + <listitem> + <para>Как печатать на принтеры, подключенные непосредственно к сети.</para> + </listitem> + + <listitem> + <para>Как задавать ограничения для принтера, включая ограничение + размера заданий печати и запрет печати для отдельных пользователей.</para> + </listitem> + + <listitem> + <para>Как сохранять статистическую информацию о печати и учитывать использование + принтера.</para> + </listitem> + + <listitem> + <para>Как решать проблемы печати.</para> + </listitem> + </itemizedlist> + + <para>Прежде чем читать эту главу, вы должны:</para> + + <itemizedlist> + <listitem> + <para>Знать, как сконфигурировать и установить новое ядро + (<xref linkend="kernelconfig">).</para> + </listitem> + </itemizedlist> + </sect1> + + <sect1 id="printing-intro-spooler"> + <title>Введение</title> + + <para>Для использования принтеров в ОС FreeBSD вы можете настроить их для + работы с системой спулинга печати Беркли (Berkeley line printer spooling system), + также известной как система спулинга <application>LPD</application>. + Это — стандартная система управления принтером во FreeBSD. В этой главе + представлена система спулинга <application>LPD</application> и описано + ее конфигурирование.</para> + + <para>Если вы уже знакомы с <application>LPD</application> или другой + системой спулинга печати, вы можете сразу перейти к разделу <link + linkend="printing-intro-setup">Базовая настройка</link>.</para> + + <para><application>LPD</application> управляет всеми аспектами работы принтеров + хоста. Она отвечает за несколько вещей:</para> + + <itemizedlist> + <listitem> + <para>Она управляет доступом к непосредственно подключенным принтерам и + принтерам, подключенным к другим хостам в сети.</para> + </listitem> + + <indexterm><primary>задания печати</primary></indexterm> + <listitem> + <para>Она позволяет пользователям посылать файлы на печать; эти + данные + называют <emphasis>заданиями</emphasis>.</para> + </listitem> + + <listitem> + <para>Она предотвращает одновременный доступ к принтеру нескольких + пользователей путем поддержки <emphasis>очереди</emphasis> для каждого + принтера.</para> + </listitem> + + <listitem> + <para>Она позволяет печатать <emphasis>страницы заголовка</emphasis> (их также + называют <emphasis>баннерными</emphasis> или <emphasis>начальными</emphasis> + страницами), чтобы пользователи могли легко находить распечатанные задания + в пачке распечаток.</para> + </listitem> + + <listitem> + <para>Она обеспечивает установку параметров взаимодействия для принтеров, + подключенных к последовательным портам.</para> + </listitem> + + <listitem> + <para>Она может отправлять задания по сети спулеру + <application>LPD</application> на другом хосте.</para> + </listitem> + + <listitem> + <para>Она может применять специальные фильтры для форматирования заданий + для печати на разных языках описания страниц или задействования специфических + возможностей принтера.</para> + </listitem> + + <listitem> + <para>Она учитывает использование принтера.</para> + </listitem> + </itemizedlist> + + <para>С помощью файла конфигурации + (<filename>/etc/printcap</filename>) и за счет предоставления специальных + программ фильтрования, можно потребовать от системы <application>LPD</application> + выполнять все или некоторые из перечисленных выше функций на широком + спектре принтерного оборудования.</para> + + <sect2 id="printing-intro-why"> + <title>Зачем использовать спулер</title> + + <para>Если вы — единственный пользователь системы, вы можете спросить, + зачем возиться со спулером, если управление доступом, + страницы заголовка или учет использования принтера вам не нужны. Хотя можно + обеспечить непосредственный доступ к принтеру, в любом случае следует + использовать спулер, поскольку:</para> + + <itemizedlist> + <listitem> + <para><application>LPD</application> печатает задания в фоновом режиме; + вам не придется ждать, пока данные будут скопированы на принтер.</para> + </listitem> + + <indexterm><primary>&tex;</primary></indexterm> + <listitem> + <para><application>LPD</application> позволяет легко пропустить + задание печати через фильтры для добавления заголовков с + датой/временем или преобразования специального формата файлов + (такого как &tex; DVI) в формат, который понимает принтер. + Вам не придется выполнять эти шаги вручную.</para> + </listitem> + + <listitem> + <para>Многие свободно распространяемые и коммерческие программы, + обеспечивающие возможность печати, обычно предполагают + взаимодействие со спулером системы. Путем настройки + системы спулинга вы упростите поддержку другого + программного обеспечения, которое может быть добавлено + в дальнейшем или уже установлено.</para> + </listitem> + </itemizedlist> + </sect2> + </sect1> + + <sect1 id="printing-intro-setup"> + <title>Основная настройка</title> + + <para>Для использования принтеров с системой спулинга + <application>LPD</application>, необходимо настроить как сам + принтер, так и программное обеспечение + <application>LPD</application>. Этот документ описывает два уровня + настройки:</para> + + <itemizedlist> + <listitem> + <para>См. раздел <link linkend="printing-simple">Простая настройка + принтера</link>, чтобы узнать, как подключить принтер, + объяснить <application>LPD</application>, как с ним + взаимодействовать, и отправлять на принтер простые текстовые + файлы.</para> + </listitem> + + <listitem> + <para>См. раздел <link linkend="printing-advanced">Расширенная + настройка принтера</link>, чтобы узнать, как печатать файлы + множества специальных форматов, как печатать страницы заголовка, + печатать по сети, управлять доступом к принтерам и учитывать + использование принтера.</para> + </listitem> + </itemizedlist> + + <sect2 id="printing-simple"> + <title>Простая настройка принтера</title> + + <para>В этом разделе описано, как сконфигурировать принтер + и программное обеспечение <application>LPD</application> для + использования принтера. Здесь рассматриваются следующие вопросы:</para> + + <itemizedlist> + <listitem> + <para>В разделе <link linkend="printing-hardware">Настройка + оборудования</link> представлены советы по подключению + принтера к порту компьютера.</para> + </listitem> + + <listitem> + <para>В разделе <link linkend="printing-software">Настройка + программного обеспечения</link> показано, как настроить + файл конфигурации спулера <application>LPD</application> + (<filename>/etc/printcap</filename>).</para> + </listitem> + </itemizedlist> + + <para>Если вы настраиваете принтер, использующий для принятия + заданий печати сетевой протокол, вместо локальных интерфейсов + компьютера, см. раздел + <link linkend="printing-advanced-network-net-if">Принтеры с + сетевыми интерфейсами</link>.</para> + + <para>Хотя этот раздел и назван <quote>Простая настройка + принтера</quote>, это, на самом деле, достаточно сложно. + Заставить принтер работать с компьютером и спулером + <application>LPD</application> — самая сложная часть. + Расширенные опции, вроде выдачи страниц заголовков и учета + использования, установить несложно, как только принтер + заработает.</para> + + <sect3 id="printing-hardware"> + <title>Настройка оборудования</title> + + <para>В этом разделе описаны различные способы подключения + принтера к ПК. Рассматриваются различные порты и кабели, а + также параметры конфигурации ядра, которые может потребоваться + установить, чтобы ОС FreeBSD могла взаимодействовать с + принтером.</para> + + <para>Если вы уже подключили ваш принтер и успешно печатали на + него в другой операционной системе, можете перейти к разделу + <link linkend="printing-software">Настройка программного + обеспечения</link>.</para> + + <sect4 id="printing-ports"> + <title>Порты и кабели</title> + + <para>Принтеры, которые продаются сегодня для использования на ПК, + обычно поддерживают один или несколько из следующих + интерфейсов:</para> + + <itemizedlist> + <indexterm> + <primary>принтеры</primary> + <secondary>последовательные</secondary> + </indexterm> + <listitem> + <para><emphasis>Последовательные</emphasis> интерфейсы, также + известные как RS-232, или COM-порты, используют + для посылки данных на принтер последовательный порт + компьютера. Последовательные интерфейсы широко + распространены в компьютерной индустрии, кабели для них легко + найти и просто сделать. Для последовательных интерфейсов + иногда нужны специальные кабели, и для их использования может + потребоваться настраивать достаточно сложные опции + взаимодействия. Большинство последовательных портов ПК имеют + максимальную скорость передачи 115200 бит/сек, поэтому + печатать через них большие графические задания + неудобно.</para> + </listitem> + + <indexterm> + <primary>принтеры</primary> + <secondary>параллельные</secondary> + </indexterm> + <listitem> + <para><emphasis>Параллельные</emphasis> интерфейсы используют + параллельный порт компьютера для посылки данных на принтер. + Параллельные интерфейсы широко распространены на рынке ПК + и работают быстрее, чем последовательные RS-232. + Кабели легко найти, но сделать самостоятельно сложнее. При + использовании параллельных интерфейсов опции взаимодействия + обычно задавать не надо, что делает их конфигурирование + существенно проще.</para> + + <indexterm> + <primary>centronics</primary> + <see>параллельные принтеры</see> + </indexterm> + <para>Параллельные интерфейсы иногда называют + интерфейсами <quote>Centronics</quote>, по названию типа + разъема на принтере.</para> + </listitem> + + <indexterm> + <primary>принтеры</primary> + <secondary>USB</secondary> + </indexterm> + + <listitem> + <para>Интерфейсы USB (сокращение от Universal Serial + Bus — универсальная последовательная шина), могут работать + на еще больших скоростях, чем параллельные или + последовательные интерфейсы RS-232. Кабели для них — + простые и дешевые. USB превосходит последовательный RS-232 + и параллельный интерфейсы для печати, но не слишком + хорошо поддерживается в &unix;-системах. Обойти эту проблему + можно, купив принтер с двумя интерфейсами, USB и + параллельным, как у многих принтеров.</para> + </listitem> + </itemizedlist> + + <para>В общем случае, параллельные интерфейсы обычно + обеспечивают только одностороннюю передачу (с компьютера + на принтер), тогда как последовательные и USB поддерживают + двустороннюю. Более новые параллельные порты (EPP и ECP) и принтеры + могут взаимодействовать в обоих направлениях под FreeBSD, если + используется кабель, соответствующий стандарту IEEE-1284.</para> + + <indexterm><primary>PostScript</primary></indexterm> + <para>Двустороннее взаимодействие с принтером через параллельный + порт обычно выполняется одним из двух способов. Первый метод + опирается на использование специально созданного драйвера + принтера для FreeBSD, который поддерживает специфический язык + данного принтера. Этот метод типичен для струйных принтеров и + может использоваться для получения информации об уровне чернил и + другой информации о состоянии. Второй метод используется, когда + принтер поддерживает &postscript;.</para> + + <para>Фактически, задания &postscript; + являются программами, посылаемыми для выполнения принтеру; + они вообще могут не выдавать результат на бумагу и возвращать + его непосредственно компьютеру. &postscript; также использует + двустороннее взаимодействие для сообщения компьютеру о проблемах, + таких как ошибки в &postscript;-программе или замятие бумаги. + Такая информация может пригодиться пользователям. Более того, + лучший способ эффективного учета использования + &postscript;-принтера требует двустороннего взаимодействия: + вы запрашиваете у принтера значение счетчика страниц (сколько + страниц напечатал принтер за все время существования), затем + посылаете задание пользователя, затем снова запрашиваете значение + его счетчика страниц. Вычитаем одно значение из другого, и узнаем, + сколько бумаги потратил пользователь.</para> + </sect4> + + <sect4 id="printing-parallel"> + <title>Параллельные порты</title> + + <para>Для подключения принтера через параллельный интерфейс, + соедините принтер и компьютер кабелем Centronics. + Инструкции для принтера, для компьютера или обе должны полностью + описывать эту процедуру.</para> + + <para>Помните, какой параллельный порт компьютера вы использовали. + Первый параллельный порт в ОС FreeBSD — + <filename>ppc0</filename>; второй — + <filename>ppc1</filename>, и так далее. Имена устройств для + принтеров используют ту же схему: <filename>/dev/lpt0</filename> + для принтера на первом параллельном порту и т.д.</para> + </sect4> + + <sect4 id="printing-serial"> + <title>Последовательные порты</title> + + <para>Для подключения принтера через последовательный интерфейс, + соедините принтер с компьютером подходящим последовательным кабелем. + Инструкции для принтера, для компьютера или обе должны полностью + описывать эту процедуру.</para> + + <para>Если вы не знаете, что такое <quote>подходящий последовательный + кабель</quote>, можете попробовать использовать один из следующих:</para> + + <itemizedlist> + <listitem> + <para><emphasis>Модемный</emphasis> кабель соединяет каждый штырёк + на одном конце кабеля напрямую с соответствующим штырьком + на другом конце. Кабель такого типа также называют + кабелем <quote>DTE-to-DCE</quote>.</para> + </listitem> + + <indexterm><primary>нуль-модемный кабель</primary></indexterm> + <listitem> + <para><emphasis>Нуль-модемный</emphasis> кабель соединяет часть + штырьков напрямую, другие — меняет (пересылку данных на приём + данных, например), а некоторые — закорачивает на каждом разъеме. + Кабель такого типа также называют кабелем + <quote>DTE-to-DTE</quote> cable.</para> + </listitem> + + <listitem> + <para>Кабель <emphasis>последовательного принтера</emphasis>, + необходимый для некоторых редко используемых принтеров, похож + на нуль-модемный кабель, но посылает часть сигналов на + соответствующие штырьки, а не закорачивает их.</para> + </listitem> + </itemizedlist> + + <indexterm><primary>скорость передачи</primary></indexterm> + <indexterm><primary>четность</primary></indexterm> + <indexterm><primary>протокол управления передачей</primary></indexterm> + <para>Вам надо также настроить эти параметры взаимодействия с принтером, + обычно — через элементы управления на лицевой панели или переключатели + (DIP switches) на принтере. Выберите максимальную скорость передачи + <literal>bps</literal> (бит в секунду, иногда — + <emphasis>baud rate</emphasis>), которую могут поддерживать как + компьютер, так и принтер. Выберите 7 или 8 битов данных; четность none, + even или odd; и 1 или 2 стоп-бита. Также надо выбрать протокол управления + передачей: none или XON/XOFF (также известный как + <quote>внутриполосный</quote> или <quote>программный</quote>). + Запомните выбранные установки для последующего конфигурирования + программного обеспечения.</para> + </sect4> + </sect3> + + <sect3 id="printing-software"> + <title>Настройка программного обеспечения</title> + + <para>В этом разделе описана настройка программного обеспечения, + необходимая для печати с помощью системы спулинга + <application>LPD</application> в ОС FreeBSD. + </para> + + <para>Вот план действий, которые необходимо выполнить:</para> + + <procedure> + <step> + <para>При необходимости, сконфигурировать в ядре поддержку порта, + к которому подключен принтер; в разделе <link + linkend="printing-kernel">Конфигурирование ядра</link> описано, + что надо сделать.</para> + </step> + + <step> + <para>Установить режим взаимодействия для параллельного порта, + если используется параллельный порт; детали представлены + в разделе <link linkend="printing-parallel-port-mode">Настройка + режима взаимодействия для параллельного порта</link>.</para> + </step> + + <step> + <para>Проверить, может ли операционная система посылать данные + на принтер. В разделе <link linkend="printing-testing">Проверка + взаимодействия с принтером</link> даны советы, как это сделать.</para> + </step> + + <step> + <para>Настроить <application>LPD</application> для принтера, + изменяя файл <filename>/etc/printcap</filename>. Как это + сделать описано далее в этой главе.</para> + </step> + </procedure> + + <sect4 id="printing-kernel"> + <title>Конфигурирование ядра</title> + + <para>Ядро операционной системы компилируется для работы с + конкретным набором устройств. Последовательный или параллельный + интерфейс для принтера входит в этот набор. Поэтому может + понадобиться добавить поддержку для дополнительного + последовательного или параллельного порта, если он еще + не сконфигурирован в ядре.</para> + + <para>Чтобы узнать, поддерживает ли используемое в настоящий + момент ядро последовательный интерфейс, наберите:</para> + + <screen>&prompt.root; <userinput>grep sio<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen> + + <para>Где <replaceable>N</replaceable> — номер последовательного + порта, начиная с нуля. Если вы получаете результат, подобный + следующему:</para> + + <screen>sio2 at port 0x3e8-0x3ef irq 5 on isa +sio2: type 16550A</screen> + + <para>значит, ядро поддерживает порт.</para> + + <para>Чтобы узнать, поддерживает ли ядро параллельный интерфейс, + наберите:</para> + + <screen>&prompt.root; <userinput>grep ppc<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen> + + <para>Где <replaceable>N</replaceable> номер параллельного порта, + начиная с нуля. Если вы получаете результат, подобный + следующему:</para> + + <screen>ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 +ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode +ppc0: FIFO with 16/16/8 bytes threshold</screen> + + <para>значит, ядро поддерживает порт.</para> + + <para>Может потребоваться переконфигурировать ядро, чтобы + операционная система распознала и использовала параллельный + или последовательный порт, используемый для подключения + принтера.</para> + + <para>Чтобы добавить поддержку последовательного порта, + обратитесь к разделу, посвященному конфигурированию ядра. + Чтобы добавить поддержку параллельного порта, почитайте + этот же раздел <emphasis>и</emphasis> следующий раздел.</para> + </sect4> + </sect3> + + <sect3 id="printing-parallel-port-mode"> + <title>Настройка режима взаимодействия для параллельного порта</title> + + <para>При использовании параллельного интерфейса можно выбрать, + должна ли ОС FreeBSD взаимодействовать с принтером на основе + прерываний или путем опроса. Универсальный драйвер принтера + (&man.lpt.4;) во FreeBSD использует + систему &man.ppbus.4;, которая управляет чипсетом порта + с помощью драйвера &man.ppc.4;.</para> + + <itemizedlist> + <listitem> + <para>Метод взаимодействия <emphasis>на основе прерываний</emphasis> + является стандартным для ядра GENERIC. По этому методу, + операционная система использует линию запроса прерывания (IRQ line) + для определения готовности принтера к приему данных.</para> + </listitem> + + <listitem> + <para>Метод взаимодействия <emphasis>путем опроса</emphasis> + требует от операционной системы постоянно запрашивать + принтер, готов ли он к приему данных. Когда он отвечает, + что готов, ядро посылает дополнительные данные.</para> + </listitem> + </itemizedlist> + + <para>Метод взаимодействия на основе прерываний обычно работает + несколько быстрее, но использует ценную линию запроса прерывания. + Про некоторые новые принтеры HP утверждают, что они работают + некорректно в режиме взаимодействия на основе прерываний, + вероятно, из-за некоторой (еще не вполне понятной) проблемы + синхронизации. Для этих принтеров необходимо устанавливать + режим опроса. Используйте тот режим, который работает. Некоторые + принтеры будут работать в обоих режимах, но оказываются + крайне медленными в режиме на основе прерываний.</para> + + <para>Режим взаимодействия можно установить двумя способами: + конфигурируя ядро или с помощью программы &man.lptcontrol.8;.</para> + + <para><emphasis>Для установки режима взаимодействия путем + конфигурирования ядра:</emphasis></para> + + <procedure> + <step> + <para>Отредактируйте файл конфигурации ядра. Найдите запись + <literal>ppc0</literal>. Если вы настраиваете второй + параллельный порт, ищите запись <literal>ppc1</literal>. + Используйте запись <literal>ppc2</literal> для третьего порта, + и так далее.</para> + + <itemizedlist> + <listitem> + <para>Если необходимо установить режим на основе прерываний, + отредактируйте следующую строку:</para> + + <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting> + + <para>в файле <filename>/boot/device.hints</filename>, заменив + <replaceable>N</replaceable> соответствующим номером IRQ. + Файл конфигурации ядра также должен содержать драйвер + &man.ppc.4;:</para> + + <screen>device ppc</screen> + + </listitem> + + <listitem> + <para>Если необходимо установить режим опроса, + удалите из файла + <filename>/boot/device.hints</filename> следующую + строку:</para> + + <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting> + + <para>В некоторых случаях, этого недостаточно для перевода + порта в режим опроса под FreeBSD. Чаще всего, + проблема связана с драйвером &man.acpi.4;, который может + опрашивать и подключать устройства и, тем самым, + управлять режимом доступа к порту принтера. Чтобы решить + эту проблему, проверьте конфигурацию &man.acpi.4;.</para> + </listitem> + </itemizedlist> + </step> + + <step> + <para>Сохраните файл. Затем сконфигурируйте, соберите и установите + ядро и перезагрузите систему. Подробнее см. в разделе <link + linkend="kernelconfig">конфигурирование ядра</link>.</para> + </step> + </procedure> + + <para><emphasis>Для настройки режима взаимодействия с помощью + утилиты </emphasis> &man.lptcontrol.8;:</para> + + <procedure> + <step> + <para>Введите команду:</para> + + <screen>&prompt.root; <userinput>lptcontrol -i -d /dev/lpt<replaceable>N</replaceable></userinput></screen> + + <para>для установки режима взаимодействия на основе прерываний + для <literal>lpt<replaceable>N</replaceable></literal>.</para> + </step> + + <step> + <para>Введите команду:</para> + + <screen>&prompt.root; <userinput>lptcontrol -p -d /dev/lpt<replaceable>N</replaceable></userinput></screen> + + <para>для установки режима взаимодействия по опросу для + <literal>lpt<replaceable>N</replaceable></literal>.</para> + </step> + </procedure> + + <para>Вы можете поместить эти команды в файл + <filename>/etc/rc.local</filename> для установки требуемого режима + при каждой загрузке системы. Дополнительную информацию об этом + ищите на странице справочного руководства &man.lptcontrol.8;.</para> + </sect3> + + <sect3 id="printing-testing"> + <title>Проверка взаимодействия с принтером</title> + + <para>Прежде чем переходить к конфигурированию системы спулинга, + надо убедиться, что операционная система может успешно посылать данные + на принтер. Намного проще отлаживать взаимодействие с принтером и + систему спулинга отдельно.</para> + + <para>Для тестирования принтера мы пошлем на него текст. Для принтеров, + которые могут непосредственно печатать посланные на них символы, + идеально подходит программа &man.lptest.1;: она генерирует все 96 + печатных символов ASCII в 96 строках.</para> + + <indexterm><primary>PostScript</primary></indexterm> + <para>Для &postscript;- (или основанного на другом языке) принтера, + необходим более сложный тест. Подойдет небольшая + &postscript;-программа, вроде следующей:</para> + + <programlisting>%!PS +100 100 moveto 300 300 lineto stroke +310 310 moveto /Helvetica findfont 12 scalefont setfont +(Is this thing working?) show +showpage</programlisting> + + <para>Представленный выше &postscript;-код можно поместить в + в файл и использовать, как показано в примерах в следующих + разделах.</para> + + <indexterm><primary>PCL</primary></indexterm> + <note> + <para>Когда в этом документе речь идет о языке принтера, + подразумевается язык типа &postscript;, а не PCL компании Hewlett + Packard. Хотя PCL имеет прекрасные функциональные возможности, в нем + можно смешивать обычный текст с его управляющими + последовательностями. &postscript; не позволяет непосредственно + печатать обычный текст, и это язык принтера именно того рода, + для которого надо выполнять специальные настройки.</para> + </note> + + <sect4 id="printing-checking-parallel"> + <title>Проверка параллельного принтера</title> + + <indexterm> + <primary>принтеры</primary> + <secondary>параллельные</secondary> + </indexterm> + <para>В этом разделе описано, как проверить, может ли ОС FreeBSD + взаимодействовать с принтером, подключенным к параллельному порту.</para> + + <para><emphasis>Для тестирования принтера на параллельном порту:</emphasis></para> + + <procedure> + <step> + <para>Станьте пользователем <username>root</username> с помощью + команды &man.su.1;.</para> + </step> + + <step> + <para>Пошлите данные на принтер.</para> + + <itemizedlist> + <listitem> + <para>Если принтер может печатать обычный текст, используйте + утилиту &man.lptest.1;. Введите команду:</para> + + <screen>&prompt.root; <userinput>lptest > /dev/lpt<replaceable>N</replaceable></userinput></screen> + + <para>Где <replaceable>N</replaceable> — номер параллельного порта, + начиная с нуля.</para> + </listitem> + + <listitem> + <para>Если принтер понимает &postscript; или другой язык принтера, + пошлите на принтер небольшую программу. Введите команду:</para> + + <screen>&prompt.root; <userinput>cat > /dev/lpt<replaceable>N</replaceable></userinput></screen> + + <para>Затем, построчно, <emphasis>внимательно</emphasis> введите + программу, поскольку вы не сможете отредактировать строку + после нажатия клавиши <literal>RETURN</literal> + или <literal>ENTER</literal>. По окончании ввода программы, + нажмите <literal>CONTROL+D</literal> или другую комбинацию клавиш, + используемую для ввода символа конца файла.</para> + + <para>Можно также поместить программу в файл и выполнить команду:</para> + + <screen>&prompt.root; <userinput>cat <replaceable>file</replaceable> > /dev/lpt<replaceable>N</replaceable></userinput></screen> + + <para>Где <replaceable>file</replaceable> — имя файла, содержащего + программу, которую вы хотите послать принтеру.</para> + </listitem> + </itemizedlist> + </step> + </procedure> + + <para>Вы должны увидеть распечатку. Не переживайте, если текст выглядит + не так, как предполагалось; этими проблемами мы займемся позже.</para> + </sect4> + + <sect4 id="printing-checking-serial"> + <title>Проверка последовательного принтера</title> + + <indexterm> + <primary>принтеры</primary> + <secondary>последовательные</secondary> + </indexterm> + <para>В этом разделе описано, как проверить, может ли ОС FreeBSD + взаимодействовать с принтером, подключенным к последовательному + порту.</para> + + <para><emphasis>Для тестирования принтера на последовательном + порту:</emphasis></para> + + <procedure> + <step> + <para>Станьте пользователем <username>root</username> с помощью + команды &man.su.1;.</para> + </step> + + <step> + <para>Отредактируйте файл <filename>/etc/remote</filename>. + Добавьте следующую запись:</para> + + <programlisting>printer:dv=/dev/<replaceable>port</replaceable>:br#<replaceable>bps-rate</replaceable>:pa=<replaceable>parity</replaceable></programlisting> + + <indexterm><primary>бит в секунду</primary></indexterm> + <indexterm><primary>последовательный порт</primary></indexterm> + <indexterm><primary>четность</primary></indexterm> + <para>Где <replaceable>port</replaceable> — специальный файл + устройства для последовательного порта (<literal>ttyd0</literal>, + <literal>ttyd1</literal> и т.д.), <replaceable>bps-rate</replaceable> — + скорость обработки данных принтером, в битах в секунду, + а <replaceable>parity</replaceable> — требуемая принтером четность + (значение <literal>even</literal>, <literal>odd</literal>, + <literal>none</literal> или <literal>zero</literal>).</para> + + <para>Вот пример записи для принтера, подключенного + к третьему последовательному порту на скорости 19200 bps + без четности:</para> + + <programlisting>printer:dv=/dev/ttyd2:br#19200:pa=none</programlisting> + </step> + + <step> + <para>Подключитесь к принтеру с помощью &man.tip.1;. + Введите команду:</para> + + <screen>&prompt.root; <userinput>tip printer</userinput></screen> + + <para>Если этот шаг не срабатывает, снова отредактируйте + файл <filename>/etc/remote</filename> и попробуйте использовать + устройство <filename>/dev/cuaa<replaceable>N</replaceable></filename> + вместо <filename>/dev/ttyd<replaceable>N</replaceable></filename>.</para> + </step> + + <step> + <para>Пошлите данные на принтер.</para> + + <itemizedlist> + <listitem> + <para>Если принтер может печатать обычный текст, используйте + утилиту &man.lptest.1;. Введите команду:</para> + + <screen>&prompt.user; <userinput>$lptest</userinput></screen> + </listitem> + + <listitem> + <para>Если принтер понимает &postscript; или другой язык + принтера, пошлите на принтер небольшую программу. + Вводите программу, построчно, <emphasis>очень + внимательно</emphasis>, поскольку нажатие клавиши Backspacе + или других клавиш редактирования может иметь значение + для принтера. Может также понадобиться нажать специальную + комбинацию клавиш, обозначающую конец файла, чтобы принтер + понял, что получена вся программа. Для + &postscript;-принтеров нажмите <literal>CONTROL+D</literal>.</para> + + <para>Можно также поместить программу в файл и ввести команду:</para> + + <screen>&prompt.user; <userinput>><replaceable>file</replaceable></userinput></screen> + + <para>Где <replaceable>file</replaceable> — имя файла, + содержащего программу. После того, как утилита + &man.tip.1; пошлет файл, нажмите требуемую для + ввода признака конца файла комбинацию клавиш.</para> + </listitem> + </itemizedlist> + </step> + </procedure> + + <para>Вы должны увидеть распечатку. Не переживайте, если текст выглядит + не так, как предполагалось; этими проблемами мы займемся позже.</para> + </sect4> + </sect3> + + <sect3 id="printing-printcap"> + <title>Включение спулера: файл <filename>/etc/printcap</filename></title> + + <para>Сейчас ваш принтер уже должен быть подключен, ядро + (при необходимости) — сконфигурировано для взаимодействия с ним, + и вы смогли послать на принтер простые данные. Теперь мы готовы + к конфигурированию системы <application>LPD</application> для управления + доступом к принтеру.</para> + + <para>Система <application>LPD</application> конфигурируется путем + редактирования файла <filename>/etc/printcap</filename>. Система + спулинга <application>LPD</application> читает этот файл при + каждом использовании спулера, так что, изменения в файле + сразу же учитываются.</para> + + <indexterm> + <primary>принтеры</primary> + <secondary>характеристики</secondary> + </indexterm> + <para>Формат файла &man.printcap.5; прост. Используйте + свой любимый текстовый редактор для изменения файла + <filename>/etc/printcap</filename>. Формат файла идентичен + формату других файлов, описывающих характеристики, например, + <filename>/usr/share/misc/termcap</filename> и + <filename>/etc/remote</filename>. Полная информация о формате + представлена на странице справочного руководства &man.cgetent.3;.</para> + + <para>Простое конфигурирование спулера включает следующие шаги:</para> + + <procedure> + <step> + <para>Выберите имя (и несколько удобных псевдонимов) для принтера + и поместите их в файл <filename>/etc/printcap</filename>; подробнее + об именовании см. в разделе + <link linkend="printing-naming">Именование принтера</link>.</para> + </step> + + <indexterm><primary>начальные страницы</primary></indexterm> + <step> + <para>Отключите выдачу начальных страниц (которые по умолчанию выдаются), + вставив характеристику <literal>sh</literal>; подробнее об + этом см. в разделе + <link linkend="printing-no-header-pages">Подавление выдачи + начальных страниц</link>.</para> + </step> + + <step> + <para>Создайте каталог для спулинга и укажите его местонахождение + с помощью характеристики <literal>sd</literal>; подробнее об этом + см. в разделе <link linkend="printing-spooldir">Создание + каталога спулинга</link>.</para> + </step> + + <step> + <para>Выберите специальный файл устройства <filename>/dev</filename> для + использования с принтером и укажите его в файле + <filename>/etc/printcap</filename> с помощью характеристики + <literal>lp</literal>; подробнее об этом см. в разделе + <link linkend="printing-device">Выбор устройства для принтера</link>. + Кроме того, если принтер подключен к последовательному порту, + настройте параметры взаимодействия с помощью характеристики + <literal>ms#</literal>, которая обсуждается в разделе + <link linkend="printing-commparam">Конфигурирование параметров + взаимодействия для спулера</link>.</para> + </step> + + <step> + <para>Установите фильтр для обычного текста; подробнее об этом + см. в разделе <link linkend="printing-textfilter">Установка + текстового фильтра</link>.</para> + </step> + + <step> + <para>Проверьте настройку, напечатав что-нибудь с помощью команды + &man.lpr.1;. Подробнее об этом см. в разделах + <link linkend="printing-trying">Проверка</link> и + <link linkend="printing-troubleshooting">Выявление + проблем</link>.</para> + </step> + </procedure> + + <note> + <para>Принтеры, использующие специальные языки, например, &postscript;-принтеры, + не могут непосредственно печатать обычный текст. Простая настройка, + представленная выше и описанная в следующих разделах, предполагает, что, + если вы устанавливаете такой принтер, то будете печатать только файлы, + которые он может обработать.</para> + </note> + + <para>Пользователи часто предполагают, что они могут печатать обычный + текст на любом из установленных в системе принтеров. Программы, + взаимодействующие для обеспечения печати с системой + <application>LPD</application>, обычно исходят из этого же предположения. + Если вы устанавливаете такой принтер и хотите иметь возможность посылать + на печать задания на языке принтера <emphasis>и</emphasis> в виде обычного + текста, настоятельно рекомендуется добавить дополнительный шаг к представленной + выше простой последовательности настройки: установите программу + автоматического преобразования обычного текста в &postscript; (или + другой язык принтера). В разделе + <link linkend="printing-advanced-if-conversion">Прием заданий с обычным текстом + на &postscript;-принтеры</link> рассказано, как это сделать.</para> + + <sect4 id="printing-naming"> + <title>Именование принтера</title> + + <para>Первый (простой) шаг — выбрать имя для принтера. + На самом деле, не важно, выберете ли вы функциональное имя или + причудливое, поскольку для принтера можно также задать несколько + псевдонимов.</para> + + <para>По крайней мере, один из принтеров, указанных в файле + <filename>/etc/printcap</filename>, должен иметь псевдоним + <literal>lp</literal>. Это — стандартное имя принтера. + Если пользователи не установят переменную среды <envar>PRINTER</envar> + и не укажут имя принтера в командной сроке при вводе любой + команды системы <application>LPD</application>, по умолчанию для + ее выполнения будет использован принтер <literal>lp</literal>.</para> + + <para>Также широко распространена практика в качестве последнего + псевдонима для принтера задавать полное его описание, включая + производителя и модель.</para> + + <para>После выбора имени и нескольких популярных псевдонимов поместите + их в файл <filename>/etc/printcap</filename>. Имя принтера должно начинаться + с крайнего левого столбца. Каждый псевдоним отделяйте вертикальной + чертой, а после последнего псевдонима поместите двоеточие.</para> + + <para>В следующем примере мы начнем со скелетного файла + <filename>/etc/printcap</filename>, определяющего два принтера + (построчный принтер Diablo 630 и лазерный &postscript;-принтер + Panasonic KX-P4455):</para> + + <programlisting># +# /etc/printcap для хоста rose +# +rattan|line|diablo|lp|Diablo 630 Line Printer: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:</programlisting> + + <para>В этом примере первый принтер назван + <literal>rattan</literal> и ему заданы псевдонимы + <literal>line</literal>, <literal>diablo</literal>, + <literal>lp</literal> и <literal>Diablo 630 Line + Printer</literal>. Поскольку у него есть псевдоним + <literal>lp</literal>, он является стандартным принтером. Второму + принтеру дано имя <literal>bamboo</literal> и ему заданы псевдонимы + <literal>ps</literal>, <literal>PS</literal>, + <literal>S</literal>, <literal>panasonic</literal> и + <literal>Panasonic KX-P4455 PostScript v51.4</literal>.</para> + </sect4> + + <sect4 id="printing-no-header-pages"> + <title>Подавление выдачи начальных страниц</title> + <indexterm> + <primary>печать</primary> + <secondary>начальных страниц</secondary> + </indexterm> + + <para>Система спулинга <application>LPD</application> будет по умолчанию + печатать <emphasis>заголовочную страницу</emphasis> для каждого задания. + Заголовочная страница содержит имя пользователя, отправившего задание, + хост, с которого поступило задание, и имя задания, красивыми большими + буквами. К сожалению, все эти дополнительные тексты мешают + отладке простой настройки принтера, поэтому мы будет отключать + выдачу начальных страниц.</para> + + <para>Для подавления выдачи начальных страниц добавьте характеристику + <literal>sh</literal> к записи принтера в файле + <filename>/etc/printcap</filename>. Вот пример файла + <filename>/etc/printcap</filename> с добавлением <literal>sh</literal>:</para> + + <programlisting># +# /etc/printcap для хоста rose - никаких начальных страниц +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:</programlisting> + + <para>Обратите внимание, как мы использовали правильный формат: первая + строка начинается с самого левого столбца, а последующие строки + смещены. Каждая строка в записи, + кроме последней, завершается символом обратной косой черты.</para> + </sect4> + + <sect4 id="printing-spooldir"> + <title>Создание каталога для спулинга</title> + <indexterm><primary>printer spool</primary></indexterm> + <indexterm><primary>задания печати</primary></indexterm> + + <para>Следующий шаг в простой настройке спулера — создать + <emphasis>каталог для спулинга</emphasis>, каталог, в котором + находятся задания печати, пока не будут напечатаны, и где находятся + еще несколько других файлов для поддержки спулера.</para> + + <para>Из-за присущих каталогам спулинга постоянных изменений, принято + помещать эти каталоги в каталог <filename>/var/spool</filename>. + Кроме того, не нужно создавать резервные копии содержимого каталогов + спулинга. Пересоздать их можно с помощью простой команды + &man.mkdir.1;.</para> + + <para>Принято также задавать для каталога имя, совпадающее с именем + принтера, как показано ниже:</para> + + <screen>&prompt.root; <userinput>mkdir /var/spool/<replaceable>имя-принтера</replaceable></userinput></screen> + + <para>Однако при наличии большого количества принтеров в сети + может иметь смысл поместить все каталоги спулинга в один каталог, + который просто резервируется для печати с помощью + <application>LPD</application>. Мы сделаем это для наших двух принтеров, + <literal>rattan</literal> и <literal>bamboo</literal>:</para> + + <screen>&prompt.root; <userinput>mkdir /var/spool/lpd</userinput> +&prompt.root; <userinput>mkdir /var/spool/lpd/rattan</userinput> +&prompt.root; <userinput>mkdir /var/spool/lpd/bamboo</userinput></screen> + + <note> + <para>Если вас интересует конфиденциальность заданий, отправляемых + пользователями на печать, можно защитить каталог спулинга, чтобы + он не был общедоступным. Каталоги спулинга должны принадлежать и + быть доступны на чтение, запись и просмотр содержимого пользователю + daemon и группе daemon, и никому больше. Мы установим это для + каталогов спулинга принтеров из нашего примера:</para> + + <screen>&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan</userinput> +&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/bamboo</userinput> +&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan</userinput> +&prompt.root; <userinput>chmod 770 /var/spool/lpd/bamboo</userinput></screen> + </note> + + <para>Наконец, надо сообщить системе <application>LPD</application> + об этих каталогах с помощью файла <filename>/etc/printcap</filename>. + Полное имя каталога спулинга задается с помощью характеристики + <literal>sd</literal>:</para> + + <programlisting># +# /etc/printcap для хоста rose - добавлены каталоги спулинга +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:</programlisting> + + <para>Обратите внимание, что имя принтера начинается с самого + первого столбца, а все последующие строки смещены, и каждая строка в записи, + кроме последней, завершается символом обратной косой черты.</para> + + <para>Если вы не зададите каталог спулинга с помощью характеристики + <literal>sd</literal>, система спулинга будет использовать по умолчанию + каталог <filename>/var/spool/lpd</filename>.</para> + </sect4> + + <sect4 id="printing-device"> + <title>Выбор устройства для принтера</title> + + <!-- XXX Этого раздел больше нет! --> + <para>Мы выяснили, какой специальный + файл устройства в каталоге <filename>/dev</filename> FreeBSD будет + использовать для взаимодействия с принтером. Теперь мы сообщаем эту + информацию системе <application>LPD</application>. Когда у системы + спулинга есть задание для печати, она будет открывать указанное устройство + от имени программы-фильтра (которая отвечает за передачу данных + на принтер).</para> + + <para>Задайте полное имя устройства <filename>/dev</filename> в файле + <filename>/etc/printcap</filename> с помощью характеристики + <literal>lp</literal>.</para> + + <para>В нашем текущем примере давайте предположим, что принтер + <literal>rattan</literal> подключен к первому параллельному порту, + а принтер <literal>bamboo</literal> — к шестому последовательному + порту; вот что нужно добавить в файл <filename>/etc/printcap</filename>:</para> + + <programlisting># +# /etc/printcap для хоста rose - указано, какие устройства использовать +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:\ + :lp=/dev/ttyd5:</programlisting> + + <para>Если вы не укажете характеристику <literal>lp</literal> для + принтера в файле <filename>/etc/printcap</filename>, система + <application>LPD</application> использует по умолчанию + устройство <filename>/dev/lp</filename>. Устройство + <filename>/dev/lp</filename> сейчас в ОС FreeBSD не существует.</para> + + <para>Если устанавливаемый принтер подключен к параллельному порту, + перейдите к разделу <link linkend="printing-textfilter">Установка + текстового фильтра</link>. Иначе выполните сначала инструкции, + представленные в следующем разделе.</para> + </sect4> + + <sect4 id="printing-commparam"> + <title>Конфигурирование параметров взаимодействия спулера</title> + <indexterm> + <primary>принтеры</primary> + <secondary>последовательные</secondary> + </indexterm> + + <para>Для принтеров на последовательных портах система + <application>LPD</application> может устанавливать скорость передачи, + четность и другие параметры взаимодействия через последовательных порт + от имени программы-фильтра, которая посылает данные на принтер. + Это полезно потому, что:</para> + + <itemizedlist> + <listitem> + <para>Позволяет опробовать различные параметры взаимодействия, просто + редактируя файл <filename>/etc/printcap</filename>; программу-фильтр + перекомпилировать не нужно.</para> + </listitem> + + <listitem> + <para>Позволяет системе спулинга использовать одну и ту же + программу-фильтр для нескольких принтеров, которые могут иметь + различные установки для взаимодействия через последовательный + порт.</para> + </listitem> + </itemizedlist> + + <para>Следующие характеристики в файле <filename>/etc/printcap</filename> + задают параметры взаимодействия через последовательный порт + для устройства, указанного в качестве значения характеристики + <literal>lp</literal>:</para> + + <variablelist> + <varlistentry> + <term><literal>br#<replaceable>bps-rate</replaceable></literal></term> + + <listitem> + <para>Устанавливает скорость взаимодействия для устройства в + <replaceable>bps-rate</replaceable>, где + <replaceable>bps-rate</replaceable> может иметь значение 50, 75, 110, + 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, + 19200, 38400, 57600 или 115200 бит в секунду.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>ms#<replaceable>stty-mode</replaceable></literal></term> + + <listitem> + <para>Устанавливает опции для терминального устройства после открытия устройства. + Поддерживаемые опции описаны на странице справочного руководства &man.stty.1;.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Когда система <application>LPD</application> открывает устройство, + заданное характеристикой <literal>lp</literal>, она устанавливает + опции устройства в соответствии со значением характеристики + <literal>ms#</literal>. Наибольший интерес представляют + режимы <literal>parenb</literal>, <literal>parodd</literal>, + <literal>cs5</literal>, <literal>cs6</literal>, <literal>cs7</literal>, + <literal>cs8</literal>, <literal>cstopb</literal>, + <literal>crtscts</literal> и <literal>ixon</literal>, которые + описаны на странице справочного руководства &man.stty.1;.</para> + + <para>Давайте зададим опции для нашего принтера на шестом последовательном + порту. Мы установим скорость передачи 38400. В качестве режима + установим режим без четности с помощью <literal>-parenb</literal>, + 8-битовые символы с помощью <literal>cs8</literal>, + отсутствие модемного управления с помощью <literal>clocal</literal> и + аппаратное управление потоком с помощью опции <literal>crtscts</literal>:</para> + + <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:</programlisting> + </sect4> + + <sect4 id="printing-textfilter"> + <title>Установка текстового фильтра</title> + <indexterm> + <primary>печать</primary> + <secondary>фильтры</secondary> + </indexterm> + + <para>Теперь мы готовы задать системе <application>LPD</application>, + какой текстовый фильтр использовать для посылки заданий на принтер. + <emphasis>Текстовый фильтр</emphasis>, известный также как + <emphasis>входной фильтр</emphasis>, — это программа, + которую система <application>LPD</application> запускает при + получении задания на + печать. Когда система <application>LPD</application> запускает + текстовый фильтр для принтера, она направляет на стандартный + входной поток фильтра задание печати, а его стандартный выходной + поток — на устройство принтера, заданное характеристикой <literal>lp</literal>. + Предполагается, что фильтр прочитает задание из стандартного входного + потока, выполнит все необходимые для принтера преобразования и + выдаст результат в стандартный выходной поток, который и будет + напечатан. Подробнее о текстовом фильтре см. в разделе + <link linkend="printing-advanced-filters">Фильтры</link>.</para> + + <para>Для простой настройки принтера в качестве текстового фильтра можно + задать небольшой скрипт командного интерпретатора, который просто + выполняет <command>/bin/cat</command> для посылки задания на принтер. + В составе FreeBSD поставляется другой фильтр, <filename>lpf</filename>, + обрабатывающий забой и подчеркивание для принтеров, которые не слишком + хорошо справляются с потоком данных, содержащих такие символы. И, + конечно же, вы можете использовать любую другую необходимую + программу-фильтр. Фильтр <command>lpf</command> детально описан в разделе + <link linkend="printing-advanced-lpf">lpf: текстовый фильтр</link>.</para> + + <para>Сначала давайте создадим скрипт командного интерпретатора + <filename>/usr/local/libexec/if-simple</filename> для простого + тестового фильтра. Поместите в этот файл следующий текст с помощью + любимого текстового редактора:</para> + + <programlisting>#!/bin/sh +# +# if-simple - Простой фильтр входного текста для lpd +# Установлен в /usr/local/libexec/if-simple +# +# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра. + +/bin/cat && exit 0 +exit 2</programlisting> + + <para>Сделайте этот файл выполняемым:</para> + + <screen>&prompt.root; <userinput>chmod 555 /usr/local/libexec/if-simple</userinput></screen> + + <para>А теперь потребуйте от системы LPD его использовать, указав его в + качестве значения характеристики <literal>if</literal> в файле + <filename>/etc/printcap</filename>. Мы добавим его для двух принтеров, + имеющихся пока в примере файла <filename>/etc/printcap</filename>:</para> + + <programlisting># +# /etc/printcap для хоста rose - добавлен текстовый фильтр +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\ + :if=/usr/local/libexec/if-simple:</programlisting> + + <note> + <para>Копию скрипта <filename>if-simple</filename> можно + найти в каталоге <filename + class="directory">/usr/share/examples/printing</filename>.</para> + </note> + </sect4> + + <sect4> + <title>Запуск системы <application>LPD</application></title> + + <para>Даемон &man.lpd.8; запускается из <filename>/etc/rc</filename>, + а необходимость запуска задается переменной <literal>lpd_enable</literal>. + Эта переменная по умолчанию имеет значение <literal>NO</literal>. Если + вы еще этого не сделали, добавьте строку:</para> + + <programlisting>lpd_enable="YES"</programlisting> + + <para>в файл <filename>/etc/rc.conf</filename>, а затем либо перезапустите + машину, либо просто выполните команду &man.lpd.8;.</para> + + <screen>&prompt.root; <userinput>lpd</userinput></screen> + </sect4> + + <sect4 id="printing-trying"> + <title>Проверка</title> + + <para>Вы добрались до конца простой настройки системы + <application>LPD</application>. К сожалению, + поздравлять вас еще рано, поскольку надо еще проверить + настройку и устранить все выявленные проблемы. Для проверки + настройки, попытайтесь что-то распечатать. Для печати с помощью + системы <application>LPD</application> используется + команда &man.lpr.1;, которая посылает задание на печать.</para> + + <para>Можно скомбинировать &man.lpr.1; с программой &man.lptest.1;, + представленной в разделе <link linkend="printing-testing">Проверка + взаимодействия с принтером</link>, генерирующей тестовый текст.</para> + + <para><emphasis>Для тестирования простой настройки + <application>LPD</application>:</emphasis></para> + + <para>Введите команду:</para> + + <screen>&prompt.root; <userinput>lptest 20 5 | lpr -P<replaceable>printer-name</replaceable></userinput></screen> + + <para>Где <replaceable>printer-name</replaceable> — имя + (или псевдоним) принтера, заданное в файле + <filename>/etc/printcap</filename>. Для проверки стандартного + принтера, введите команду &man.lpr.1; без аргумента <option>-P</option>. + Как уже отмечалось, если тестируется принтер, предполагающий использование + &postscript;, пошлите ему &postscript;-программу вместо использования + утилиты &man.lptest.1;. Это можно сделать, поместив программу в файл + и выполнив команду <command>lpr <replaceable>file</replaceable></command>.</para> + + <para>Для &postscript;-принтера вы должны получить результаты выполнения + программы. Если вы используете &man.lptest.1;, ваши результаты должны + иметь такой вид:</para> + + <programlisting>!"#$%&'()*+,-./01234 +"#$%&'()*+,-./012345 +#$%&'()*+,-./0123456 +$%&'()*+,-./01234567 +%&'()*+,-./012345678</programlisting> + + <para>Для дальнейшего тестирования принтера, попытайтесь загрузить + программы побольше (для принтеров, поддерживающих определенный язык) + или выполните команду &man.lptest.1; с другими аргументами. Например, + команда <command>lptest 80 60</command> выдаст 60 строк по 80 + символов в каждой.</para> + + <para>Если принтер не работает, см. раздел <link + linkend="printing-troubleshooting">Выявление проблем</link>.</para> + </sect4> + </sect3> + </sect2> + </sect1> + + <sect1 id="printing-advanced"> + <title>Расширенная настройка принтера</title> + + <para>В этом разделе описаны фильтры для печати специально сформатированных + файлов, начальных страниц, печати по сети, ограничения и учета использования + принтера.</para> + + <sect2 id="printing-advanced-filter-intro"> + <title>Фильтры</title> + <indexterm> + <primary>печать</primary> + <secondary>фильтры</secondary> + </indexterm> + + <para>Хотя система <application>LPD</application> поддерживает сетевые + протоколы, очереди, контроль доступа и другие аспекты печати, большая + часть <emphasis>реальной</emphasis> работы происходит в + <emphasis>фильтрах</emphasis>. Фильтры — это программы, + взаимодействующие с принтером и обеспечивающие учет особенностей + устройства и специальных требований. При простой настройке принтера + мы установили фильтр для обычного текста — крайне простой, который + должен работать с большинством принтеров (см. раздел + <link linkend="printing-textfilter">Установка текстового + фильтра</link>).</para> + + <para>Однако, чтобы обеспечить преобразования формата, учет использования + принтера и индивидуальных особенностей отдельных принтеров и т.п., + надо разобраться, как работают фильтры. В конечном итоге, всеми этими + аспектами печати должен заниматься фильтр. А плохая новость состоит + в том, что, в большинстве случаев, вы <emphasis>сами</emphasis> + должны предоставить соответствующие фильтры. Хорошая новость состоит + в том, что многие фильтры общедоступны; а если подходящих нет, + их обычно легко написать.</para> + + <para>Кроме того, в составе ОС FreeBSD поставляется один фильтр, + <filename>/usr/libexec/lpr/lpf</filename>, работающий со многими + принтерами, которые могут печатать обычный текст. (Он обрабатывает + символы забоя и табуляции в файле, выполняет учет использования, но + и не более того.) Есть также ряд фильтров и компонентов фильтров + в наборе портов FreeBSD.</para> + + <para>Вот что вы найдете в этом разделе:</para> + + <itemizedlist> + <listitem> + <para>В разделе <link linkend="printing-advanced-filters">Как работают + фильтры</link> сделана попытка дать обзор роли фильтра в процессе + печати. Прочтите этот раздел, чтобы понять, что происходит + <quote>за кадром</quote>, когда система <application>LPD</application> + использует фильтры. Это понимание поможет предвидеть и решать + проблемы, с которыми вы можете столкнуться при добавлении дополнительных + фильтров для каждого из принтеров.</para> + </listitem> + + <listitem> + <para>Система <application>LPD</application> предполагает, что + каждый принтер, по умолчанию, может печатать обычный текст. Это + проблематично для &postscript;-принтеров (или принтеров на базе + другого языка), поскольку они не могут печатать обычный текст + непосредственно. В разделе + <link linkend="printing-advanced-if-conversion">Прием заданий с + обычным текстом на &postscript;-принтеры</link> описано, что + нужно сделать, чтобы решить эту проблему. Прочтите этот раздел, + если используете &postscript;-принтер.</para> + </listitem> + + <listitem> + <para>&postscript; — популярный формат выдачи для многих программ. + Некоторые люди даже пишут &postscript;-код непосредственно. К + сожалению, &postscript;-принтеры дороги. В разделе <link + linkend="printing-advanced-ps">Имитация &postscript; на + не-&postscript; принтерах</link> описано, как можно дополнительно + изменить текстовый фильтр принтера для приема и печати данных + &postscript; не <emphasis>не-&postscript;</emphasis> принтере. + Прочтите этот раздел, если ваш принтер не поддерживает + &postscript;.</para> + </listitem> + + <listitem> + <para>В разделе <link + linkend="printing-advanced-convfilters">Фильтры преобразования</link> + описан способ автоматизации преобразования определенных форматов + файлов, например, графики или данных для печатного станка, в форматы, + которые может обработать ваш принтер. После чтения этого раздела + вы сможете настроить свои принтеры так, что пользователи смогут + выполнять команду <command>lpr -t</command> для печати данных troff, + или <command>lpr -d</command> для печати данных &tex; DVI, или + <command>lpr -v</command> — для печати растровых изображений, и + так далее. Я рекомендую прочитать этот раздел.</para> + </listitem> + + <listitem> + <para>В разделе <link linkend="printing-advanced-of">Выходные фильтры</link> + описана не часто используемая возможность задавать выходные + фильтры в системе <application>LPD</application>. Если только вы + не печатаете начальные страницы (см. <link + linkend="printing-advanced-header-pages">Начальные страницы</link>), + можно, пожалуй, вообще пропустить этот раздел.</para> + </listitem> + + <listitem> + <para>В разделе <link linkend="printing-advanced-lpf">lpf: текстовый + фильтр</link> описана команда <command>lpf</command>, — достаточно + полный, хотя и простой текстовый фильтр для строчных принтеров + (и лазерных принтеров, работающих как строчные), поставляемый в + составе ОС FreeBSD. Если надо быстро настроить учет использования + принтера для обычного текста или если используется принтер, + из которого при получении символов забоя идет дым, несомненно, + стоит подумать об использовании <command>lpf</command>.</para> + </listitem> + </itemizedlist> + + <note> + <para>Различные скрипты, описанные далее, можно найти в каталоге + <filename + class="directory">/usr/share/examples/printing</filename>.</para> + </note> + + <sect3 id="printing-advanced-filters"> + <title>Как работают фильтры</title> + + <para>Как уже упоминалось, фильтр — это выполняемая программа, запускаемая + системой <application>LPD</application> для поддержки специфических + особенностей устройства при взаимодействии с принтером.</para> + + <para>Когда системе <application>LPD</application> надо напечатать + входящий в задание файл, она запускает программу-фильтр. Стандартный + входной поток фильтра связывается с файлом, который надо распечатать, + его стандартный выходной поток — с принтером, а стандартный поток + ошибок перенаправляется в файл регистрации ошибок (задается + характеристикой <literal>lf</literal> в файле + <filename>/etc/printcap</filename>, или используется стандартное + устройство <filename>/dev/console</filename>).</para> + + <indexterm> + <primary><command>troff</command></primary> + </indexterm> + <para>Запускаемый системой <application>LPD</application> фильтр и его + аргументы зависят от того, что указано в файле + <filename>/etc/printcap</filename>, и какие аргументы указал + пользователь для задания в команде &man.lpr.1;. Например, + если пользователь ввел команду <command>lpr -t</command>, + система <application>LPD</application> должна запустить фильтр troff, + заданный характеристикой <literal>tf</literal> для соответствующего + принтера. Если пользователь хочет печатать обычный текст, система + должна запустить фильтр <literal>if</literal> (это верно в большинстве + случаев: подробнее см. в разделе + <link linkend="printing-advanced-of">Выходные фильтры</link>).</para> + + <para>В файле <filename>/etc/printcap</filename> можно задавать + три вида фильтров:</para> + + <itemizedlist> + <listitem> + <para><emphasis>Текстовый фильтр</emphasis>, который в документации + <application>LPD</application> двусмысленно называют + <emphasis>входным фильтром</emphasis>, обеспечивает печать + обычного текста. Рассматривайте его как стандартный фильтр. + Система <application>LPD</application> предполагает, что любой + принтер может по умолчанию печатать обычный текст, а на текстовый + фильтр возлагается задача обеспечить, чтобы символы забоя, + табуляции или другие специальные символы не сбивали принтер с + толку. Если вы работаете в среде, где надо учитывать + использование принтера, текстовый фильтр должен также + учитывать количество напечатанных страниц, обычно, подсчитывая + количество напечатанных строк и сравнивая их с количеством строк на + страницу, поддерживаемых принтером. Текстовый фильтр запускается со + следующим списком аргументов: + + <cmdsynopsis> + <command>имя-фильтра</command> + <arg>-c</arg> + <arg choice="plain">-w<replaceable>ширина</replaceable></arg> + <arg choice="plain">-l<replaceable>длина</replaceable></arg> + <arg choice="plain">-i<replaceable>сдвиг</replaceable></arg> + <arg choice="plain">-n <replaceable>имя-пользователя</replaceable></arg> + <arg choice="plain">-h <replaceable>хост</replaceable></arg> + <arg choice="plain"><replaceable>учетный-файл</replaceable></arg> + </cmdsynopsis> + + где + + <variablelist> + <varlistentry> + <term><option>-c</option></term> + + <listitem> + <para>указывается, если задание послано командой + <command>lpr -l</command></para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>ширина</replaceable></term> + + <listitem> + <para>значение из характеристики <literal>pw</literal> (page + width — ширина страницы), указанной в файле + <filename>/etc/printcap</filename>, по умолчанию — 132</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>длина</replaceable></term> + + <listitem> + <para>значение из характеристики <literal>pl</literal> (page + length — длина страницы), по умолчанию — 66</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>сдвиг</replaceable></term> + + <listitem> + <para>сдвиг, заданный командой <command>lpr -i</command>, + по умолчанию — 0</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>имя-пользователя</replaceable></term> + + <listitem> + <para>регистрационное имя пользователя, печатающего файл</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>хост</replaceable></term> + + <listitem> + <para>имя хоста, с которого было послано задание</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>учетный-файл</replaceable></term> + + <listitem> + <para>имя учетного файла, задаваемое характеристикой + <literal>af</literal>.</para> + </listitem> + </varlistentry> + </variablelist> + </para> + </listitem> + + <indexterm> + <primary>печать</primary> + <secondary>фильтры</secondary> + </indexterm> + <listitem> + <para><emphasis>Фильтр преобразования</emphasis> преобразует + специфичный формат файла в то, что принтер может воспроизвести + на бумаге. Например, данные системы набора ditroff нельзя печатать + непосредственно, но можно установить фильтр преобразования + для файлов ditroff, чтобы преобразовывать данные ditroff + в тот вид, который принтер может воспринять и напечатать. В разделе + <link linkend="printing-advanced-convfilters">Фильтры + преобразования</link> написано всё об этих фильтрах. Фильтры + преобразования также необходимы для учета, если предполагается + учет использования принтера. Фильтры преобразования + запускаются со следующими аргументами: + + <cmdsynopsis> + <command>имя-фильтра</command> + <arg + choice="plain">-x<replaceable>ширина-пиксела</replaceable></arg> + <arg choice="plain">-y<replaceable>высота-пиксела</replaceable></arg> + <arg choice="plain">-n <replaceable>имя-пользователя</replaceable></arg> + <arg choice="plain">-h <replaceable>хост</replaceable></arg> + <arg choice="plain"><replaceable>учетный-файл</replaceable></arg> + </cmdsynopsis> + + где <replaceable>ширина-пиксела</replaceable> — значение + характеристики <literal>px</literal> (по умолчанию — 0), + а <replaceable>высота-пиксела</replaceable> — значение характеристики + <literal>py</literal> (по умолчанию — 0).</para> + </listitem> + + <listitem> + <para><emphasis>Выходной фильтр</emphasis> используется только + если нет текстового фильтра или если включена выдача начальных + страниц. Судя по моему опыту, выходные фильтры используются редко. + Они описаны в разделе <link linkend="printing-advanced-of">Выходные + фильтры</link>. У выходного фильтра есть всего два аргумента: + + <cmdsynopsis> + <command>имя-фильтра</command> + <arg choice="plain">-w<replaceable>ширина</replaceable></arg> + <arg choice="plain">-l<replaceable>длина</replaceable></arg> + </cmdsynopsis> + + которые идентичны аргументам <option>-w</option> и + <option>-l</option> текстового фильтра.</para> + </listitem> + </itemizedlist> + + <para>Фильтры также должны <emphasis>завершать работу</emphasis> со + следующим статусом выхода:</para> + + <variablelist> + <varlistentry> + <term>exit 0</term> + + <listitem> + <para>Если фильтр успешно напечатал файл.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>exit 1</term> + + <listitem> + <para>Если фильтр не смог напечатать файл, но хочет, чтобы + система <application>LPD</application> попыталась + распечатать файл ещё раз. Система <application>LPD</application> + перезапустит фильтр, если его работа завершена с этим статусом.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>exit 2</term> + + <listitem> + <para>Если фильтр не смог напечатать файл и не хочет, чтобы + система <application>LPD</application> пыталась его печатать + еще раз. Система <application>LPD</application> удалит файл.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Поставляемый в составе FreeBSD текстовый фильтр + <filename>/usr/libexec/lpr/lpf</filename> использует аргументы, задающие + ширину и длину страницы для определения того, когда посылать символ + прогона страницы (form feed) и как учитывать использование принтера. + Он использует переданные в качестве аргументов имя пользователя, + хост и учетный файл для внесения учетных записей.</para> + + <para>При поиске фильтров убедитесь, что они совместимы с системой LPD. + Если да, они должны поддерживать описанные выше списки аргументов. + Если вы планируете создавать фильтры для общего использования, + позаботьтесь о поддержке этих списков аргументов и кодов выхода.</para> + </sect3> + + <sect3 id="printing-advanced-if-conversion"> + <title>Прием заданий с обычным текстом на &postscript;-принтеры</title> + <indexterm><primary>задания печати</primary></indexterm> + + <para>Если вы — единственный пользователь компьютера и &postscript;-принтера + (или принтера на основе другого языка), и вы обещаете никогда не + посылать на принтер обычный текст и никогда не использовать возможностей + различных программ, требующих посылки на принтер обычного текста, + вам можно не заботиться о том, что описано в этом разделе.</para> + + <para>Но, если вы хотите посылать на принтер как задания &postscript;, + так и обычный текст, рекомендуется дополнить настройку принтера. Для + этого надо, чтобы текстовый фильтр определял, является ли поступающее + задание обычным текстом или программой на языке &postscript;. Все + &postscript;-задания должны начинаться с <literal>%!</literal> (для + других языков принтеров обратитесь к соответствующей документации). + Если первые два символа в задании — именно эти, речь идет о &postscript;, + и мы можем остальную часть задания передавать непосредственно. Если же + первые два символа в файле — другие, фильтр будет преобразовывать + текст в &postscript; и печатать результат.</para> + + <para>Как нам это сделать?</para> + + <indexterm> + <primary>принтеры</primary> + <secondary>последовательные</secondary> + </indexterm> + <para>Если вы используете последовательный принтер, хороший способ + достичь поставленной цели состоит в установке <command>lprps</command>. + <command>lprps</command> — это фильтр для &postscript;-принтера, + выполняющий двустороннее взаимодействие с принтером. Он обновляет файл + состояния принтера, помещая в него подробную информацию, выданную + принтером, так что пользователи и администраторы могут узнать, + в каком именно состоянии (например, <errorname>toner low</errorname> + или <errorname>paper jam</errorname>) находится принтер. Но еще + важнее, что он включает программу <command>psif</command>, которая + определяет, является ли входящее задание обычным текстом, и вызывает + <command>textps</command> (еще одну программу, поставляемую вместе + с <command>lprps</command>) для преобразования его в &postscript;. + Затем <command>lprps</command> посылает преобразованное задание + на принтер.</para> + + <para><command>lprps</command> входит в набор портов FreeBSD + (см. <link linkend="ports">Набор портов</link>). Вы, конечно, можете + загрузить, собрать и установить его самостоятельно. После установки + <command>lprps</command> просто укажите путь к программе + <command>psif</command>, входящей в состав пакета + <command>lprps</command>. Если вы установили <command>lprps</command> + из Коллекции Портов, используйте следующий текст в записи для + последовательного &postscript;-принтера в файле + <filename>/etc/printcap</filename>:</para> + + <programlisting>:if=/usr/local/libexec/psif:</programlisting> + + <para>Надо также задать характеристику <literal>rw</literal>; + она требует от системы <application>LPD</application> открывать принтер + в режиме чтения и записи.</para> + + <para>При использовании параллельного &postscript;-принтера (что не + позволяет обеспечить двустороннее взаимодействие с принтером, + необходимое для системы <command>lprps</command>), можно + использовать в качестве текстового фильтра следующий скрипт командного + интерпретатора:</para> + + <programlisting>#!/bin/sh +# +# psif - Печать PostScript или обычного текста на PostScript-принтере +# Скрипт, а НЕ версия, входящая в состав lprps +# Установлен в /usr/local/libexec/psif +# + +IFS="" read -r first_line +first_two_chars=`expr "$first_line" : '\(..\)'` + +if [ "$first_two_chars" = "%!" ]; then + # + # Задание PostScript, печатать его. + # + echo "$first_line" && cat && printf "\004" && exit 0 + exit 2 +else + # + # Обычный текст, преобразовать его, а затем напечатать. + # + ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 + exit 2 +fi</programlisting> + + <para>В представленном выше скрипте, <command>textps</command> — + отдельно установленная программа для преобразования обычного текста в + &postscript;. Можно использовать любую программу преобразования + текста в &postscript;. Коллекция Портов FreeBSD (см. материал о + <link linkend="ports">Коллекции Портов</link>) включает + полнофункциональную программу преобразования текста в &postscript; + под названием <literal>a2ps</literal>, которую + тоже можно попробовать использовать.</para> + </sect3> + + <sect3 id="printing-advanced-ps"> + <title>Имитация &postscript; на не-&postscript; принтерах</title> + <indexterm> + <primary>PostScript</primary> + <secondary>эмуляция</secondary> + </indexterm> + <indexterm> + <primary>Ghostscript</primary></indexterm> + <para>&postscript; является <emphasis>фактическим</emphasis> стандартом для + высококачественного набора и печати. &postscript;, однако, — + <emphasis>дорогой</emphasis> стандарт. К счастью, благодаря компании + Aladdin Enterprises есть свободный аналог &postscript; под названием + <application>Ghostscript</application>, который работает с FreeBSD. + Ghostscript может читать большинство &postscript;-файлов и выдавать + соответствующие страницы на множество устройств, включая многие + моделей не-PostScript принтеров. Установив Ghostscript и используя + специальный текстовый фильтр для принтера, можно заставить ваш + не-&postscript; принтер работать фактически как &postscript;-принтер.</para> + + <para>Ghostscript входит в набор портов FreeBSD, если вы хотите + устанавливать его оттуда. Вы можете также легко загрузить, собрать и + установить его самостоятельно.</para> + + <para>Для имитации &postscript; надо, чтобы текстовый фильтр + определял, печатается ли &postscript;-файл. Если нет, фильтр будет + передавать файл на принтер непосредственно; в противном случае, он + будет использовать Ghostscript, чтобы сначала преобразовать файл в + формат, который поймет принтер.</para> + + <para>Рассмотрим пример: следующий сценарий представляет собой + текстовый фильтр для принтеров Hewlett Packard DeskJet 500. + Для других принтеров замените аргумент <option>-sDEVICE</option> + в команде <command>gs</command> (Ghostscript). (Введите + команду <command>gs -h</command> для получения списка устройств, + поддерживаемых установленной версией Ghostscript.)</para> + + <programlisting>#!/bin/sh +# +# ifhp - Печать Ghostscript-эмулированного PostScript на DeskJet 500 +# Установлен в /usr/local/libexec/ifhp + +# +# Обрабатывать LF как CR+LF (чтобы избежать "эффекта ступенек" +# на принтерах HP/PCL: +# +printf "\033&k2G" || exit 2 + +# +# Прочитать первые два символа файла +# +IFS="" read -r first_line +first_two_chars=`expr "$first_line" : '\(..\)'` + +if [ "$first_two_chars" = "%!" ]; then + # + # Это PostScript; используем Ghostscript для чтения, преобразования и печати. + # + /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ + -sOutputFile=- - && exit 0 +else + # + # Обычный текст или HP/PCL, поэтому просто печатаем его напрямую; печатаем в + # конце символ прогона страницы, чтобы была выдана последняя страница. + # + echo "$first_line" && cat && printf "\033&l0H" && +exit 0 +fi + +exit 2</programlisting> + + <para>Наконец, надо указать системе <application>LPD</application>, + какой фильтр использовать, задав характеристику <literal>if</literal>:</para> + + <programlisting>:if=/usr/local/libexec/ifhp:</programlisting> + + <para>Вот и все. Теперь можно выполнять <command>lpr plain.text</command> + и <filename>lpr whatever.ps</filename>, и обе команды должны успешно + печатать.</para> + </sect3> + + <sect3 id="printing-advanced-convfilters"> + <title>Фильтры преобразования</title> + + <para>После завершения простой настройки, описанной в разделе + <link linkend="printing-simple">Простая настройка принтера</link>, + прежде всего, вам может потребоваться установить фильтры + преобразования для любимых форматов файлов (кроме обычных + текстов ASCII).</para> + + <sect4> + <title>Зачем устанавливать фильтры преобразования?</title> + <indexterm> + <primary>&tex;</primary> + <secondary>печать файлов DVI</secondary> + </indexterm> + + <para>Фильтры преобразования упрощают печать различного рода файлов. + В качестве примера, предположим, что активно используется + издательская система &tex; и имеется &postscript;-принтер. + При каждой генерации DVI-файла из &tex;, мы не можем печатать его + непосредственно, пока не преобразуем в &postscript;. Для этого + используется такая последовательность команд:</para> + + <screen>&prompt.user; <userinput>dvips seaweed-analysis.dvi</userinput> +&prompt.user; <userinput>lpr seaweed-analysis.ps</userinput></screen> + + <para>Установив фильтр преобразования для файлов DVI, мы можем не + конвертировать файл каждый раз вручную, возложив эту задачу на + систему <application>LPD</application>. Теперь при каждом получении + DVI-файла нас от его распечатки отделяет только один шаг:</para> + + <screen>&prompt.user; <userinput>lpr -d seaweed-analysis.dvi</userinput></screen> + + <para>Мы заставили систему <application>LPD</application> автоматически + преобразовывать DVI-файл, указав опцию <option>-d</option>. Все + опции преобразования представлены в разделе + <link linkend="printing-lpr-options-format">Опции форматирования + и преобразования</link>.</para> + + <para>Для каждой из опций преобразования, которая должна поддерживаться + принтером, установите <emphasis>фильтр преобразования</emphasis> и + укажите его полное имя в файле <filename>/etc/printcap</filename>. + Фильтр преобразования аналогичен текстовому фильтру для простой + настройки принтера (см. раздел + <link linkend="printing-textfilter">Установка текстового фильтра</link>), + но вместо печати обычного текста он преобразует файл в формат, + который может понять принтер.</para> + </sect4> + + <sect4> + <title>Какие фильтры преобразования следует устанавливать?</title> + + <para>Устанавливать надо те фильтры преобразования, которые + предполагается использовать. Если вы часто печатаете файлы DVI, + значит, фильтр преобразования DVI необходим. Если вам часто + приходится печатать результаты работы troff, может потребоваться + фильтр troff.</para> + + <para>В следующей таблице представлены фильтры, с которыми + работает система <application>LPD</application>, их + соответствующие характеристики для файла + <filename>/etc/printcap</filename>, а также способ их вызова + в команде <command>lpr</command>:</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="3"> + <thead> + <row> + <entry>Тип файла</entry> + <entry>Характеристика <filename>/etc/printcap</filename></entry> + <entry>Опция <command>lpr</command></entry> + </row> + </thead> + + <tbody> + <row> + <entry>cifplot</entry> + <entry><literal>cf</literal></entry> + <entry><option>-c</option></entry> + </row> + + <row> + <entry>DVI</entry> + <entry><literal>df</literal></entry> + <entry><option>-d</option></entry> + </row> + + <row> + <entry>plot</entry> + <entry><literal>gf</literal></entry> + <entry><option>-g</option></entry> + </row> + + <row> + <entry>ditroff</entry> + <entry><literal>nf</literal></entry> + <entry><option>-n</option></entry> + </row> + + <row> + <entry>Текст на языке FORTRAN</entry> + <entry><literal>rf</literal></entry> + <entry><option>-f</option></entry> + </row> + + <row> + <entry>troff</entry> + <entry><literal>tf</literal></entry> + <entry><option>-f</option></entry> + </row> + + <row> + <entry>растровое изображение</entry> + <entry><literal>vf</literal></entry> + <entry><option>-v</option></entry> + </row> + + <row> + <entry>обычный текст</entry> + <entry><literal>if</literal></entry> + <entry>никакой, <option>-p</option> или + <option>-l</option></entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>В нашем примере использование <command>lpr -d</command> означает, + что для принтера должна быть задана характеристика + <literal>df</literal> в записи в файле + <filename>/etc/printcap</filename>.</para> + + <indexterm><primary>FORTRAN</primary></indexterm> + <para>Вопреки мнению многих, форматы вроде текста на языке FORTRAN + и plot, вероятно, устарели. У себя на машине вы можете дать + новые значения этим или любым другим опциям форматирования, + установив соответствующие специализированные фильтры. Например, + пусть необходимо напрямую печатать файлы Printerleaf (файлы + настольной издательской системы Interleaf), но вообще вы не собираетесь + печатать файлы типа plot. Можно установить фильтр преобразования + Printerleaf в качестве значения характеристики <literal>gf</literal> + и научить своих пользователей, что команда <command>lpr -g</command> + означает <quote>печатать файлы Printerleaf</quote>.</para> + </sect4> + + <sect4> + <title>Установка фильтров преобразования</title> + + <para>Поскольку фильтры преобразования представляют собой программы, + не входящие в базовую поставку FreeBSD, их, видимо, надо помещать + в каталоге <filename>/usr/local</filename>. Популярное + местонахождение — каталог <filename>/usr/local/libexec</filename>, + поскольку эти фильтры являются специализированными программами для + выполнения системой <application>LPD</application>; обычным + пользователям никогда не понадобится их выполнять.</para> + + <para>Для включения фильтра преобразования, укажите его полное + имя в качестве значения соответствующей характеристики для принтера + в файле <filename>/etc/printcap</filename>.</para> + + <para>В качестве примера, давайте добавим фильтр преобразования DVI + в запись для принтера <literal>bamboo</literal>. Вот опять пример + файла <filename>/etc/printcap</filename>, с новой характеристикой + <literal>df</literal> для принтера <literal>bamboo</literal>.</para> + + <programlisting># +# /etc/printcap для хоста rose - добавлен фильтр df для bamboo +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ + :if=/usr/local/libexec/psif:\ + :df=/usr/local/libexec/psdf:</programlisting> + + <para>Фильтр DVI — скрипт командного интерпретатора по имени + <filename>/usr/local/libexec/psdf</filename>. Вот его текст:</para> + + <programlisting>#!/bin/sh +# +# psdf - фильтр принтера, преобразующий DVI в PostScript +# Установлен в /usr/local/libexec/psdf +# +# Вызывается системой lpd при выполнении пользователем команды lpr -d +# +exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"</programlisting> + + <para>Это скрипт выполняет команду <command>dvips</command> в режиме + фильтрования (аргумент <option>-f</option>) входного потока, + представляющего собой задание для печати. Затем запускается + фильтр &postscript;-принтера <command>lprps</command> (см. раздел + <link linkend="printing-advanced-if-conversion">Прием заданий с + обычным текстом на &postscript;-принтеры</link>) с аргументами, + переданными системой <application>LPD</application> этому скрипту. + Команда <command>lprps</command> будет использовать эти аргументы + для учета распечатанных страниц.</para> + </sect4> + + <sect4> + <title>Дополнительные примеры фильтров преобразования</title> + + <para>Поскольку нет фиксированного набора шагов для установки + фильтров преобразования, я просто представлю дополнительные + примеры. Используйте их в качестве руководства при создании + собственных фильтров. Используйте их непосредственно, если + нужно.</para> + + <para>Следующий пример фильтра преобразует растровый файл (точнее, + GIF-файл) для печати на принтере Hewlett Packard LaserJet III-Si:</para> + + <programlisting>#!/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</programlisting> + + <para>Он работает путем преобразования GIF-файла в переносимый формат anymap, + его — в переносимый формат graymap, затем — в переносимый bitmap, + а уже его — в данные, подходящие для LaserJet/PCL.</para> + + <para>Вот файл <filename>/etc/printcap</filename> с записью для + принтера, в которой используется представленный выше фильтр:</para> + + <programlisting># +# /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:</programlisting> + + <para>Следующий скрипт является фильтром преобразования для печати + данных troff, получаемых из системы набора groff, на + &postscript;-принтере <literal>bamboo</literal>:</para> + + <programlisting>#!/bin/sh +# +# pstf - Преобразует выдаваемые groff данные troff в PS и печатает. +# Установлен в /usr/local/libexec/pstf +# +exec grops | /usr/local/libexec/lprps "$@"</programlisting> + + <para>Представленный выше скрипт снова использует команду + <command>lprps</command> для взаимодействия с принтером. + Если принтер подключен к параллельному порту, придется + использовать следующий скрипт:</para> + + <programlisting>#!/bin/sh +# +# pstf - Преобразует выдаваемые groff данные troff в PS и печатает. +# Установлен в /usr/local/libexec/pstf +# +exec grops</programlisting> + + <para>Вот и все. Вот какую запись надо добавить в файл + <filename>/etc/printcap</filename>, чтобы включить этот фильтр:</para> + + <programlisting>:tf=/usr/local/libexec/pstf:</programlisting> + + <para>Вот пример, который пригодится старым специалистам по языку FORTRAN. + Это фильтр для печати текста программы на языке FORTRAN на любом принтере, + который может непосредственно печатать обычный текст. Мы установим его + для принтера <literal>teak</literal>:</para> + + <programlisting>#!/bin/sh +# +# hprf - Фильтр текста на языке FORTRAN для LaserJet 3si: +# Установлен в /usr/local/libexec/hprf +# + +printf "\033&k2G" && fpr && printf "\033&l0H" && + exit 0 +exit 2</programlisting> + + <para>Надо добавить следующую строку к записи в файле + <filename>/etc/printcap</filename> для принтера + <literal>teak</literal>, чтобы включить этот фильтр:</para> + + <programlisting>:rf=/usr/local/libexec/hprf:</programlisting> + + <para>Перейдем к последнему, более сложному примеру. Мы добавим фильтр + DVI для уже использовавшегося принтера LaserJet по имени + <literal>teak</literal>. Сначала простая часть: изменить файл + <filename>/etc/printcap</filename>, указав местонахождение + фильтра DVI:</para> + + <programlisting>:df=/usr/local/libexec/hpdf:</programlisting> + + <para>А теперь — часть посложнее: создать фильтр. Для этого нам + понадобится программа преобразования DVI в LaserJet/PCL. Набор + портов FreeBSD (см. <link linkend="ports">Набор портов</link>) + содержит одну: соответствующий пакет называется + <command>dvi2xx</command>. Установка этого пакета дает нам + необходимую программу, <command>dvilj2p</command>, которая + преобразует DVI в коды, подходящие для LaserJet IIp, + LaserJet III и LaserJet 2000.</para> + + <para>Команда <command>dvilj2p</command> требует создания + достаточно сложного фильтра <command>hpdf</command>, поскольку + она не может читать стандартный входной поток. Она хочет работать + с именем файла. Что еще хуже, имя файла должно завершаться + расширением <filename>.dvi</filename>, так что использование + стандартного входного потока <filename>/dev/fd/0</filename> + тоже проблематично. Мы можем обойти эту проблему, создав (символическую) + связь (с именем, завершающимся суффиксом <filename>.dvi</filename>) с + устройством <filename>/dev/fd/0</filename>, тем самым, заставив + команду <command>dvilj2p</command> читать из стандартного входного + потока.</para> + + <para>Единственная оставшаяся проблема состоит в том, что мы не можем + создавать временную связь в каталоге <filename>/tmp</filename>. + Символьные связи принадлежат пользователю и группе <username>bin</username>. + Фильтр же работает от имени пользователя <username>daemon</username>. А у + каталога <filename>/tmp</filename> установлен sticky bit. Фильтр сможет + создать связь, но не сможет почистить за собой и удалить ее, поскольку + связь будет принадлежать другому пользователю.</para> + + <para>Вместо этого, фильтр будет создавать символическую связь в текущем + рабочем каталоге, которым является каталог спулинга (задаваемый + характеристикой <literal>sd</literal> в файле + <filename>/etc/printcap</filename>). Это отличное место для выполнения + фильтрами своих действий, особенно потому, что (иногда) + в каталоге спулинга места больше, чем в <filename>/tmp</filename>.</para> + + <para>Вот, наконец, и сам фильтр:</para> + + <programlisting>#!/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</programlisting> + </sect4> + + <sect4 id="printing-advanced-autoconv"> + <title>Автоматизированное преобразование: альтернатива фильтрам преобразования</title> + + <para>Все эти фильтры преобразования многое дают для среды печати, + но требуют от пользователя указывать (в командной строке + &man.lpr.1;), какой именно фильтр использовать. Если пользователи + не особенно разбираются в компьютерах, необходимость указывать + опцию фильтра будет их раздражать. Что еще хуже, однако, + при неправильном указании опции фильтрования может быть применен + фильтр, не соответствующий типу файла, и принтер испортит несколько + сотен страниц бумаги.</para> + + <para>Вместо установки фильтров преобразования, можно попытаться + заставить текстовый фильтр (поскольку он применяется по умолчанию) + определять тип файла, который его попросили напечатать, и затем + автоматически вызывать соответствующий фильтр преобразования. + В этом могут помочь утилиты вроде <command>file</command>. Конечно, + будет сложно различать <emphasis>некоторые</emphasis> типы + файлов — и, конечно же, можно задавать фильтры преобразования + только для них.</para> + + <indexterm><primary>apsfilter</primary></indexterm> + <indexterm> + <primary>печать</primary> + <secondary>фильтры</secondary> + <tertiary>apsfilter</tertiary> + </indexterm> + <para>В наборе портов FreeBSD есть текстовый фильтр, выполняющий + автоматическое преобразование; это <command>apsfilter</command>. + Он может выявлять обычный текст, &postscript; и файлы DVI, + выполнять соответствующие преобразования и печатать + результат.</para> + </sect4> + </sect3> + + <sect3 id="printing-advanced-of"> + <title>Выходные фильтры</title> + + <para>Система спулинга <application>LPD</application> поддерживает еще + один тип фильтров, который мы еще не рассматривали: выходные фильтры. + Выходной фильтр предназначен только для печати обычного текста, + как текстовый фильтр, но с множеством упрощений. Если вы используете + выходной фильтр, а текстовый фильтр не задан, то:</para> + + <itemizedlist> + <listitem> + <para>Система <application>LPD</application> запускает выходной + фильтр один раз для всего задания, а не для каждого файла задания.</para> + </listitem> + + <listitem> + <para>Система <application>LPD</application> не пытается определить начало + или конец файлов в задании для выходного фильтра.</para> + </listitem> + + <listitem> + <para>Система <application>LPD</application> не передает выходному + фильтру имя пользователя или хоста, так что этот фильтр не предназначен + для учета использования принтера. Фактически, он получает всего два + аргумента:</para> + + <cmdsynopsis> + <command>имя-фильтра</command> + <arg choice="plain">-w<replaceable>ширина</replaceable></arg> + <arg choice="plain">-l<replaceable>длина</replaceable></arg> + </cmdsynopsis> + + <para>Где <replaceable>ширина</replaceable> берется из характеристики + <literal>pw</literal>, а <replaceable>длина</replaceable> — из + характеристики <literal>pl</literal> для соответствующего + принтера.</para> + </listitem> + </itemizedlist> + + <para>Не соблазняйтесь простотой выходного фильтра. Если вы хотите, + чтобы каждый файл в задании начинал печататься с новой страницы, + выходной фильтр <emphasis>не поможет</emphasis>. Используйте текстовый + фильтр (также известный как входной); см. раздел + <link linkend="printing-textfilter">Установка текстового фильтра</link>. + Более того, выходной фильтр, фактически, — <emphasis>более + сложный</emphasis>, поскольку он должен проверять посылаемый ему + поток байтов в поисках специальных символов-флагов и посылать себе + сигналы от имени системы <application>LPD</application>.</para> + + <para>Однако выходной фильтр <emphasis>необходим</emphasis>, если + надо выдавать начальные страницы и требуется посылать управляющие + последовательности или другие строки инициализации, чтобы можно было + напечатать начальную страницу. (Но он <emphasis>не поможет</emphasis>, + если необходимо учитывать начальные страницы для пользователя, + поскольку система <application>LPD</application> не передает + выходному фильтру никакой информации о пользователе или хосте.)</para> + + <para>На одном принтере система <application>LPD</application> + позволяет совместно с выходным использовать текстовый или другие + фильтры. В таких случаях, система <application>LPD</application> будет + запускать выходной фильтр только для печати начальной страницы (см. + раздел <link linkend="printing-advanced-header-pages">Начальные + страницы</link>). Система <application>LPD</application> затем + предполагает, что выходной фильтр <emphasis>остановится</emphasis>, + посылая ему два байта: ASCII 031 и ASCII 001. Когда выходной фильтр + видит эти два байта (031, 001), он должен остановиться, посылая + себе сигнал <literal>SIGSTOP</literal>. Когда система + <application>LPD</application> закончит выполнение остальных фильтров, + она перезапускает выходной фильтр, посылая ему сигнал + <literal>SIGCONT</literal>.</para> + + <para>Если есть выходной фильтр, но <emphasis>нет</emphasis> текстового, + и система <application>LPD</application> обрабатывает задания с обычным + текстом, <application>LPD</application> использует для выполнения + задания выходной фильтр. Как уже было сказано, выходной фильтр + будет печатать все файлы задания последовательно, без прогонов + страниц или других настроек бумаги, а это <emphasis>вряд ли</emphasis> + вас устроит. Почти во всех случаях необходим текстовый фильтр.</para> + + <para>Программа <command>lpf</command>, которую мы представили ранее + как текстовый фильтр, может также работать как выходной фильтр. Если + срочно необходим простой выходной фильтр, но вы не хотите писать + код для выявления байтов и посылки сигнала, попробуйте использовать + <command>lpf</command>. Можно также поместить <command>lpf</command> + в скрипт командного интерпретатора для обработки любых + кодов инициализации, которые может потребовать принтер.</para> + </sect3> + + <sect3 id="printing-advanced-lpf"> + <title><command>lpf</command>: текстовый фильтр</title> + + <para>Программа <filename>/usr/libexec/lpr/lpf</filename>, + поставляемая в составе двоичного дистрибутива FreeBSD, + представляет собой текстовый (входной) фильтр, который может + печатать с отступом (если задание послано командой + <command>lpr -i</command>), пропускать все символы на печать + (если задание послано командой <command>lpr -l</command>), + настраивать позицию печати при получении в задании символов + забоя и табуляции, а также учитывать количество напечатанных страниц. + Она может также использоваться как выходной фильтр.</para> + + <para>Программа <command>lpf</command> подходит для многих сред печати. + И хотя она не позволяет посылать на принтер инициализационные + последовательности, легко написать скрипт командного интерпретатора, + который будет выполнять необходимую инициализацию, а затем вызывать + <command>lpf</command>.</para> + + <indexterm><primary>учет страниц</primary></indexterm> + <indexterm> + <primary>учет</primary> + <secondary>использования принтера</secondary> + </indexterm> + <para>Чтобы программа <command>lpf</command> корректно выполняла учет + страниц, ей необходимо указать корректные значения характеристик + <literal>pw</literal> и <literal>pl</literal> в файле + <filename>/etc/printcap</filename>. Она использует эти значения для + определения того, сколько текста может поместиться на странице и сколько + страниц было в задании пользователя. Подробнее об учете использования + принтера см. в разделе <link linkend="printing-advanced-acct">Учет + использования принтера</link>.</para> + </sect3> + </sect2> + + <sect2 id="printing-advanced-header-pages"> + <title>Начальные страницы</title> + + <para>При наличии <emphasis>множества</emphasis> пользователей, использующих + различные принтеры, вероятно, можно считать <emphasis>начальные + страницы</emphasis> неизбежным злом.</para> + + <indexterm> + <primary>баннерные страницы</primary> + <see>начальные страницы</see> + </indexterm> + <indexterm><primary>начальные страницы</primary></indexterm> + <para>Начальные страницы, которые также называют <emphasis>баннерными</emphasis> + или <emphasis>разделительными страницами</emphasis>, идентифицируют, + кому принадлежат задания после их печати. Обычно информация на них + выдается большими, жирными буквами, возможно, с декоративными рамочками, + чтобы в пачке распечаток они отличались от реальных документов, + образующих задания пользователей. Они позволяют пользователям быстро + находить свои задания. Очевидный недостаток выдачи начальных страниц + состоит в том, что для каждого задания надо печатать на одну страницу + больше, причем, страница эта хоть сколько-нибудь нужна несколько минут, а + затем она оказывается в мусорной корзине или сдается в макулатуру. + (Учтите, что начальная страница выдается в начале задания, а не перед каждым + файлом, так что бумаги может теряться не так уж и много.)</para> + + <para>Система <application>LPD</application> может выдавать заголовочные + страницы для ваших распечаток автоматически, <emphasis>если</emphasis> + ваш принтер может непосредственно печатать обычный текст. Если используется + &postscript;-принтер, потребуется внешняя программа для генерации начальной + страницы; см. <link linkend="printing-advanced-header-pages-ps">Начальные + страницы на &postscript;-принтерах</link>.</para> + + <sect3 id="printing-advanced-header-pages-enabling"> + <title>Включение выдачи начальных страниц</title> + + <para>В разделе <link linkend="printing-simple">Простая настройка + принтера</link> мы отключили выдачу начальных страниц, задав характеристику + <literal>sh</literal> (что означает <quote>suppress header</quote>) в + файле <filename>/etc/printcap</filename>. Для включения + выдачи начальных страниц на принтер, просто удалите характеристику + <literal>sh</literal>.</para> + + <para>Кажется слишком просто, правда?</para> + + <para>Вы правы. <emphasis>Может</emphasis> потребоваться задать выходной + фильтр для посылки строк инициализации на принтер. Вот пример выходного + фильтра для Hewlett Packard PCL-совместимых принтеров:</para> + + <programlisting>#!/bin/sh +# +# hpof - Выходной фильтр для Hewlett Packard PCL-совместимых принтеров +# Установлен в /usr/local/libexec/hpof + +printf "\033&k2G" || exit 2 +exec /usr/libexec/lpr/lpf</programlisting> + + <para>Задайте полное имя выходного фильтра в качестве значения + характеристики <literal>of</literal>. Подробнее об этом см. + в разделе <link linkend="printing-advanced-of">Выходные фильтры</link>.</para> + + <para>Вот пример файла <filename>/etc/printcap</filename> для принтера + <literal>teak</literal>, который мы представили ранее; мы включили + выдачу начальных страниц и добавили показанный выше выходной фильтр:</para> + + <programlisting># +# /etc/printcap для хоста orchid +# +teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ + :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ + :if=/usr/local/libexec/hpif:\ + :vf=/usr/local/libexec/hpvf:\ + :of=/usr/local/libexec/hpof:</programlisting> + + <para>Теперь, когда пользователи выдают задания на принтер + <literal>teak</literal>, они получают начальную страницу с каждым + заданием. Если пользователи хотят тратить время на поиск своих + распечаток, они могут подавить вывод начальных страниц, + посылая задание с опцией <command>lpr -h</command>; + другие опции &man.lpr.1; см. в разделе + <link linkend="printing-lpr-options-misc">Опции начальных + страниц</link>.</para> + + <note> + <para>Система <application>LPD</application> выдает символ прогона + страницы (form feed) после начальной страницы. Если ваш принтер + использует другой символ или последовательность символов + для выброса напечатанной страницы, укажите их в + качестве значения характеристики <literal>ff</literal> + в файле <filename>/etc/printcap</filename>.</para> + </note> + </sect3> + + <sect3 id="printing-advanced-header-pages-controlling"> + <title>Управление начальными страницами</title> + + <para>Включая выдачу начальных страниц, система <application>LPD</application> + будет выдавать длинный <emphasis>длинный заголовок</emphasis>, целую страницу + с большими буквами, идентифицирующими пользователя, хост и задание. Ниже + представлен пример (kelly напечатала задание по имени outline с хоста <hostid>rose</hostid>):</para> + + <programlisting> k ll ll + k l l + k l l + k k eeee l l y y + k k e e l l y y + k k eeeeee l l y y + kk k e l l y y + k k e e l l y yy + k k eeee lll lll yyy y + y + y y + yyyy + + + ll + t l i + t l + oooo u u ttttt l ii n nnn eeee + o o u u t l i nn n e e + o o u u t l i n n eeeeee + o o u u t l i n n e + o o u uu t t l i n n e e + oooo uuu u tt lll iii n n eeee + + + + + + + + + + r rrr oooo ssss eeee + rr r o o s s e e + r o o ss eeeeee + r o o ss e + r o o s s e e + r oooo ssss eeee + + + + + + + + Job: outline + Date: Sun Sep 17 11:04:58 1995</programlisting> + + <para>Система <application>LPD</application> добавляет прогон страницы + после этого текста, чтобы задание начиналось с новой страницы + (если только вы не указали характеристику <literal>sf</literal> (suppress + form feeds) в записи соответствующего принтера в файле + <filename>/etc/printcap</filename>).</para> + + <para>Если вы предпочитаете, чтобы система <application>LPD</application> + создавала <emphasis>короткий заголовок</emphasis>, укажите + характеристику <literal>sb</literal> (short banner) в файле + <filename>/etc/printcap</filename>. Начальная страница будет + иметь следующий вид:</para> + + <programlisting>rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995</programlisting> + + <para>Также по умолчанию система <application>LPD</application> печатает + начальную страницу перед заданием. Для изменения порядка на обратный, + укажите характеристику <literal>hl</literal> (header last) в файле + <filename>/etc/printcap</filename>.</para> + </sect3> + + <sect3 id="printing-advanced-header-pages-accounting"> + <title>Учет начальных страниц</title> + + <para>Использование встроенных начальных страниц системы + <application>LPD</application> порождает определенную парадигму + учета использования принтера: начальные страницы пользователи + <emphasis>не должны оплачивать</emphasis>.</para> + + <para>Почему?</para> + + <para>Поскольку выходной фильтр — единственная внешняя программа, + управляющая выдачей начальных страниц, которая может выполнять учет, + а ей не передают информацию о <emphasis>пользователе или хосте</emphasis> + и учётный файл, так что, она не имеет никакого представления о том, + на чей счет отнести использование принтера. Также недостаточно + просто <quote>добавлять одну страницу</quote> в текстовом фильтре + или в любом из фильтров преобразований (которые имеют информацию + о пользователе и хосте), поскольку пользователи могут подавлять + выдачу начальных страниц с помощью опции <command>lpr -h</command>. + И их заставят оплачивать начальные страницы, которые они не печатали. + Понятно, что опцию <command>lpr -h</command> будут использовать в большинстве + случаев те, кто озабочен проблемами окружающей среды, но вы никак не + можете стимулировать ее использование.</para> + + <para>Также <emphasis>недостаточно</emphasis>, чтобы каждый из фильтров + генерировал собственные начальные страницы (и, тем самым, + мог их учитывать). Если пользователи захотят отказаться от выдачи + начальных страниц и укажут опцию <command>lpr -h</command>, они все + равно их получат, и будут вынуждены оплатить, поскольку система + <application>LPD</application> не передает информации о наличии опции + <option>-h</option> ни одному из этих фильтров.</para> + + <para>Итак, что же вы можете сделать?</para> + + <para>Вы можете:</para> + + <itemizedlist> + <listitem> + <para>Принять парадигму системы <application>LPD</application> и + сделать начальные страницы бесплатными.</para> + </listitem> + + <listitem> + <para>Установить альтернативную систему вместо <application>LPD</application>, + такую как <application>LPRng</application>. В разделе + <link linkend="printing-lpd-alternatives">Альтернативы стандартному + спулеру</link> представлена дополнительная информация о других + системах спулинга, которые можно использовать вместо + <application>LPD</application>. + </para> + </listitem> + + <listitem> + <para>Написать <emphasis>умный</emphasis> выходной фильтр. Обычно + выходной фильтр не предназначен для выполнения чего-то кроме + инициализации принтера и простых преобразований символов. Он + подходит для начальных страниц и заданий с обычным текстом + (когда нет текстового (входного) фильтра). Но, если есть текстовый + фильтр для заданий с обычным текстом, то система + <application>LPD</application> будет запускать выходной фильтр только + для начальных страниц. И выходной фильтр может анализировать + текст начальной страницы, которую генерирует система + <application>LPD</application>, чтобы определить, на счет какого + пользователя и хоста отнести начальную страницу. Единственная + проблема этого метода в том, что выходной фильтр все равно не + знает, какой учетный файл использовать (ему не передают + имя файла, заданное в качестве значения характеристики + <literal>af</literal>), но при наличии хорошо известного учетного + файла, его имя можно явно указать в выходном фильтре. Для + упрощения этапа анализа задайте характеристику + <literal>sh</literal> (short header) в файле + <filename>/etc/printcap</filename>. Повторимся, что это может + оказаться слишком сложным, и пользователи, несомненно, больше оценят + великодушного системного администратора, который сделает начальные + страницы бесплатными.</para> + </listitem> + </itemizedlist> + </sect3> + + <sect3 id="printing-advanced-header-pages-ps"> + <title>Начальные страницы на &postscript;-принтерах</title> + + <para>Как было описано выше, система <application>LPD</application> может + генерировать начальную страницу в виде обычного текста, что подходит для + многих принтеров. Конечно, &postscript;-принтеры не могут непосредственно + печатать обычный текст, так что, для них возможность выдачи начальных + страниц системы <application>LPD</application> бесполезна — или почти + бесполезна.</para> + + <para>Один очевидный способ получить начальные страницы — заставить + каждый фильтр преобразования и текстовый фильтр генерировать начальную + страницу. Эти фильтры должны использовать аргументы имя пользователя и хост + для генерации соответствующей начальной страницы. Недостаток этого + метода состоит в том, что пользователи будут всегда получать начальные + страницы, даже если будут посылать задания с помощью команды + <command>lpr -h</command>.</para> + + <para>Давайте рассмотрим этот метод детально. Следующий сценарий + принимает три аргумента (регистрационное имя пользователя, + имя хоста и имя задания) и создает простую + начальную страницу на языке &postscript;:</para> + + <programlisting>#!/bin/sh +# +# make-ps-header - выдать начальную страницу на языке PostScript в stdout +# Установлен в /usr/local/libexec/make-ps-header +# + +# +# Это единицы измерения PostScript (72 на дюйм). Измените значения для A4 или +# другого используемого формата бумаги: +# +page_width=612 +page_height=792 +border=72 + +# +# Проверяем аргументы +# +if [ $# -ne 3 ]; then + echo "Usage: `basename $0` <user> <host> <job>" 1>&2 + exit 1 +fi + +# +# Сохраняем значения в переменных, в основном, для упрощения понимания +# последующего PostScript-кода. +# +user=$1 +host=$2 +job=$3 +date=`date` + +# +# Посылаем PostScript-код в stdout. +# +exec cat <<EOF +%!PS + +% +% Гарантируем, что не будем влиять на следующее далее задание пользователя +% +save + +% +% Делаем тонкую некрасивую рамку по краям бумаги. +% +$border $border moveto +$page_width $border 2 mul sub 0 rlineto +0 $page_height $border 2 mul sub rlineto +currentscreen 3 -1 roll pop 100 3 1 roll setscreen +$border 2 mul $page_width sub 0 rlineto closepath +0.8 setgray 10 setlinewidth stroke 0 setgray + +% +% Выдаем регистрационное имя пользователя, красивыми, большими и рельефными буквами +% +/Helvetica-Bold findfont 64 scalefont setfont +$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto +($user) show + +% +% Теперь выдаем всякие детали +% +/Helvetica findfont 14 scalefont setfont +/y 200 def +[ (Job:) (Host:) (Date:) ] { +200 y moveto show /y y 18 sub def } +forall + +/Helvetica-Bold findfont 14 scalefont setfont +/y 200 def +[ ($job) ($host) ($date) ] { + 270 y moveto show /y y 18 sub def +} forall + +% +% Вот и все +% +restore +showpage +EOF</programlisting> + + <para>Теперь, каждый из фильтров преобразования и текстовый фильтр + может вызвать этот сценарий, чтобы сначала сгенерировать + начальную страницу, а затем напечатать задание пользователя. + Вот фильтр преобразования DVI, представленный ранее в этом + документе, измененный для выдачи начальной страницы:</para> + + <programlisting>#!/bin/sh +# +# psdf - фильтр преобразования DVI в PostScript +# Установлен в /usr/local/libexec/psdf +# +# Вызывается системой lpd при выполнении пользователем команды lpr -d +# + +orig_args="$@" + +fail() { + echo "$@" 1>&2 + exit 2 +} + +while getopts "x:y:n:h:" option; do + case $option in + x|y) ;; # Ignore + n) login=$OPTARG ;; + h) host=$OPTARG ;; + *) echo "LPD started `basename $0` wrong." 1>&2 + exit 2 + ;; + esac +done + +[ "$login" ] || fail "No login name" +[ "$host" ] || fail "No host name" + +( /usr/local/libexec/make-ps-header $login $host "DVI File" + /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args</programlisting> + + <para>Обратите внимание, как фильтр должен анализировать список + аргументов, чтобы определить имя пользователя и имя хоста. + Анализ аргументов в других фильтрах аргументов выполняется точно так же. + Текстовый фильтр принимает, однако, немного другой набор аргументов + (см. раздел <link linkend="printing-advanced-filters">Как работают + фильтры</link>).</para> + + <para>Как уже упоминалось, представленная выше схема хотя и достаточно + проста, но не позволяет учесть опцию <quote>подавить вывод + начальной страницы</quote> (опция <option>-h</option>) команды + <command>lpr</command>. Если пользователи хотят сберечь деревья + (или несколько копеек, если вы берете деньги и за начальные страницы), + они не смогут этого сделать, поскольку каждый фильтр будет + выдавать начальную страницу для каждого задания.</para> + + <para>Чтобы позволить пользователям отключать выдачу начальной страницы для + отдельного задания, надо будет использовать прием, представленный в + разделе <link linkend="printing-advanced-header-pages-accounting">Учет + начальных страниц</link>: написать выходной фильтр, который анализирует + сгенерированную системой LPD начальную страницу и выдает ее + &postscript;-версию. Если пользователь посылает задание командой + <command>lpr -h</command>, система <application>LPD</application> + не будет генерировать начальную страницу, как и ваш выходной + фильтр. В противном случае, ваш выходной фильтр будет читать текст, + полученный от системы <application>LPD</application>, и + посылать на принтер соответствующий &postscript;-код для начальной + страницы.</para> + + <para>Если вы используете &postscript;-принтер с последовательным + интерфейсом, можно использовать систему <command>lprps</command>, + которая включает выходной фильтр, <command>psof</command>, + делающий то, что описано выше. Помните, что программа + <command>psof</command> не учитывает напечатанные пользователями + начальные страницы.</para> + </sect3> + </sect2> + + <sect2 id="printing-advanced-network-printers"> + <title>Печать по сети</title> + + <indexterm> + <primary>принтеры</primary> + <secondary>сетевые</secondary> + </indexterm> + <indexterm><primary>печать по сети</primary></indexterm> + <para>FreeBSD поддерживает печать по сети: посылку заданий на + удаленные принтеры. Печатью по сети обычно называют две разные + ситуации:</para> + + <itemizedlist> + <listitem> + <para>Работа с принтером, подключенным к удаленному хосту. Вы + устанавливаете принтер с обычным последовательным или параллельным + интерфейсом на одном хосте. Затем, вы настраиваете систему + <application>LPD</application> для обеспечения доступа к принтеру + с других хостов в сети. В разделе + <link linkend="printing-advanced-network-rm">Принтеры, установленные + на удаленных хостах</link> описано, как это сделать.</para> + </listitem> + + <listitem> + <para>Работа с принтером, подключенным непосредственно к сети. + Принтер имеет сетевой интерфейс, кроме (или вместо) более + традиционного последовательного или параллельного. Такой принтер + может работать следующим образом:</para> + + <itemizedlist> + <listitem> + <para>Он может понимать протокол <application>LPD</application> и + даже поддерживать очереди заданий с удаленных хостов. В этом + случае, он работает просто как обычный хост с системой + <application>LPD</application>. Для настройки такого принтера + следуйте той же процедуре, которая описана в разделе + <link linkend="printing-advanced-network-rm">Принтеры, + установленные на удаленных хостах</link>.</para> + </listitem> + + <listitem> + <para>Он может поддерживать получение потока данных по сети. В + этом случае, вы <quote>подключаете</quote> принтер к одному + из хостов в сети, делая этот хост ответственным за поддержку + очередей заданий и их посылку на принтер. В разделе + <link linkend="printing-advanced-network-net-if">Принтеры с + сетевыми интерфейсами</link> представлен + ряд советов по установке таких принтеров.</para> + </listitem> + </itemizedlist> + </listitem> + </itemizedlist> + + <sect3 id="printing-advanced-network-rm"> + <title>Принтеры, установленные на удаленных хостах</title> + + <para>Система спулинга <application>LPD</application> имеет встроенную + поддержку посылки заданий на другие хосты, на которых тоже работает + система <application>LPD</application> (или совместимая с + <application>LPD</application>). Это позволяет установить принтер + на одном хосте и сделать его доступным с других хостов. Она также + работает с принтерами, имеющими сетевые интерфейсы и понимающими + протокол <application>LPD</application>.</para> + + <para>Для обеспечения такого рода удаленной печати, сначала установите + принтер на одном хосте, <emphasis>хосте принтера</emphasis>, с помощью + процедуры, описанной в разделе <link linkend="printing-simple">Простая + настройка принтера</link>. Выполните любые необходимые дополнительные + настройки, как описано в разделе <link linkend="printing-advanced">Расширенная + настройка принтера</link>. Не забудьте протестировать принтер и убедиться, + обеспечивает ли он заданные возможности системы <application>LPD</application>. + Также проверьте, что <emphasis>локальный хост</emphasis> имеет право + использовать службу <application>LPD</application> на + <emphasis>удаленном хосте</emphasis> (см. раздел + <link linkend="printing-advanced-restricting-remote">Ограничение приема + заданий с удаленных хостов</link>).</para> + + <indexterm> + <primary>принтеры</primary> + <secondary>сетевые</secondary> + </indexterm> + <indexterm><primary>печать по сети</primary></indexterm> + <para>Если вы используете принтер с сетевым интерфейсом, + совместимый с системой <application>LPD</application>, упомянутым + в обсуждении выше <emphasis>хостом принтера</emphasis> будет сам + принтер, а в качестве <emphasis>имени принтера</emphasis> будет + выступать имя, которое вы сконфигурировали для принтера. См. + документацию, поставляемую с принтером и/или сетевым интерфейсом + принтера.</para> + + <tip> + <para>Если вы используете Hewlett Packard Laserjet, то при задании + принтеру имени <literal>text</literal> будет автоматически + выполняться преобразование символа LF в последовательность + CRLF, так что, сценарий <filename>hpif</filename> не понадобится.</para> + </tip> + + <para>Затем, на других хостах, для которых вы хотите обеспечить доступ + к принтеру, создайте запись в их файлах <filename>/etc/printcap</filename> + со следующими компонентами:</para> + + <orderedlist> + <listitem> + <para>Дайте записи любое подходящее имя. Для простоты, однако, + имеет смысл задавать такое же имя и псевдонимы, как и на хосте + принтера.</para> + </listitem> + + <listitem> + <para>Характеристику <literal>lp</literal> оставьте пустой, указав + это явно (<literal>:lp=:</literal>).</para> + </listitem> + + <listitem> + <para>Создайте каталог спулинга и укажите его местонахождение в + характеристике <literal>sd</literal>. Система + <application>LPD</application> будет сохранять задания в нем, + прежде чем они будут посланы на хост принтера.</para> + </listitem> + + <listitem> + <para>Укажите имя хоста принтера в качестве значения характеристики + <literal>rm</literal>.</para> + </listitem> + + <listitem> + <para>Укажите имя принтера на <emphasis>хосте принтера</emphasis> + в качестве значения характеристики <literal>rp</literal>.</para> + </listitem> + </orderedlist> + + <para>Вот и все. Не нужно перечислять фильтры преобразования, размеры + страницы и вообще ничего больше в файле + <filename>/etc/printcap</filename>.</para> + + <para>Рассмотрим пример. На хосте <hostid>rose</hostid> есть два принтера, + <literal>bamboo</literal> и <literal>rattan</literal>. + Мы позволим пользователям хоста <hostid>orchid</hostid> печатать на эти + принтеры. Вот файл <filename>/etc/printcap</filename> для хоста + <hostid>orchid</hostid> (из раздела + <link linkend="printing-advanced-header-pages-enabling">Включение + выдачи начальных страниц</link>). В нем уже есть запись для принтера + <literal>teak</literal>; мы добавили две записи для принтеров на + хосте <hostid>rose</hostid>:</para> + + <programlisting># +# /etc/printcap для хоста orchid - добавлены (удаленные) принтеры на rose +# + +# +# teak - локальный принтер; он подключен непосредственно к orchid: +# +teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ + :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ + :if=/usr/local/libexec/ifhp:\ + :vf=/usr/local/libexec/vfhp:\ + :of=/usr/local/libexec/ofhp: + +# +# rattan подключен к rose; посылать задания для rattan на хост rose: +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: + +# +# bamboo тоже подключен к rose: +# +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:</programlisting> + + <para>Затем достаточно только создать каталоги спулинга на + <hostid>orchid</hostid>:</para> + + <screen>&prompt.root; <userinput>mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput> +&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput> +&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput></screen> + + <para>Теперь пользователи хоста <hostid>orchid</hostid> могут печатать на + принтеры <literal>rattan</literal> и <literal>bamboo</literal>. Если, + например, пользователь на <hostid>orchid</hostid> выполнит команду + + <screen>&prompt.user; <userinput>lpr -P bamboo -d sushi-review.dvi</userinput></screen> + + система <application>LPD</application> на <hostid>orchid</hostid> + будет копировать задание в каталог спулинга + <filename>/var/spool/lpd/bamboo</filename> и учтет, что печатается + задание DVI. Как только на хосте <hostid>rose</hostid> появится место + в каталоге спулинга принтера <literal>bamboo</literal>, две системы + <application>LPD</application> передадут файл на хост <hostid>rose</hostid>. + Файл будет ждать в очереди на <hostid>rose</hostid> пока, наконец, не будет + напечатан. Он будет преобразован из формата DVI в &postscript; (поскольку + <literal>bamboo</literal> является &postscript;-принтером) на хосте + <hostid>rose</hostid>.</para> + </sect3> + + <sect3 id="printing-advanced-network-net-if"> + <title>Принтеры с сетевыми интерфейсами</title> + + <para>Часто при покупке сетевой карты для принтера можно приобрести + две версии: эмулирующую спулер (более дорогая версия) или просто + позволяющую принимать на принтер данные так, как если бы + использовался последовательный или параллельный порт (более + дешевая версия). В этом разделе описано, как использовать + более дешёвую версию. Использование более дорогой версии + описано в предыдущем разделе + <link linkend="printing-advanced-network-rm">Принтеры, установленные + на удаленных хостах</link>.</para> + + <para>Формат файла <filename>/etc/printcap</filename> позволяет + указывать, какой последовательный или параллельный интерфейс + использовать, и (при использовании последовательного интерфейса), + какую установить скорость, использовать ли управление потоком, + размер отступов для табуляций, преобразование символов новой строки + и другие параметры. Но нет способа указать подключение к принтеру, + прослушивающему TCP/IP или другой сетевой порт.</para> + + <para>Для посылки данных на подключенный к сети принтер, надо разработать + программу взаимодействия, которую могут вызывать текстовый фильтр и + фильтры преобразований. Вот один из примеров: скрипт + <command>netprint</command> принимает все данные со стандартного + входного потока и посылает их на принтер, подключенный к сети. + Мы указываем имя хоста принтера в качестве первого аргумента, а + номер порта, к которому надо подключаться — в качестве второго + аргумента команды <command>netprint</command>. Учтите, что + поддерживается только одностороннее взаимодействие (с ОС FreeBSD + на принтер); многие сетевые принтеры поддерживают двустороннее + взаимодействие, и вы можете захотеть его использовать (для + получения состояния принтера, учета и т.п.).</para> + + <programlisting>#!/usr/bin/perl +# +# netprint - Текстовый фильтр для принтера, подключенного к сети +# Установлен в /usr/local/libexec/netprint +# +$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>"; + +$printer_host = $ARGV[0]; +$printer_port = $ARGV[1]; + +require 'sys/socket.ph'; + +($ignore, $ignore, $protocol) = getprotobyname('tcp'); +($ignore, $ignore, $ignore, $ignore, $address) + = gethostbyname($printer_host); + +$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); + +socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) + || die "Can't create TCP/IP stream socket: $!"; +connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!"; +while (<STDIN>) { print PRINTER; } +exit 0;</programlisting> + + <para>Затем можно использовать этот сценарий в различных фильтрах. Пусть + у нас есть строчный принтер Diablo 750-N, подключенный к сети. Принтер + принимает данные на печать через порт 5100. Имя хоста для принтера — + scrivener. Вот текстовый фильтр для этого принтера:</para> + + <programlisting>#!/bin/sh +# +# diablo-if-net - Текстовый фильтр для принтера Diablo `scrivener', +# прослушивающего порт 5100. Установлен в /usr/local/libexec/diablo-if-net +# +exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100</programlisting> + </sect3> + </sect2> + + <sect2 id="printing-advanced-restricting"> + <title>Ограничение использования принтера</title> + + <indexterm> + <primary>принтеры</primary> + <secondary>ограничение доступа</secondary> + </indexterm> + <para>В этом разделе представлена информация об ограничении доступа к + принтеру. Система <application>LPD</application> позволяет управлять + тем, кто может обращаться к принтеру, как локально, так и удаленно, + смогут ли они печатать несколько копий, насколько большими могут + быть их задания и насколько могут разрастаться очереди печати.</para> + + <sect3 id="printing-advanced-restricting-copies"> + <title>Ограничение количества копий</title> + + <para>Система <application>LPD</application> позволяет пользователям + легко печатать несколько копий файла. Пользователи могут печатать + задания с помощью команды <command>lpr -#5</command> + (например) и получать пять копий каждого файла в задании. Хорошо это + или нет — решать вам.</para> + + <para>Если вы считаете, что многочисленные копии только изнашивают ваши + принтеры, можете отключить опцию <option>-#</option> команды + &man.lpr.1;, добавив характеристику <literal>sc</literal> в файл + <filename>/etc/printcap</filename>. Когда пользователи пошлют + задания с опцией <option>-#</option>, они увидят:</para> + + <screen>lpr: multiple copies are not allowed</screen> + + <para>Учтите, что если вы настроили удаленный доступ к принтеру (см. + раздел <link linkend="printing-advanced-network-rm">Принтеры, + установленные на удаленных хостах</link>), необходимо задать + характеристику <literal>sc</literal> также и в файлах + <filename>/etc/printcap</filename> удаленных хостов, иначе + пользователи все равно смогут посылать задания с несколькими + копиями с других хостов.</para> + + <para>Рассмотрим пример. Вот файл <filename>/etc/printcap</filename> + для хоста <hostid>rose</hostid>. Принтер <literal>rattan</literal> + вполне надежен, поэтому мы разрешим печатать на него несколько + копий, но лазерный принтер <literal>bamboo</literal> несколько + более изношен, поэтому мы отключим для него печать нескольких + копий, добавив характеристику <literal>sc</literal>:</para> + + <programlisting># +# /etc/printcap для хоста rose - запрещает печать нескольких копий на bamboo +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:sc:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ + :if=/usr/local/libexec/psif:\ + :df=/usr/local/libexec/psdf:</programlisting> + + <para>Теперь нам также нужно добавить характеристику <literal>sc</literal> + в файле <filename>/etc/printcap</filename> на хосте <hostid>orchid</hostid> + (и раз уж мы его меняем, давайте отключим печать нескольких копий для + принтера <literal>teak</literal>):</para> + + <programlisting># +# /etc/printcap для хоста orchid - отключена печать нескольких копий на +# локальном принтере teak и на удаленном принтере bamboo +teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ + :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\ + :if=/usr/local/libexec/ifhp:\ + :vf=/usr/local/libexec/vfhp:\ + :of=/usr/local/libexec/ofhp: + +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:</programlisting> + + <para>С помощью характеристики <literal>sc</literal> мы предотвращаем + использование команды <command>lpr -#</command>, но это не мешает + пользователям просто выполнить команду &man.lpr.1; несколько раз + или просто послать один и тот же файл несколько раз в одном задании + следующим образом:</para> + + <screen>&prompt.user; <userinput>lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign</userinput></screen> + + <para>Есть много способов предотвратить такое некорректное использование + (включая его игнорирование), которые вы можете разработать самостоятельно.</para> + </sect3> + + <sect3 id="printing-advanced-restricting-access"> + <title>Ограничение доступа к принтерам</title> + + <para>Вы можете управлять тем, кто и на какие принтеры может печатать, + с помощью механизма групп &unix; и характеристики + <literal>rg</literal> в файле <filename>/etc/printcap</filename>. + Просто поместите пользователей, которым необходимо предоставить + доступ к принтеру, в определенную группу, a затем укажите эту + группу в качестве значения характеристики <literal>rg</literal>.</para> + + <para>Пользователи, не входящие в эту группу (включая <username>root</username>) + будут получать уведомление + + <errorname>lpr: Not a member of the restricted group</errorname> + + при попытке печатать на контролируемый принтер.</para> + + <para>Как и в случае с характеристикой <literal>sc</literal> (подавить + выдачу нескольких копий), при необходимости, надо указывать + характеристику <literal>rg</literal> и на удаленных хостах, имеющих + доступ к вашим принтерам (см. раздел + <link linkend="printing-advanced-network-rm">Принтеры, установленные + на удаленных хостах</link>).</para> + + <para>Например, давайте разрешим всем обращаться к принтеру + <literal>rattan</literal>, но только пользователи группы + <literal>artists</literal> смогут использовать принтер + <literal>bamboo</literal>. Вот знакомый уже файл + <filename>/etc/printcap</filename> для хоста <hostid>rose</hostid>:</para> + + <programlisting># +# /etc/printcap для хоста rose - ограничение группы для bamboo +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple: + +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ + :if=/usr/local/libexec/psif:\ + :df=/usr/local/libexec/psdf:</programlisting> + + <para>Давайте не будем менять другой рассматриваемый файл + <filename>/etc/printcap</filename> (для хоста + <hostid>orchid</hostid>). Конечно, в результате, любой пользователь + <hostid>orchid</hostid> может печатать на <literal>bamboo</literal>. + Возможно, на хосте <hostid>orchid</hostid> учетных записей и так + немного, и вы хотите, чтобы все они имели доступ к принтеру. Или нет.</para> + + <note> + <para>Для принтера может быть только одна ограниченная группа.</para> + </note> + </sect3> + + <sect3 id="printing-advanced-restricting-sizes"> + <title>Контроль размеров посылаемых заданий</title> + + <indexterm><primary>задания печати</primary></indexterm> + <para>Если к принтеру обращается несколько пользователей, вам, + возможно, понадобиться установить ограничение на максимальный + размер файлов, которые пользователи могут посылать на печать. + В конечном итоге, размер файловой системы, в которой находятся + каталоги спулинга, ограничен, и надо гарантировать, что + в нем останется место для заданий других пользователей.</para> + + <indexterm> + <primary>задания печати</primary> + <secondary>управления</secondary> + </indexterm> + <para>Система <application>LPD</application> ограничить максимально + допустимый размер файла в задании с помощью характеристики + <literal>mx</literal>. Размер задается в блоках, размер которых, + <literal>BUFSIZ</literal>, составляет 1024 байта. + Если задать этой характеристике значение ноль, размер файла + ограничиваться не будет; однако, если характеристика + <literal>mx</literal> вообще не задана, то будет использоваться + стандартное ограничение — 1000 блоков.</para> + + <note> + <para>Ограничение применяется к <emphasis>файлам в задании</emphasis>, + а <emphasis>не</emphasis> к общему размеру задания.</para> + </note> + + <para>Система <application>LPD</application> не откажется печатать + файл больше максимально допустимого для принтера размера. Вместо + этого, она поставит в очередь часть файла до заданного + предела, и она будет напечатана. Остальное не будет напечатано. + Правильность такого поведения не бесспорна.</para> + + <para>Давайте установим ограничения для принтеров из наших примеров, + <literal>rattan</literal> и <literal>bamboo</literal>. Поскольку + &postscript;-файлы этих художников обычно бывают весьма + большими, мы ограничим их размер пятью мегабайтами. Мы не + будем ограничивать использование обычного текстового строчного + принтера:</para> + + <programlisting># +# /etc/printcap для хоста rose +# + +# +# Без ограничения на размер задания: +# +rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:mx#0:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple: + +# +# Размер файла - не более пяти мегабайт: +# +bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\ + :if=/usr/local/libexec/psif:\ + :df=/usr/local/libexec/psdf:</programlisting> + + <para>Опять таки, ограничения применяются только для локальных + пользователей. Если вы настроили удаленный доступ к принтерам, + для удаленных пользователей эти ограничения не действуют. + Надо задать характеристику <literal>mx</literal> и в файлах + <filename>/etc/printcap</filename> удаленных хостов. Более + детальную информацию по удаленной печати см. в разделе + <link linkend="printing-advanced-network-rm">Принтеры, + установленные на удаленных хостах</link>.</para> + + <para>Есть еще один специализированный способ ограничить + размер заданий печати с удаленных принтеров; см. раздел + <link linkend="printing-advanced-restricting-remote">Ограничение + печати заданий с удаленных хостов</link>.</para> + </sect3> + + <sect3 id="printing-advanced-restricting-remote"> + <title>Ограничение печати заданий с удаленных хостов</title> + + <para>Система спулинга <application>LPD</application> обеспечивает + несколько способов ограничить посылку заданий с удаленных + хостов:</para> + + <variablelist> + <varlistentry> + <term>Ограничения хостов</term> + + <listitem> + <para>Вы можете управлять тем, с каких удаленных хостов + локальная система <application>LPD</application> принимает + запросы, с помощью файлов <filename>/etc/hosts.equiv</filename> и + <filename>/etc/hosts.lpd</filename>. Система + <application>LPD</application> проверяет, поступает ли + входящий запрос с хоста, указанного в одном из этих файлов. + Если нет, система <application>LPD</application> отвергает + запрос.</para> + + <para>Формат этих файлов простой: по одному имени хоста в строке. + Учтите, что файл <filename>/etc/hosts.equiv</filename> также + используется протоколом &man.ruserok.3; и влияет на + программы &man.rsh.1; и &man.rcp.1;, так что, будьте + внимательны.</para> + + <para>Например, вот файл <filename>/etc/hosts.lpd</filename> + для хоста <hostid>rose</hostid>:</para> + + <programlisting>orchid +violet +madrigal.fishbaum.de</programlisting> + + <para>Это означает, что хост <hostid>rose</hostid> будет + принимать запросы с хостов <hostid>orchid</hostid>, + <hostid>violet</hostid> и + <hostid role="fqdn">madrigal.fishbaum.de</hostid>. Если любой + другой хост попытается обратиться к системе + <application>LPD</application> хоста <hostid>rose</hostid>, + его задание будет отвергнуто.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Ограничения размера</term> + + <listitem> + <para>Вы можете управлять тем, сколько свободного места должно + оставаться в файловой системе, в которой находится каталог + спулинга. Создайте файл с именем <filename>minfree</filename> + в каталоге спулинга для локального принтера. Вставьте в этот + файл число, задающее, сколько блоков диска (по 512 байтов) + должно быть свободными, чтобы удаленное задание было принято.</para> + + <para>Это позволяет гарантировать, что удаленные пользователи не + заполнят вашу файловую систему. Можно также использовать этот + механизм для предоставления определенного преимущества + локальным пользователям: они смогут ставить задания в очередь + еще долго после того, как свободного места на диске станет + меньше, чем указано в файле <filename>minfree</filename>.</para> + + <para>Например, давайте добавим файл <filename>minfree</filename> + для принтера <literal>bamboo</literal>. Найдем в файле + <filename>/etc/printcap</filename> каталог спулинга для этого + принтера; вот запись для принтера <literal>bamboo</literal>:</para> + + <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ + :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ + :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\ + :if=/usr/local/libexec/psif:\ + :df=/usr/local/libexec/psdf:</programlisting> + + <para>Каталог спулинга задается характеристикой + <literal>sd</literal>. Укажем, что в файловой системе + должно быть три мегабайта (что составляет 6144 блоков диска) + свободного места, чтобы система <application>LPD</application> + принимала удаленные задания:</para> + + <screen>&prompt.root; <userinput>echo 6144 > /var/spool/lpd/bamboo/minfree + </userinput></screen> + </listitem> + </varlistentry> + + <varlistentry> + <term>Ограничения пользователей</term> + + <listitem> + <para>Вы можете управлять тем, какие удаленные пользователи + смогут печатать на локальные принтеры, задавая характеристику + <literal>rs</literal> в файле <filename>/etc/printcap</filename>. + Когда характеристика <literal>rs</literal> указана в записи + для локально подключенного принтера, система + <application>LPD</application> будет принимать задания с + удаленных хостов, <emphasis>если</emphasis> пользователь, + посылающий задание, также имеет учетную запись с тем же + именем на локальном хосте. В противном случае, + система <application>LPD</application> отвергает задание.</para> + + <para>Эта возможность особенно полезна в среде, где есть, + например, несколько отделов, совместно использующих сеть, + и некоторые пользователи могут переходить из отдела в отдел. + Если дать им учетные записи в системах, они смогут использовать + принтеры из систем в своих отделах. Если вы хотели бы + позволить им использовать <emphasis>только</emphasis> + принтеры, но не остальные ресурсы вашего компьютера, + можно дать им <quote>формальные</quote> учетные записи, + без начального каталога и с бесполезным начальным + командным интерпретатором вроде <filename>/usr/bin/false</filename>.</para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + </sect2> + + <sect2 id="printing-advanced-acct"> + <title>Учет использования принтера</title> + + <indexterm> + <primary>учет</primary> + <secondary>использования принтера</secondary> + </indexterm> + <para>Итак, вам надо брать деньги за распечатки. А почему нет? + Бумага и чернила стоят денег. А есть еще и затраты на + поддержку в работоспособном состоянии — принтеры имеют + множество движущихся частей и склонны к поломкам. Вы проанализировали + состояние принтеров, объемы использования и затраты на их эксплуатацию, + и получили определенную стоимость страницы (или фута, метра или + чего угодно). Теперь, как же начать реально учитывать распечатки?</para> + + <para>Итак, плохая новость состоит в том, что система спулинга + <application>LPD</application> в этом не сильно поможет. Учет сильно + зависит от типа используемого принтера, форматов распечаток и + <emphasis>ваших</emphasis> требований к оплате использования + принтеров.</para> + + <para>Для реализации учета надо изменить текстовый фильтр принтера + (чтобы учитывать обычные текстовые задания) и фильтры преобразования + (чтобы учитывать другие форматы файлов), для подсчета страниц или + запроса количества напечатанных страниц у принтера. Не получится + обойтись использованием простого выходного фильтра, поскольку + он не может выполнять учет. См. раздел + <link linkend="printing-advanced-filter-intro">Фильтры</link>.</para> + + <para>Обычно есть два способа выполнения учета:</para> + + <itemizedlist> + <listitem> + <para><emphasis>Периодический учет</emphasis> — более распространенный + способ, возможно, потому, что он проще. Когда кто-то печатает + задание, фильтр регистрирует пользователя, хост и количество + страниц в учетном файле. Каждый месяц, семестр, год или раз в + любой желаемый период времени, вы собираете учетные файлы для + различных принтеров, суммируете напечатанные каждым пользователем + страницы и выставляете суммы за использование. Затем вы + очищаете все регистрационные файлы, начиная с чистого листа новый + отчетный период.</para> + </listitem> + + <listitem> + <para><emphasis>Постоянный учет</emphasis> используется реже, + вероятно, потому, что сложнее в реализации. Этот метод требует от + фильтров выставлять пользователям суммы за распечатки сразу после + использования принтеров. Как и проверка дисковых квот, этот учет + выполняется немедленно. Вы можете не давать пользователям печатать, + если баланс на их счету стал отрицательным, а также предоставить + им способ проверить и изменить свои <quote>квоты печати</quote>. + Но этот метод требует поддержки базы данных для отслеживания + пользователей и квот.</para> + </listitem> + </itemizedlist> + + <para>Система спулинга <application>LPD</application> легко поддерживает + оба метода: поскольку вы (в большинстве случаев) должны предоставить + фильтры, вам придется предоставить и код для учета. Но есть и + положительный момент: методы учета могут быть сколько угодно гибкими. + Например, можно выбрать периодический или постоянный учет. Можно + выбрать, какую именно информацию регистрировать: имена пользователей, + имена хостов, типы заданий, количество напечатанных страниц, + квадратные метры использованной бумаги, продолжительность печати + заданий, и т.д. Это делается путем изменения фильтров так, чтобы + они сохраняли соответствующую информацию.</para> + + <sect3> + <title>Простая система учета использования принтера</title> + + <para>В составе FreeBSD поставляется две программы, которые можно сразу + использовать для организации простой системы периодического учета. + Речь идет о текстовом фильтре <command>lpf</command>, описанном в + разделе <link linkend="printing-advanced-lpf">lpf: текстовый фильтр</link>, + и о программе &man.pac.8;, обеспечивающей сбор и суммирование + записей из учетных файлов принтеров.</para> + + <para>Как уже упоминалось в разделе, посвященном фильтрам + (<link linkend="printing-advanced-filters">Фильтры</link>), система + <application>LPD</application> при запуске текстового фильтра и + фильтров преобразований передает им имя учетного файла в командной + строке. Фильтры могут использовать соответствующий аргумент, чтобы + определить, куда записывать учетную информацию. Имя этого файла + берется из значения характеристики <literal>af</literal> в файле + <filename>/etc/printcap</filename> и, если не заданно как абсолютное, + интерпретируется относительно каталога спулинга.</para> + + <para>Система <application>LPD</application> запускает <command>lpf</command> + с аргументами ширины и длины страницы (которые берутся из + характеристик <literal>pw</literal> и <literal>pl</literal>). + Программа <command>lpf</command> использует эти аргументы для + определения количества бумаги, которая будет использована. После + посылки файла на принтер она вносит запись в учетный файл. Эти + записи имеют следующий вид:</para> + + <programlisting>2.00 rose:andy +3.00 rose:kelly +3.00 orchid:mary +5.00 orchid:mary +2.00 orchid:zhang</programlisting> + + <para>Следует использовать отдельный учетный файл для каждого принтера, + поскольку программа <command>lpf</command> не реализует механизм + блокирования файлов, и два экземпляра <command>lpf</command> могут + повредить записи друг друга, если записывают одновременно в один + и тот же файл. Простой способ выделить отдельный учетный файл для + каждого принтера — использовать характеристику + <literal>af=acct</literal> в файле <filename>/etc/printcap</filename>. + Тогда каждый учетный файл окажется в каталоге спулинга соответствующего + принтера и будет назван <filename>acct</filename>.</para> + + <para>Когда вы будете готовы выставить пользователям счет за + распечатки, запустите программу &man.pac.8;. Просто перейдите в + каталог спулинга принтера, учетную информацию которого вы хотите + обработать, и введите команду <literal>pac</literal>. Вы + получите итоговые суммы в долларах, как показано ниже:</para> + + <screen> Login pages/feet runs price +orchid:kelly 5.00 1 $ 0.10 +orchid:mary 31.00 3 $ 0.62 +orchid:zhang 9.00 1 $ 0.18 +rose:andy 2.00 1 $ 0.04 +rose:kelly 177.00 104 $ 3.54 +rose:mary 87.00 32 $ 1.74 +rose:root 26.00 12 $ 0.52 + +total 337.00 154 $ 6.74</screen> + + <para>Команда &man.pac.8; принимает следующие аргументы:</para> + + <variablelist> + <varlistentry> + <term><option>-P<replaceable>принтер</replaceable></option></term> + + <listitem> + <para>По какому <replaceable>принтеру</replaceable> подсчитывать + итоговые суммы. Эта опция работает, только если в качестве + значения характеристики <literal>af</literal> в файле + <filename>/etc/printcap</filename> указано абсолютное имя.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-c</option></term> + + <listitem> + <para>Сортировать отчет по сумме, а не по имени пользователя в + алфавитном порядке.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-m</option></term> + + <listitem> + <para>Игнорировать имя хоста в учетных файлах. При указании этой + опции, пользователь <username>smith</username> на хосте + <hostid>alpha</hostid> считается тем же, что и пользователь + <username>smith</username> на хосте <hostid>gamma</hostid>. + Обычно эти пользователи считаются разными.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-p<replaceable>стоимость</replaceable></option></term> + + <listitem> + <para>Вычислять суммы из расчета <replaceable>стоимость</replaceable> + долларов за страницу или за фут, вместо использования + значения характеристики <literal>pc</literal> в файле + <filename>/etc/printcap</filename>, или двух центов (как принято по + умолчанию). Можно задавать <replaceable>стоимость</replaceable> + как число с плавающей запятой.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-r</option></term> + + <listitem> + <para>Изменить порядок сортировки.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-s</option></term> + + <listitem> + <para>Создать итоговый учетный файл и очистить учетный файл.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>имя</replaceable> + <replaceable>…</replaceable></term> + + <listitem> + <para>Выдать учетную информацию только для пользователей с + заданными <replaceable>именами</replaceable>.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>В стандартном отчете, который создает команда &man.pac.8;, + выдается количество страниц, напечатанное каждым из пользователей с + различных хостов. Если для вас хосты не имеют значения (поскольку + пользователи могут работать на любом хосте), выполните команду + <command>pac -m</command> для получения следующих итогов:</para> + + <screen> Login pages/feet runs price +andy 2.00 1 $ 0.04 +kelly 182.00 105 $ 3.64 +mary 118.00 35 $ 2.36 +root 26.00 12 $ 0.52 +zhang 9.00 1 $ 0.18 + +total 337.00 154 $ 6.74</screen> + + + <para>Для получения сумм в долларах программа &man.pac.8; использует + значение характеристики <literal>pc</literal> в файле + <filename>/etc/printcap</filename> (по умолчанию — 200, или 2 цента + за страницу). Укажите в качестве значения этой характеристики, в + сотых долях цента, стоимость страницы или фута, исходя из которой + вы хотите брать деньги за распечатки. Это значение можно + переопределить при вызове команды &man.pac.8; с помощью опции + <option>-p</option>. Но при использовании опции <option>-p</option> + стоимость надо указывать в долларах, а не в сотых долях цента. + Например, команда + + <screen>&prompt.root; <userinput>pac -p1.50</userinput></screen> + + приводит к тому, что страница будет стоить один доллар пятьдесят + центов. Используя эту опцию, можно фактически начинать грести деньги + лопатой.</para> + + <para>Наконец, при выполнении команды <command>pac -s</command> итоговая + информация будет сохранена в итоговом учетном файле, имя которого + строится как имя учетного файла принтера с суффиксом + <literal>_sum</literal>. Затем учетный файл принтера очищается. + Когда команда &man.pac.8; выполняется повторно, она перечитывает + итоговый файл для получения начальных сумм, а затем добавляет + информацию из обычного учетного файла.</para> + </sect3> + + <sect3> + <title>Как можно подсчитать количество напечатанных страниц?</title> + + <para>Для выполнения хоть отдаленно точного учета надо уметь определять, + сколько бумаги использовано для печати задания. Это — основная + проблема учета использования принтеров.</para> + + <para>Для обычных текстовых заданий решить эту проблему не сложно: надо + считать, сколько строк входит в задание, и сравнивать с количеством + строк на страницу, которые поддерживает принтер. Не забывайте + учитывать символы забоя в файлах, которые приводят к перепечатке + строк поверх, а также длинные логические строки, которые переносятся + на несколько физических.</para> + + <para>Текстовый фильтр <command>lpf</command> (представленный в разделе + <link linkend="printing-advanced-lpf">lpf: текстовый фильтр</link>) + учитывает эти вещи при выполнении учета. Если вы пишете текстовый + фильтр, который должен осуществлять учет, может иметь смысл + просмотреть исходный код программы <command>lpf</command>.</para> + + <para>Но как обрабатывать файлы других форматов?</para> + + <para>Ну, для преобразования из DVI в формат LaserJet или из DVI в + &postscript;, можно в фильтре анализировать диагностические + результаты команды <command>dvilj</command> или <command>dvips</command>, + чтобы определить, сколько страниц было преобразовано. Может оказаться + возможным применить этот прием и для других форматов файлов и + программ преобразования.</para> + + <para>Но эти методы несовершенны из-за того, что принтер мог + фактически и не напечатать все эти страницы. Например, он мог + замять бумагу, в нем мог закончиться тонер или он мог вообще + взорваться — и пользователю все равно пришлось бы платить.</para> + + <para>Так что же делать?</para> + + <para>Есть только один <emphasis>надежный</emphasis> способ + <emphasis>точного</emphasis> учета. Купите принтер, который может + сообщать, сколько бумаги он использовал, и подключите его + через последовательный порт или по сети. Практически все + &postscript;-принтеры поддерживают такую возможность. Другие + модели — тоже (сетевые лазерные принтеры Imagen, например). + Измените фильтры для этих принтеров так, чтобы получать количество + использованных страниц после печати каждого задания, и пусть они + записывают учетную информацию <emphasis>только</emphasis> на основе + этого значения. Не надо ни считать строки, ни выполнять + чреватую ошибками обработку файла.</para> + + <para>Конечно, всегда можно поступить великодушно и не брать денег + за распечатки.</para> + </sect3> + </sect2> + </sect1> + + <sect1 id="printing-using"> + <title>Использование принтеров</title> + + <indexterm> + <primary>принтеры</primary> + <secondary>использование</secondary> + </indexterm> + <para>В этом разделе описано, как использовать настроенные принтеры + в ОС FreeBSD. Вот сводка команд пользовательского уровня:</para> + + <variablelist> + <varlistentry> + <term>&man.lpr.1;</term> + + <listitem> + <para>Печать заданий</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>&man.lpq.1;</term> + + <listitem> + <para>Проверка очередей принтеров</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>&man.lprm.1;</term> + + <listitem> + <para>Удаление заданий из очередей принтеров</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Есть также административная команда, &man.lpc.8;, описанная в + разделе <link linkend="printing-lpc">Администрирование принтеров</link>, используемая для управления + принтерами и их очередями.</para> + + <para>Все три команды, &man.lpr.1;, &man.lprm.1; и &man.lpq.1;, + поддерживают опцию <option>-P <replaceable>имя-принтера</replaceable></option>, + позволяющую указать, с каким принтером/очередью из указанных в + файле <filename>/etc/printcap</filename> работать. Это позволяет + посылать, удалять и проверять задания на разных принтерах. Если вы + не используете опцию <option>-P</option>, эти команды используют + принтер, указанный в качестве значения переменной среды + <envar>PRINTER</envar>. Наконец, если переменная среды + <envar>PRINTER</envar> не задана, эти команды по умолчанию + направляются на принтер по имени <literal>lp</literal>.</para> + + <para>Далее термин <emphasis>стандартный принтер</emphasis> + означает принтер, указанный переменной среды <envar>PRINTER</envar> + или принтер по имени <literal>lp</literal>, если переменная + среды <envar>PRINTER</envar> не задана.</para> + + <sect2 id="printing-lpr"> + <title>Задания печати</title> + + <para>Для печати файлов, выполните команду:</para> + + <screen>&prompt.user; <userinput>lpr <replaceable>имя-файла</replaceable> <replaceable>...</replaceable></userinput></screen> + + <indexterm><primary>печать</primary></indexterm> + <para>Эта команда печатает каждый из перечисленных файлов на стандартный + принтер. Если файлы не указаны, команда &man.lpr.1; читает данные для + печати со стандартного входного потока. Например, следующая команда + печатает некоторые важные системные файлы:</para> + + <screen>&prompt.user; <userinput>lpr /etc/host.conf /etc/hosts.equiv</userinput></screen> + + <para>Для выбора конкретного принтера, введите:</para> + + <screen>&prompt.user; <userinput>lpr -P <replaceable>имя-принтера</replaceable> <replaceable>имя-файла</replaceable> <replaceable>...</replaceable></userinput></screen> + + <para>Следующая команда печатает подробный листинг текущего каталога + на принтере <literal>rattan</literal>:</para> + + <screen>&prompt.user; <userinput>ls -l | lpr -P rattan</userinput></screen> + + <para>Поскольку для команды &man.lpr.1; файлы не указаны, + команда <command>lpr</command> читает данные для печати из стандартного + входного потока, который содержит результат выполнения команды + <command>ls -l</command>.</para> + + <para>Команда &man.lpr.1; может также принимать множество опций + для управления форматированием, применения преобразований, + печати нескольких копий и т.д. Дополнительную информацию см. в + разделе <link linkend="printing-lpr-options">Опции печати</link>.</para> + </sect2> + + <sect2 id="printing-lpq"> + <title>Проверка заданий</title> + + <indexterm><primary>задания печати</primary></indexterm> + <para>При печати с помощью команды &man.lpr.1;, данные, которые надо + напечатать, помещаются вместе в пакет, который называют <quote>заданием + печати</quote>, и посылаются системе спулинга <application>LPD</application>. + Каждый принтер имеет очередь заданий, и ваше задание ждет в этой + очереди вместе с другими вашими заданиями и заданиями других + пользователей. Принтер печатает эти задания по принципу первым пришло, + первым выполнено.</para> + + <para>Для получения очереди стандартного принтера, введите команду + &man.lpq.1;. Чтобы указать конкретный принтер, используйте + опцию <option>-P</option>. Например, команда + + <screen>&prompt.user; <userinput>lpq -P bamboo</userinput></screen> + + показывает очередь для принтера по имени <literal>bamboo</literal>. + Вот пример результатов выполнения команды <command>lpq</command>:</para> + + <screen>bamboo is ready and printing +Rank Owner Job Files Total Size +active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes +2nd kelly 10 (standard input) 1635 bytes +3rd mary 11 ... 78519 bytes</screen> + + <para>Показано, что в очереди <literal>bamboo</literal> есть три + задания. Первое задание, посланное пользователем kelly, получило + <quote>номер задания</quote> 9. Каждое задание для принтера получает + уникальный номер задания. В большинстве случаев номер задания можно + игнорировать, но он потребуется, если надо будет отменить задание; + подробнее об этом см. в разделе <link linkend="printing-lprm">Удаление + заданий</link>.</para> + + <para>Задание номер 9 состоит из двух файлов; несколько файлов, + указанных в командной строке &man.lpr.1;, считаются частью одного + задания. Это задание является текущим активным (обратите внимание на + слово <literal>active</literal> в столбце <quote>Rank</quote>), + т.е. принтер должен сейчас печатать это задание. Второе задание + состоит из данных, передаваемых в качестве стандартного входного + потока команде &man.lpr.1;. Третье задание послано пользователем + <username>mary</username>; оно намного больше по объему. + Полное имя файла, который печатается, слишком длинное и не помещается, + поэтому команда &man.lpq.1; просто выдает три точки.</para> + + <para>Самая первая строка результатов команды &man.lpq.1; тоже полезна: + она говорит о том, что сейчас делает принтер (или, по крайней мере, + что он делает по мнению системы <application>LPD</application>).</para> + + <para>Команда &man.lpq.1; также поддерживает опцию <option>-l</option> + для генерации подробного длинного листинга. Вот пример результатов + выполнения команды <command>lpq -l</command>:</para> + + <screen>waiting for bamboo to become ready (offline ?) +kelly: 1st [job 009rose] + /etc/host.conf 73 bytes + /etc/hosts.equiv 15 bytes + +kelly: 2nd [job 010rose] + (standard input) 1635 bytes + +mary: 3rd [job 011rose] + /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes</screen> + </sect2> + + <sect2 id="printing-lprm"> + <title>Удаление заданий</title> + + <para>Если вы передумали печатать задание, можно удалить его из очереди + заданий с помощью команды &man.lprm.1;. Часто можно использовать + &man.lprm.1; для удаления активного задания, но часть задания или + даже все задание все равно может быть напечатано.</para> + + <para>Для удаления задания со стандартного принтера сначала используйте + команду &man.lpq.1; для поиска номера задания. Затем введите команду:</para> + + <screen>&prompt.user; <userinput>lprm <replaceable>номер-задания</replaceable></userinput></screen> + + <para>Для удаления задания с указанного принтера, задайте опцию + <option>-P</option> option. Следующая команда удаляет задание номер + 10 из очереди заданий принтера <literal>bamboo</literal>:</para> + + <screen>&prompt.user; <userinput>lprm -P bamboo 10</userinput></screen> + + <para>Для команды &man.lprm.1; есть ряд сокращений:</para> + + <variablelist> + <varlistentry> + <term>lprm -</term> + + <listitem> + <para>Удаляет все задания (со стандартного принтера), принадлежащие + пользователю, который выполнил команду.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>lprm <replaceable>пользователь</replaceable></term> + + <listitem> + <para>Удаляет все задания (для стандартного принтера), принадлежащие + указанному <replaceable>пользователю</replaceable>. Суперпользователь + может удалять задания других пользователей; обычный пользователь + может удалять только собственные задания.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>lprm</term> + + <listitem> + <para>Если в командной строке не указаны номер задания, имя + пользователя, или указана опция <option>-</option>, + команда &man.lprm.1; удаляет текущее активное задание на стандартном + принтере, если оно принадлежит вам. Суперпользователь может удалять + любое активное задание.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Добавьте опцию <option>-P</option> для любого из перечисленных выше + сокращений, чтобы работать с любым необходимым принтером вместо + стандартного. Например, следующая команда удаляет все задания текущего + пользователя из очереди принтера по имени <literal>rattan</literal>:</para> + + <screen>&prompt.user; <userinput>lprm -P rattan -</userinput></screen> + + <note> + <para>Если вы работаете в сетевой среде, команда &man.lprm.1; позволит + вам удалять задания только с хоста, с которого они были посланы, + даже если тот же принтер доступен и с других хостов. Следующая + последовательность команд демонстрирует это:</para> + + <screen>&prompt.user; <userinput>lpr -P rattan myfile</userinput> +&prompt.user; <userinput>rlogin orchid</userinput> +&prompt.user; <userinput>lpq -P rattan</userinput> +Rank Owner Job Files Total Size +active seeyan 12 ... 49123 bytes +2nd kelly 13 myfile 12 bytes +&prompt.user; <userinput>lprm -P rattan 13</userinput> +rose: Permission denied +&prompt.user; <userinput>logout</userinput> +&prompt.user; <userinput>lprm -P rattan 13</userinput> +dfA013rose dequeued +cfA013rose dequeued + </screen> + </note> + </sect2> + + <sect2 id="printing-lpr-options"> + <title>Не только обычный текст: опции печати</title> + + <para>Команда &man.lpr.1; поддерживает несколько опций, управляющих + форматированием текста, преобразованием графики и других форматов + файлов, выдачей нескольких копий, обработкой задания и др. В этом + разделе описаны эти опции.</para> + + <sect3 id="printing-lpr-options-format"> + <title>Опции форматирования и преобразования</title> + + <para>Следующие опции команды &man.lpr.1; управляют форматированием + файлов в задании. Используйте эти опции, если задание содержит не + простой текст или если вы хотите сформатировать простой текст с + помощью утилиты &man.pr.1;.</para> + + <indexterm><primary>&tex;</primary></indexterm> + <para>Например, следующая команда печатает файл DVI (из системы + верстки &tex;) по имени <filename>fish-report.dvi</filename> + на принтере <literal>bamboo</literal>:</para> + + <screen>&prompt.user; <userinput>lpr -P bamboo -d fish-report.dvi</userinput></screen> + + <para>Эти опции применяются для каждого файла в задании, так что нельзя + смешивать (например) файлы DVI и ditroff в одном задании. Вместо этого + посылайте однотипные файлы отдельными заданиями, используя для каждого + задания соответствующие опции преобразования.</para> + + <note> + <para>Все эти опции, кроме <option>-p</option> и <option>-T</option>, + требуют наличия установленных для целевого принтера фильтров + преобразования. Например, опция <option>-d</option> требует фильтра + преобразования DVI. Подробнее см. в разделе + <link linkend="printing-advanced-convfilters">Фильтры преобразования</link>.</para> + </note> + + <variablelist> + <varlistentry> + <term><option>-c</option></term> + + <listitem> + <para>Печать файлов cifplot.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-d</option></term> + + <listitem> + <para>Печать файлов DVI.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-f</option></term> + + <listitem> + <para>Печать текстовых файлов на языке FORTRAN.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-g</option></term> + + <listitem> + <para>Печать графиков.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-i<replaceable>число</replaceable></option></term> + + <listitem> + <para>Сдвинуть результат вправо на <replaceable>число</replaceable> + столбцов; если <replaceable>число</replaceable> не указано, + сдвиг выполняется на 8 столбцов. Эта опция работает только с + определенными фильтрами преобразования.</para> + + <note> + <para>Не помещайте пробелы между <option>-i</option> и числом.</para> + </note> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-l</option></term> + + <listitem> + <para>Печать текстовых данных буквально, включая управляющие символы.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-n</option></term> + + <listitem> + <para>Печать данных ditroff (device independent troff).</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-p</term> + + <listitem> + <para>Форматировать обычный текст перед печатью утилитой &man.pr.1;. + Подробнее см. &man.pr.1;.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-T <replaceable>заголовок</replaceable></option></term> + + <listitem> + <para>Использовать указанный <replaceable>заголовок</replaceable> + в колонтитуле &man.pr.1; вместо имени файла. Эта опция учитывается + только при использовании вместе с опцией <option>-p</option>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-t</option></term> + + <listitem> + <para>Печать данных troff.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-v</option></term> + + <listitem> + <para>Печать растровых данных.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Вот пример: следующая команда печатает красиво сформатированную + версию справочного руководства по команде &man.ls.1; на стандартный + принтер:</para> + + <screen>&prompt.user; <userinput>zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t</userinput></screen> + + <para>Команда &man.zcat.1; распаковывает исходный код страницы справочного + руководства &man.ls.1; и передает его команде &man.troff.1;, которая + форматирует его и выдает результат в формате GNU troff, передаваемый + команде &man.lpr.1;, посылающей задание спулеру <application>LPD</application>. + Поскольку мы использовали опцию <option>-t</option> команды &man.lpr.1;, + спулер при печати задания будет преобразовывать результат GNU troff в + формат, понятный стандартному принтеру.</para> + </sect3> + + <sect3 id="printing-lpr-options-job-handling"> + <title>Опции обработки заданий</title> + + <para>Следующие опции команды &man.lpr.1; требуют от системы + <application>LPD</application> специальной обработки задания:</para> + + <variablelist> + <varlistentry> + <term>-# <replaceable>копий</replaceable></term> + + <listitem> + <para>Выдавать указанное количество <replaceable>копий</replaceable> + каждого файла в задании вместо одной. Администратор может отключить + эту опцию для уменьшения износа принтера и поощрения использования + ксерокса. См. раздел + <link linkend="printing-advanced-restricting-copies">Ограничение + количества копий</link>.</para> + + <para>В следующем примере на стандартный принтер печатается три + копии файла <filename>parser.c</filename>, а затем — три копии + <filename>parser.h</filename>:</para> + + <screen>&prompt.user; <userinput>lpr -#3 parser.c parser.h</userinput></screen> + </listitem> + </varlistentry> + + <varlistentry> + <term>-m</term> + + <listitem> + <para>Посылать почту после завершения задания печати. При указании + этой опции, система <application>LPD</application> будет посылать + почту на ваше имя после завершения обработки вашего задания. В + сообщении будет сказано, выполнено ли задание успешно или по ходу + была ошибка, и (часто) — в чем она состояла.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-s</term> + + <listitem> + <para>Не копировать файлы в каталог спулинга, а сделать там на них + символические связи.</para> + + <para>Эту опцию имеет смысл использовать при печати больших заданий. + Она экономит место в каталоге спулинга (ваше задание может занять + все свободное место в файловой системе, в которой находится каталог + спулинга). Она также экономит время, поскольку системе + <application>LPD</application> не придется копировать каждый байт + задания в каталог спулинга.</para> + + <para>Есть, однако, и недостаток: поскольку система + <application>LPD</application> будет ссылаться на исходные + файлы непосредственно, вы не сможете изменять или удалять их, + пока они не будут распечатаны.</para> + + <note> + <para>Если вы печатаете на удаленный принтер, система <application>LPD</application> + будет вынуждена, так или иначе, скопировать файлы с локального хоста + на удаленный, поэтому опция <option>-s</option>сэкономит место только + в локальном каталоге спулинга, но не в удаленном. Но, она все равно + полезна.</para> + </note> + </listitem> + </varlistentry> + + <varlistentry> + <term>-r</term> + + <listitem> + <para>Удалять файлы в задании после копирования в каталог спулинга + или после печати, если указана опция <option>-s</option>. Будьте + внимательны при использовании этой опции!</para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3 id="printing-lpr-options-misc"> + <title>Опции начальных страниц</title> + + <para>Эти опции команды &man.lpr.1; изменяют текст, который обычно + выдается на начальной странице задания. Если выдача начальных страниц + для целевого принтера отключена, эти опции не действуют. Информацию по + настройке начальных страниц см. в разделе + <link linkend="printing-advanced-header-pages">Начальные страницы</link>.</para> + + <variablelist> + <varlistentry> + <term>-C <replaceable>текст</replaceable></term> + + <listitem> + <para>Заменить имя хоста на начальной странице + <replaceable>текстом</replaceable>. Обычно на ней выдается имя хоста, + с которого было послано задание.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-J <replaceable>текст</replaceable></term> + + <listitem> + <para>Заменить имя задания на начальной странице + <replaceable>текстом</replaceable>. Имя задания обычно совпадает с + именем первого файла в задании или имеет значение <filename>stdin</filename>, + если печатается стандартный входной поток.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-h</term> + + <listitem> + <para>Не выдавать начальной страницы.</para> + + <note> + <para>В некоторых организациях эта опция может не действовать, что + определяется способом генерации начальных страниц. Подробнее см. в + разделе <link linkend="printing-advanced-header-pages">Начальные + страницы</link>.</para> + </note> + </listitem> + </varlistentry> + </variablelist> + </sect3> + </sect2> + + <sect2 id="printing-lpc"> + <title>Администрирование принтеров</title> + + <para>Как администратор принтеров, вы должны их установить, настроить и + протестировать. С помощью команды &man.lpc.8; вы можете + взаимодействовать с принтерами и другими способами. С помощью + &man.lpc.8; вы можете:</para> + + <itemizedlist> + <listitem> + <para>Запускать и останавливать принтеры</para> + </listitem> + + <listitem> + <para>Включать и отключать их очереди</para> + </listitem> + + <listitem> + <para>Изменять порядок заданий в каждой очереди.</para> + </listitem> + </itemizedlist> + + <para>Начнем с замечания по терминологии: если принтер + <emphasis>остановлен</emphasis>, он не будет печатать ничего из + своей очереди. Пользователи могут продолжать посылать задания, + которые будут ждать в очереди, пока принтер не будет + <emphasis>запущен</emphasis> или пока очередь не будет очищена.</para> + + <para>Если очередь <emphasis>отключена</emphasis>, ни один пользователь + (кроме <username>root</username>) не может посылать задания на + принтер. Во <emphasis>включенную</emphasis> очередь можно посылать + задания. Принтер для отключенной очереди может быть + <emphasis>запущен</emphasis>; при этом он будет продолжать печатать + находящиеся в очереди задания, пока очередь не станет пустой.</para> + + <para>В общем случае, для использования команды &man.lpc.8; необходимо + иметь привилегии <username>root</username>. Обычные пользователи + могут использовать команду &man.lpc.8; только для получения состояния + принтера и перезапуска зависшего принтера.</para> + + <para>Далее представлена сводка команд &man.lpc.8;. Большинство команд + принимает аргумент <replaceable>имя-принтера</replaceable>, задающий, + с каким принтером работать. Можно использовать значение <literal>all</literal> + вместо <replaceable>имени-принтера</replaceable>, означающее все + принтеры, перечисленные в файле <filename>/etc/printcap</filename>.</para> + + <variablelist> + <varlistentry> + <term><command>abort + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Снять текущее задание и остановить принтер. Пользователи могут + продолжать посылать задания, если очередь включена.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>clean + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Удалить старые файлы из каталога спулинга принтера. + Иногда файлы, составляющие задание, не удаляются как положено + системой <application>LPD</application>, особенно если + в ходе печати были ошибки и выполнялось много административных + действий. Эта команда находит файлы, не принадлежащие каталогу + спулинга, и удаляет их.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>disable + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Отключить постановку новых заданий в очередь. Если принтер + работает, он продолжит печатать задания, остающиеся в очереди. + Суперпользователь (<username>root</username>) всегда может посылать + задания, даже в отключенную очередь.</para> + + <para>Эта команда полезна при тестировании вновь установленного + принтера или фильтра: отключаем очередь и посылаем задания как + <username>root</username>. Другие пользователи не смогут посылать + задания, пока вы не закончите тестирование и не включите очередь + повторно командой <command>enable</command>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>down <replaceable>имя-принтера</replaceable> + <replaceable>сообщение</replaceable></command></term> + + <listitem> + <para>Отключить принтер. Аналогична последовательности команд + <command>disable</command> и <command>stop</command>. + Указанное <replaceable>сообщение</replaceable> выдается как + состояние принтера при проверке пользователем очереди принтера + с помощью &man.lpq.1; или запросе его состояния командой + <command>lpc status</command>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>enable + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Включить очередь для принтера. Пользователи могут посылать + задания, но принтер не будет их печатать, пока не будет запущен.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>help + <replaceable>имя-команды</replaceable></command></term> + + <listitem> + <para>Выдать справочную информацию по команде + <replaceable>имя-команды</replaceable>. Если + <replaceable>имя-команды</replaceable> не указано, + выдает сводку по имеющимся командам.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>restart + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Перезапустить принтер. Обычные пользователи могут использовать эту + команду, если в результате неких чрезвычайных обстоятельств система + <application>LPD</application> зависла, но они не могут запустить + принтер, остановленный командами <command>stop</command> или + <command>down</command>. Команда <command>restart</command> + эквивалентна последовательности команд <command>abort</command> + и <command>start</command>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>start + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Запустить принтер. Принтер будет печатать задания, находящиеся в + его очереди.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>stop + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Остановить принтер. Принтер закончит печать текущего задания + и больше ничего из очереди печатать не будет. Хотя принтер и + остановлен, пользователи могут посылать задания во включенную + очередь.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>topq <replaceable>имя-принтера</replaceable> + <replaceable>задание-или-имя-пользователя</replaceable></command></term> + + <listitem> + <para>Переупорядочить очередь для указанного принтера, помещая + указанные по номеру <replaceable>задания</replaceable> или + задания указанного по имени <replaceable>пользователя</replaceable> + в начало очереди. Для этой команды нельзя использовать + <literal>all</literal> в качестве <replaceable>имени-принтера</replaceable>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><command>up + <replaceable>имя-принтера</replaceable></command></term> + + <listitem> + <para>Включить принтер; команда по действию противоположна команде + <command>down</command>. Эквивалентна последовательности команд + <command>start</command> и <command>enable</command>.</para> + </listitem> + </varlistentry> + </variablelist> + + <para>Утилита &man.lpc.8; принимает перечисленные выше команды в + командной строке. Если команда не указана, утилита &man.lpc.8; + входит в интерактивный режим, в котором можно вводить команды, + пока не будет введена команда <command>exit</command>, + <command>quit</command> или символ конца файла.</para> + </sect2> + </sect1> + + <sect1 id="printing-lpd-alternatives"> + <title>Альтернативы стандартному спулеру</title> + + <para>Если вы прочитали все это руководство, к этому моменту вы + знаете практически все, что надо знать о системе спулинга + <application>LPD</application>, входящей в состав ОС FreeBSD. + Вы, возможно, уже осознали многие из ее недостатков, что, естественно, + приводит к вопросу: <quote>Какие еще системы спулинга существуют (и + работают с ОС FreeBSD)</quote>?</para> + + <variablelist> + <varlistentry> + <term>LPRng</term> + + <indexterm><primary>LPRng</primary></indexterm> + <listitem> + <para>Система <application>LPRng</application>, имя которой означает + <quote>LPR: the Next Generation</quote> (LPR: следующее поколение) — + это полностью переписанная система PLP. Патрик Пауэл (Patrick Powell) + и Джастин Мейсон (Justin Mason) (основной специалист, занимающийся + поддержкой PLP) объединили усилия для создания системы + <application>LPRng</application>. Основной сайт по системе + <application>LPRng</application> — + <ulink url="http://www.lprng.org/"></ulink>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>CUPS</term> + + <indexterm><primary>CUPS</primary></indexterm> + <listitem> + <para>Система <application>CUPS</application> (сокращение от Common + UNIX Printing System) предоставляет переносимый механизм печати для + операционных систем, основанных на &unix;. Она была разработана + компанией Easy Software Products в качестве стандартного механизма + печати для всех производителей и пользователей &unix;.</para> + + <para>Система <application>CUPS</application> использует протокол + Internet Printing Protocol (<acronym>IPP</acronym>) для управления + заданиями и очередями. Протоколы Line Printer Daemon (<acronym>LPD</acronym>), + Server Message Block (<acronym>SMB</acronym>) и AppSocket (известный + также как JetDirect) также поддерживаются, но с меньшими возможностями. + Система CUPS добавляет поиск сетевых принтеров и опции печати на + основе PostScript Printer Description (<acronym>PPD</acronym>), для + поддержки практической печати в &unix;.</para> + + <para>Основной сайт по системе <application>CUPS</application> — + <ulink url="http://www.cups.org/"></ulink>.</para> + </listitem> + </varlistentry> + </variablelist> + </sect1> + + <sect1 id="printing-troubleshooting"> + <title>Выявление проблем</title> + + <para>После выполнения простого тестирования с помощью команды + &man.lptest.1; вы можете получить один из следующих результатов вместо + корректной распечатки:</para> + + <variablelist> + <varlistentry> + <term>Все работает, после определенной задержки; или не выдается + распечатанная страница.</term> + + <listitem> + <para>Принтер напечатал все, что нужно, но он на некоторое время + задумывался и ничего не делал. Фактически, могло потребоваться + нажать кнопку PRINT REMAINING или FORM FEED на принтере, чтобы + результаты были выданы.</para> + + <para>Если это произошло, вероятно, принтер ждал, нет ли в задании + еще данных, прежде чем что бы то ни было печатать. Для решения + этой проблемы можно посылать в текстовом фильтре на принтер символ + FORM FEED (или любую необходимую последовательность символов). + Этого обычно достаточно, чтобы принтер немедленно распечатал + любой остающийся в его внутреннем буфере текст. Также полезно + убедиться, что каждое задание печати заканчивается полной страницей, + чтобы следующее задание не начиналось где-то с середины последней + страницы предыдущего задания.</para> + + <para>Следующий измененный скрипт командного интерпретатора + <filename>/usr/local/libexec/if-simple</filename> выдает символ + прогона страницы после посылки задания на принтер:</para> + + <programlisting>#!/bin/sh +# +# if-simple - Простой текстовый входной фильтр для lpd +# Установлен в /usr/local/libexec/if-simple +# +# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра. +# Выдает символ прогона страницы (\f) после печати задания. + +/bin/cat && printf "\f" && exit 0 +exit 2</programlisting> + </listitem> + </varlistentry> + + <varlistentry> + <term>Принтер печатает <quote>лесенкой</quote>.</term> + + <listitem> + <para>Вы получаете на бумаге следующее:</para> + + <programlisting>!"#$%&'()*+,-./01234 + "#$%&'()*+,-./012345 + #$%&'()*+,-./0123456</programlisting> + + <indexterm><primary>MS-DOS</primary></indexterm> + <indexterm><primary>OS/2</primary></indexterm> + <indexterm><primary>ASCII</primary></indexterm> + <para>Вы стали очередной жертвой <emphasis>эффекта лесенки</emphasis>, + вызванного различными интерпретациями того, какие символы должны + обозначать новую строку. Операционные системы &unix;-стиля используют + один символ: ASCII-код 10, перевод строки (line feed — LF). &ms-dos;, + &os2; и другие используют пару символов, ASCII-код 10 + <emphasis>и</emphasis> ASCII-код 13 (возврат каретки, carriage return + или CR). Многие принтеры используют соглашение &ms-dos; для + представления новых строк.</para> + + <para>При печати из FreeBSD в тексте используется только символ перевода + строки. Принтер, встретив символ перевода строки, переходит на + следующую строку, но оставляет ту же горизонтальную позицию на + строке для следующего печатаемого символа. Вот зачем нужен символ + возврата каретки: чтобы перенести следующий печатаемый символ + на левый край бумаги.</para> + + <para>Вот что ОС FreeBSD хочет от принтера:</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="2"> + <tbody> + <row> + <entry>Принтер получает CR</entry> + <entry>Принтер печатает CR</entry> + </row> + + <row> + <entry>Принтер получает LF</entry> + <entry>Принтер печатает CR + LF</entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>Вот несколько способов этого добиться:</para> + + <itemizedlist> + <listitem> + <para>Использовать переключатели конфигурации принтера или панель + управления, чтобы изменить его интерпретацию этих символов. + Поищите как это сделать в руководстве по своему принтеру.</para> + + <note> + <para>Если вы загружаете другие операционные системы, кроме + FreeBSD, может иметь смысл <emphasis>переконфигурировать</emphasis> + принтер для использования такой интерпретации символов CR и LF, + которая принята в этих операционных системах. Затем можно + использовать одно из представленных далее решений.</para> + </note> + </listitem> + + <listitem> + <para>Заставить драйвер последовательного порта FreeBSD автоматически + преобразовывать LF в CR+LF. Конечно, это подойдет + <emphasis>только</emphasis> для принтеров, подключенных к + последовательным портам. Для включения этой возможности используйте + характеристику <literal>ms#</literal> и установите режим + <literal>onlcr</literal> для принтера в файле + <filename>/etc/printcap</filename>.</para> + </listitem> + + <listitem> + <para>Послать <emphasis>управляющий код</emphasis> на принтер, + заставляющий его временно обрабатывать символы LF по-другому. + Управляющие коды, которые может поддерживать ваш принтер, поищите + в руководстве своего принтера. Когда найдете соответствующий + управляющий код, измените текстовый фильтр для посылки сначала + этого кода, а затем — задания печати.</para> + + <indexterm><primary>PCL</primary></indexterm> + <para>Вот пример текстового фильтра для принтеров, понимающих + управляющие последовательности языка Hewlett-Packard PCL. Этот + фильтр заставляет принтер обрабатывать символы LF как LF и CR; + затем он посылает задание; наконец, он посылает символ + прогона страницы для выдачи последней страницы задания. Он должен + работать практически со всеми принтерами Hewlett Packard.</para> + + <programlisting>#!/bin/sh +# +# hpif - Простой текстовый входной фильтр для lpd для принтеров на базе HP-PCL +# Установлен в /usr/local/libexec/hpif +# +# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра. +# Требует от принтера обрабатывать LF как CR+LF. Выдает страницу по окончании. + +printf "\033&k2G" && cat && printf "\033&l0H" && exit 0 +exit 2</programlisting> + + <para>Вот пример файла <filename>/etc/printcap</filename> с хоста + <hostid>orchid</hostid>. К нему через первый параллельный порт + подключен один принтер, Hewlett Packard LaserJet 3Si, по имени + <literal>teak</literal>. Для него в качестве текстового фильтра + используется представленный выше скрипт:</para> + + <programlisting># +# /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:</programlisting> + </listitem> + </itemizedlist> + </listitem> + </varlistentry> + + <varlistentry> + <term>Строки напечатаны одна поверх другой.</term> + + <listitem> + <para>Принтер так и не перешел на следующую строку. Все строки текста + были напечатаны одна поверх другой, на одной строке.</para> + + <para>Эта проблема <quote>обратна</quote> эффекту лесенки, описанному + выше, и встречается намного реже. Каким-то образом, символы LF, + которые ОС FreeBSD использует для завершения строк, обрабатывались + как символы CR и вызывали перевод позиции печати на левый край + бумаги, но не переход на следующую строку.</para> + + <para>Используйте переключатели конфигурации принтера или панель управления + для обеспечения следующей интерпретации символов LF и CR:</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="2"> + <thead> + <row> + <entry>Принтер получает</entry> + <entry>Принтер печатает</entry> + </row> + </thead> + + <tbody> + <row> + <entry>CR</entry> + <entry>CR</entry> + </row> + + <row> + <entry>LF</entry> + <entry>CR + LF</entry> + </row> + </tbody> + </tgroup> + </informaltable> + </listitem> + </varlistentry> + + <varlistentry> + <term>Принтер теряет символы.</term> + + <listitem> + <para>По ходу печати принтер не печатает несколько символов в каждой + строке. Проблема со временем может становиться все хуже, так что + теряется все больше символов.</para> + + <para>Проблема состоит в том, что принтер не справляется с той скоростью, + с которой компьютер посылает данные по последовательной линии (эта + проблема не должна возникать на принтерах, подключенных к параллельным + портам). Есть два способа решить проблему:</para> + + <itemizedlist> + <listitem> + <para>Если принтер поддерживает управление потоком XON/XOFF, + заставить FreeBSD использовать его, указав режим + <literal>ixon</literal> в характеристике <literal>ms#</literal>.</para> + </listitem> + + <listitem> + <para>Если принтер поддерживает управление несущим потоком + (carrier flow control), укажите режим <literal>crtscts</literal> + в характеристике <literal>ms#</literal>. Убедитесь, что кабель, + соединяющий принтер с компьютером, правильно распаян для управления + несущим потоком.</para> + </listitem> + </itemizedlist> + </listitem> + </varlistentry> + + <varlistentry> + <term>Напечатан мусор.</term> + + <listitem> + <para>Принтер напечатал нечто похожее на случайный мусор, а не + требуемый текст.</para> + + <para>Это, обычно, — еще один симптом неправильных параметров + взаимодействия с последовательным принтером. Перепроверьте + скорость взаимодействия в характеристике <literal>br</literal> + и установку четности в характеристике <literal>ms#</literal>; + проверьте, что принтер использует те же установки, которые + заданы в файле <filename>/etc/printcap</filename>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Ничего не произошло.</term> + + <listitem> + <para>Если ничего не произошло, проблема, вероятно, связана с FreeBSD, а + не с оборудованием. Добавьте характеристику журнального файла + (<literal>lf</literal>) в файл <filename>/etc/printcap</filename> для + принтера, работу с которым отлаживаете. Например, вот запись для + принтера <literal>rattan</literal> с характеристикой + <literal>lf</literal>:</para> + + <programlisting>rattan|line|diablo|lp|Diablo 630 Line Printer:\ + :sh:sd=/var/spool/lpd/rattan:\ + :lp=/dev/lpt0:\ + :if=/usr/local/libexec/if-simple:\ + :lf=/var/log/rattan.log</programlisting> + + <para>Затем попытайтесь напечатать снова. Поищите в журнальном файле + (в нашем примере — <filename>/var/log/rattan.log</filename>) + возможные сообщения об ошибках. На основе полученных сообщений + попытайтесь решить проблему.</para> + + <para>Если вы не зададите характеристику <literal>lf</literal>, + система <application>LPD</application> использует по умолчанию + <filename>/dev/console</filename>.</para> + </listitem> + </varlistentry> + </variablelist> + </sect1> +</chapter> + +<!-- + Local Variables: + mode: sgml + sgml-declaration: "../chapter.decl" + sgml-indent-data: t + sgml-omittag: nil + sgml-always-quote-attributes: t + sgml-parent-document: ("../book.sgml" "part" "chapter") + End: +--> |