aboutsummaryrefslogtreecommitdiff
path: root/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'ru_RU.KOI8-R/books/handbook/printing/chapter.sgml')
-rw-r--r--ru_RU.KOI8-R/books/handbook/printing/chapter.sgml4853
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>.
+ Это &mdash; стандартная система управления принтером во 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>Если вы &mdash; единственный пользователь системы, вы можете спросить,
+ зачем возиться со спулером, если управление доступом,
+ страницы заголовка или учет использования принтера вам не нужны. Хотя можно
+ обеспечить непосредственный доступ к принтеру, в любом случае следует
+ использовать спулер, поскольку:</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> &mdash; самая сложная часть.
+ Расширенные опции, вроде выдачи страниц заголовков и учета
+ использования, установить несложно, как только принтер
+ заработает.</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&nbsp;бит/сек, поэтому
+ печатать через них большие графические задания
+ неудобно.</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 &mdash; универсальная последовательная шина), могут работать
+ на еще больших скоростях, чем параллельные или
+ последовательные интерфейсы RS-232. Кабели для них&nbsp;&mdash;
+ простые и дешевые. 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 &mdash;
+ <filename>ppc0</filename>; второй &mdash;
+ <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> кабель соединяет часть
+ штырьков напрямую, другие &mdash; меняет (пересылку данных на приём
+ данных, например), а некоторые &mdash; закорачивает на каждом разъеме.
+ Кабель такого типа также называют кабелем
+ <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>Вам надо также настроить эти параметры взаимодействия с принтером,
+ обычно &mdash; через элементы управления на лицевой панели или переключатели
+ (DIP switches) на принтере. Выберите максимальную скорость передачи
+ <literal>bps</literal> (бит в секунду, иногда &mdash;
+ <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> &mdash; номер последовательного
+ порта, начиная с нуля. Если вы получаете результат, подобный
+ следующему:</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: &lt;Parallel port&gt; 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 &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>Где <replaceable>N</replaceable> &mdash; номер параллельного порта,
+ начиная с нуля.</para>
+ </listitem>
+
+ <listitem>
+ <para>Если принтер понимает &postscript; или другой язык принтера,
+ пошлите на принтер небольшую программу. Введите команду:</para>
+
+ <screen>&prompt.root; <userinput>cat &gt; /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> &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>Где <replaceable>file</replaceable> &mdash; имя файла, содержащего
+ программу, которую вы хотите послать принтеру.</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> &mdash; специальный файл
+ устройства для последовательного порта (<literal>ttyd0</literal>,
+ <literal>ttyd1</literal> и т.д.), <replaceable>bps-rate</replaceable> &mdash;
+ скорость обработки данных принтером, в битах в секунду,
+ а <replaceable>parity</replaceable> &mdash; требуемая принтером четность
+ (значение <literal>even</literal>, <literal>odd</literal>,
+ <literal>none</literal> или <literal>zero</literal>).</para>
+
+ <para>Вот пример записи для принтера, подключенного
+ к третьему последовательному порту на скорости 19200&nbsp;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>&gt;<replaceable>file</replaceable></userinput></screen>
+
+ <para>Где <replaceable>file</replaceable> &mdash; имя файла,
+ содержащего программу. После того, как утилита
+ &man.tip.1; пошлет файл, нажмите требуемую для
+ ввода признака конца файла комбинацию клавиш.</para>
+ </listitem>
+ </itemizedlist>
+ </step>
+ </procedure>
+
+ <para>Вы должны увидеть распечатку. Не переживайте, если текст выглядит
+ не так, как предполагалось; этими проблемами мы займемся позже.</para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-printcap">
+ <title>Включение спулера: файл <filename>/etc/printcap</filename></title>
+
+ <para>Сейчас ваш принтер уже должен быть подключен, ядро
+ (при необходимости) &mdash; сконфигурировано для взаимодействия с ним,
+ и вы смогли послать на принтер простые данные. Теперь мы готовы
+ к конфигурированию системы <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>Первый (простой) шаг &mdash; выбрать имя для принтера.
+ На самом деле, не важно, выберете ли вы функциональное имя или
+ причудливое, поскольку для принтера можно также задать несколько
+ псевдонимов.</para>
+
+ <para>По крайней мере, один из принтеров, указанных в файле
+ <filename>/etc/printcap</filename>, должен иметь псевдоним
+ <literal>lp</literal>. Это &mdash; стандартное имя принтера.
+ Если пользователи не установят переменную среды <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>Следующий шаг в простой настройке спулера &mdash; создать
+ <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> &mdash; к шестому последовательному
+ порту; вот что нужно добавить в файл <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>, &mdash; это программа,
+ которую система <application>LPD</application> запускает при
+ получении задания на
+ печать. Когда система <application>LPD</application> запускает
+ текстовый фильтр для принтера, она направляет на стандартный
+ входной поток фильтра задание печати, а его стандартный выходной
+ поток &mdash; на устройство принтера, заданное характеристикой <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 &amp;&amp; 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> &mdash; имя
+ (или псевдоним) принтера, заданное в файле
+ <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>!"#$%&amp;'()*+,-./01234
+"#$%&amp;'()*+,-./012345
+#$%&amp;'()*+,-./0123456
+$%&amp;'()*+,-./01234567
+%&amp;'()*+,-./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>. Фильтры &mdash; это программы,
+ взаимодействующие с принтером и обеспечивающие учет особенностей
+ устройства и специальных требований. При простой настройке принтера
+ мы установили фильтр для обычного текста &mdash; крайне простой, который
+ должен работать с большинством принтеров (см. раздел
+ <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; &mdash; популярный формат выдачи для многих программ.
+ Некоторые люди даже пишут &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> &mdash; для печати растровых изображений, и
+ так далее. Я рекомендую прочитать этот раздел.</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>, &mdash; достаточно
+ полный, хотя и простой текстовый фильтр для строчных принтеров
+ (и лазерных принтеров, работающих как строчные), поставляемый в
+ составе ОС 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>Как уже упоминалось, фильтр &mdash; это выполняемая программа, запускаемая
+ системой <application>LPD</application> для поддержки специфических
+ особенностей устройства при взаимодействии с принтером.</para>
+
+ <para>Когда системе <application>LPD</application> надо напечатать
+ входящий в задание файл, она запускает программу-фильтр. Стандартный
+ входной поток фильтра связывается с файлом, который надо распечатать,
+ его стандартный выходной поток &mdash; с принтером, а стандартный поток
+ ошибок перенаправляется в файл регистрации ошибок (задается
+ характеристикой <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 &mdash; ширина страницы), указанной в файле
+ <filename>/etc/printcap</filename>, по умолчанию &mdash; 132</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><replaceable>длина</replaceable></term>
+
+ <listitem>
+ <para>значение из характеристики <literal>pl</literal> (page
+ length &mdash; длина страницы), по умолчанию &mdash; 66</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><replaceable>сдвиг</replaceable></term>
+
+ <listitem>
+ <para>сдвиг, заданный командой <command>lpr -i</command>,
+ по умолчанию &mdash; 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> &mdash; значение
+ характеристики <literal>px</literal> (по умолчанию &mdash; 0),
+ а <replaceable>высота-пиксела</replaceable> &mdash; значение характеристики
+ <literal>py</literal> (по умолчанию &mdash; 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>Если вы &mdash; единственный пользователь компьютера и &postscript;-принтера
+ (или принтера на основе другого языка), и вы обещаете никогда не
+ посылать на принтер обычный текст и никогда не использовать возможностей
+ различных программ, требующих посылки на принтер обычного текста,
+ вам можно не заботиться о том, что описано в этом разделе.</para>
+
+ <para>Но, если вы хотите посылать на принтер как задания &postscript;,
+ так и обычный текст, рекомендуется дополнить настройку принтера. Для
+ этого надо, чтобы текстовый фильтр определял, является ли поступающее
+ задание обычным текстом или программой на языке &postscript;. Все
+ &postscript;-задания должны начинаться с <literal>%!</literal> (для
+ других языков принтеров обратитесь к соответствующей документации).
+ Если первые два символа в задании &mdash; именно эти, речь идет о &postscript;,
+ и мы можем остальную часть задания передавать непосредственно. Если же
+ первые два символа в файле &mdash; другие, фильтр будет преобразовывать
+ текст в &postscript; и печатать результат.</para>
+
+ <para>Как нам это сделать?</para>
+
+ <indexterm>
+ <primary>принтеры</primary>
+ <secondary>последовательные</secondary>
+ </indexterm>
+ <para>Если вы используете последовательный принтер, хороший способ
+ достичь поставленной цели состоит в установке <command>lprps</command>.
+ <command>lprps</command> &mdash; это фильтр для &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" &amp;&amp; cat &amp;&amp; printf "\004" &amp;&amp; exit 0
+ exit 2
+else
+ #
+ # Обычный текст, преобразовать его, а затем напечатать.
+ #
+ ( echo "$first_line"; cat ) | /usr/local/bin/textps &amp;&amp; printf "\004" &amp;&amp; exit 0
+ exit 2
+fi</programlisting>
+
+ <para>В представленном выше скрипте, <command>textps</command> &mdash;
+ отдельно установленная программа для преобразования обычного текста в
+ &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;, однако, &mdash;
+ <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&amp;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=- - &amp;&amp; exit 0
+else
+ #
+ # Обычный текст или HP/PCL, поэтому просто печатаем его напрямую; печатаем в
+ # конце символ прогона страницы, чтобы была выдана последняя страница.
+ #
+ echo "$first_line" &amp;&amp; cat &amp;&amp; printf "\033&amp;l0H" &amp;&amp;
+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>. Популярное
+ местонахождение &mdash; каталог <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 &mdash; скрипт командного интерпретатора по имени
+ <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 \
+ &amp;&amp; exit 0 \
+ || exit 2</programlisting>
+
+ <para>Он работает путем преобразования GIF-файла в переносимый формат anymap,
+ его &mdash; в переносимый формат graymap, затем &mdash; в переносимый bitmap,
+ а уже его &mdash; в данные, подходящие для 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&amp;k2G" &amp;&amp; fpr &amp;&amp; printf "\033&amp;l0H" &amp;&amp;
+ 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>А теперь &mdash; часть посложнее: создать фильтр. Для этого нам
+ понадобится программа преобразования 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&gt;&amp;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&amp;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> типы
+ файлов &mdash; и, конечно же, можно задавать фильтры преобразования
+ только для них.</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> &mdash; из
+ характеристики <literal>pl</literal> для соответствующего
+ принтера.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Не соблазняйтесь простотой выходного фильтра. Если вы хотите,
+ чтобы каждый файл в задании начинал печататься с новой страницы,
+ выходной фильтр <emphasis>не поможет</emphasis>. Используйте текстовый
+ фильтр (также известный как входной); см. раздел
+ <link linkend="printing-textfilter">Установка текстового фильтра</link>.
+ Более того, выходной фильтр, фактически, &mdash; <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&amp;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>Поскольку выходной фильтр &mdash; единственная внешняя программа,
+ управляющая выдачей начальных страниц, которая может выполнять учет,
+ а ей не передают информацию о <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> бесполезна &mdash; или почти
+ бесполезна.</para>
+
+ <para>Один очевидный способ получить начальные страницы &mdash; заставить
+ каждый фильтр преобразования и текстовый фильтр генерировать начальную
+ страницу. Эти фильтры должны использовать аргументы имя пользователя и хост
+ для генерации соответствующей начальной страницы. Недостаток этого
+ метода состоит в том, что пользователи будут всегда получать начальные
+ страницы, даже если будут посылать задания с помощью команды
+ <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` &lt;user&gt; &lt;host&gt; &lt;job&gt;" 1&gt;&amp;2
+ exit 1
+fi
+
+#
+# Сохраняем значения в переменных, в основном, для упрощения понимания
+# последующего PostScript-кода.
+#
+user=$1
+host=$2
+job=$3
+date=`date`
+
+#
+# Посылаем PostScript-код в stdout.
+#
+exec cat &lt;&lt;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&gt;&amp;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&gt;&amp;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> принимает все данные со стандартного
+ входного потока и посылает их на принтер, подключенный к сети.
+ Мы указываем имя хоста принтера в качестве первого аргумента, а
+ номер порта, к которому надо подключаться &mdash; в качестве второго
+ аргумента команды <command>netprint</command>. Учтите, что
+ поддерживается только одностороннее взаимодействие (с ОС FreeBSD
+ на принтер); многие сетевые принтеры поддерживают двустороннее
+ взаимодействие, и вы можете захотеть его использовать (для
+ получения состояния принтера, учета и т.п.).</para>
+
+ <programlisting>#!/usr/bin/perl
+#
+# netprint - Текстовый фильтр для принтера, подключенного к сети
+# Установлен в /usr/local/libexec/netprint
+#
+$#ARGV eq 1 || die "Usage: $0 &lt;printer-hostname&gt; &lt;port-number&gt;";
+
+$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', &amp;AF_INET, $printer_port, $address);
+
+socket(PRINTER, &amp;PF_INET, &amp;SOCK_STREAM, $protocol)
+ || die "Can't create TCP/IP stream socket: $!";
+connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
+while (&lt;STDIN&gt;) { print PRINTER; }
+exit 0;</programlisting>
+
+ <para>Затем можно использовать этот сценарий в различных фильтрах. Пусть
+ у нас есть строчный принтер Diablo 750-N, подключенный к сети. Принтер
+ принимает данные на печать через порт 5100. Имя хоста для принтера &mdash;
+ 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>
+ (например) и получать пять копий каждого файла в задании. Хорошо это
+ или нет &mdash; решать вам.</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> вообще не задана, то будет использоваться
+ стандартное ограничение &mdash; 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 &gt; /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>Итак, вам надо брать деньги за распечатки. А почему нет?
+ Бумага и чернила стоят денег. А есть еще и затраты на
+ поддержку в работоспособном состоянии &mdash; принтеры имеют
+ множество движущихся частей и склонны к поломкам. Вы проанализировали
+ состояние принтеров, объемы использования и затраты на их эксплуатацию,
+ и получили определенную стоимость страницы (или фута, метра или
+ чего угодно). Теперь, как же начать реально учитывать распечатки?</para>
+
+ <para>Итак, плохая новость состоит в том, что система спулинга
+ <application>LPD</application> в этом не сильно поможет. Учет сильно
+ зависит от типа используемого принтера, форматов распечаток и
+ <emphasis>ваших</emphasis> требований к оплате использования
+ принтеров.</para>
+
+ <para>Для реализации учета надо изменить текстовый фильтр принтера
+ (чтобы учитывать обычные текстовые задания) и фильтры преобразования
+ (чтобы учитывать другие форматы файлов), для подсчета страниц или
+ запроса количества напечатанных страниц у принтера. Не получится
+ обойтись использованием простого выходного фильтра, поскольку
+ он не может выполнять учет. См. раздел
+ <link linkend="printing-advanced-filter-intro">Фильтры</link>.</para>
+
+ <para>Обычно есть два способа выполнения учета:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Периодический учет</emphasis> &mdash; более распространенный
+ способ, возможно, потому, что он проще. Когда кто-то печатает
+ задание, фильтр регистрирует пользователя, хост и количество
+ страниц в учетном файле. Каждый месяц, семестр, год или раз в
+ любой желаемый период времени, вы собираете учетные файлы для
+ различных принтеров, суммируете напечатанные каждым пользователем
+ страницы и выставляете суммы за использование. Затем вы
+ очищаете все регистрационные файлы, начиная с чистого листа новый
+ отчетный период.</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> могут
+ повредить записи друг друга, если записывают одновременно в один
+ и тот же файл. Простой способ выделить отдельный учетный файл для
+ каждого принтера &mdash; использовать характеристику
+ <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>&hellip;</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> (по умолчанию &mdash; 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>Для выполнения хоть отдаленно точного учета надо уметь определять,
+ сколько бумаги использовано для печати задания. Это &mdash; основная
+ проблема учета использования принтеров.</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>Но эти методы несовершенны из-за того, что принтер мог
+ фактически и не напечатать все эти страницы. Например, он мог
+ замять бумагу, в нем мог закончиться тонер или он мог вообще
+ взорваться &mdash; и пользователю все равно пришлось бы платить.</para>
+
+ <para>Так что же делать?</para>
+
+ <para>Есть только один <emphasis>надежный</emphasis> способ
+ <emphasis>точного</emphasis> учета. Купите принтер, который может
+ сообщать, сколько бумаги он использовал, и подключите его
+ через последовательный порт или по сети. Практически все
+ &postscript;-принтеры поддерживают такую возможность. Другие
+ модели &mdash; тоже (сетевые лазерные принтеры 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>, а затем &mdash; три копии
+ <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> будет посылать
+ почту на ваше имя после завершения обработки вашего задания. В
+ сообщении будет сказано, выполнено ли задание успешно или по ходу
+ была ошибка, и (часто) &mdash; в чем она состояла.</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: следующее поколение) &mdash;
+ это полностью переписанная система PLP. Патрик Пауэл (Patrick Powell)
+ и Джастин Мейсон (Justin Mason) (основной специалист, занимающийся
+ поддержкой PLP) объединили усилия для создания системы
+ <application>LPRng</application>. Основной сайт по системе
+ <application>LPRng</application> &mdash;
+ <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> &mdash;
+ <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 &amp;&amp; printf "\f" &amp;&amp; exit 0
+exit 2</programlisting>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Принтер печатает <quote>лесенкой</quote>.</term>
+
+ <listitem>
+ <para>Вы получаете на бумаге следующее:</para>
+
+ <programlisting>!"#$%&amp;'()*+,-./01234
+ "#$%&amp;'()*+,-./012345
+ #$%&amp;'()*+,-./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 &mdash; 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 по-другому.
+ Управляющие коды, которые может поддерживать ваш принтер, поищите
+ в руководстве своего принтера. Когда найдете соответствующий
+ управляющий код, измените текстовый фильтр для посылки сначала
+ этого кода, а затем &mdash; задания печати.</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&amp;k2G" &amp;&amp; cat &amp;&amp; printf "\033&amp;l0H" &amp;&amp; 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>Это, обычно, &mdash; еще один симптом неправильных параметров
+ взаимодействия с последовательным принтером. Перепроверьте
+ скорость взаимодействия в характеристике <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>Затем попытайтесь напечатать снова. Поищите в журнальном файле
+ (в нашем примере &mdash; <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:
+-->