aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/ru/books/handbook/printing/_index.adoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/ru/books/handbook/printing/_index.adoc')
-rw-r--r--documentation/content/ru/books/handbook/printing/_index.adoc2479
1 files changed, 417 insertions, 2062 deletions
diff --git a/documentation/content/ru/books/handbook/printing/_index.adoc b/documentation/content/ru/books/handbook/printing/_index.adoc
index e994c03150..a00e65ce80 100644
--- a/documentation/content/ru/books/handbook/printing/_index.adoc
+++ b/documentation/content/ru/books/handbook/printing/_index.adoc
@@ -1,12 +1,14 @@
---
-title: Глава 10. Печать
-part: Часть II. Общие задачи
-prev: books/handbook/kernelconfig
+description: 'Эта глава посвящена системе печати в FreeBSD'
next: books/handbook/linuxemu
-showBookMenu: true
-weight: 13
params:
- path: "/books/handbook/printing/"
+ path: /books/handbook/printing/
+part: 'Часть II. Стандартные задачи'
+prev: books/handbook/kernelconfig
+showBookMenu: true
+tags: ["printing", "CUPS", "LPD", "PostScript", "PDLs", "HPLIP", "LPRng"]
+title: 'Глава 11. Печать'
+weight: 14
---
[[printing]]
@@ -17,7 +19,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 10
+:sectnumoffset: 11
:partnums:
:source-highlighter: rouge
:experimental:
@@ -47,2372 +49,725 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-[[printing-synopsis]]
-== Краткий обзор
-
-FreeBSD можно использовать для печати на широком спектре принтеров, от старых матричных до новейших лазерных, без исключений, что позволяет создавать высококачественные распечатки из используемых приложений.
-
-FreeBSD можно также сконфигурировать для работы в качестве сервера печати в сети; в этом качестве FreeBSD может получать задания печати от множества других компьютеров, включая другие компьютеры под управлением ОС FreeBSD, хосты Windows(R) и Mac OS(R). FreeBSD будет гарантировать печать заданий по одному и может сохранять информацию о том, какие пользователи и машины выполняют основную часть печати, выдавать страницы-"баннеры", показывающие, кому принадлежит распечатка, и многое другое.
-
-При прочтении этой главы вы узнаете:
-
-* Как конфигурировать спулер печати FreeBSD.
-* Как устанавливать фильтры печати для специфической обработки определенных заданий печати, включая преобразование поступающих на печать документов в форматы, которые понимает принтер.
-* Как включить при печати колонтитулы или выдачу страниц-баннеров.
-* Как печатать на принтеры, подключенные к другим компьютерам.
-* Как печатать на принтеры, подключенные непосредственно к сети.
-* Как задавать ограничения для принтера, включая ограничение размера заданий печати и запрет печати для отдельных пользователей.
-* Как сохранять статистическую информацию о печати и учитывать использование принтера.
-* Как решать проблемы печати.
-
-Прежде чем читать эту главу, вы должны:
-
-* Знать, как сконфигурировать и установить новое ядро (crossref:kernelconfig[kernelconfig, Настройка ядра FreeBSD]).
-
-[[printing-intro-spooler]]
-== Введение
-
-Для использования принтеров в ОС FreeBSD вы можете настроить их для работы с системой спулинга печати Беркли (Berkeley line printer spooling system), также известной как система спулинга LPD. Это - стандартная система управления принтером во FreeBSD. В этой главе представлена система спулинга LPD и описано ее конфигурирование.
-
-Если вы уже знакомы с LPD или другой системой спулинга печати, вы можете сразу перейти к разделу <<printing-intro-setup,Базовая настройка>>.
-
-LPD управляет всеми аспектами работы принтеров хоста. Она отвечает за несколько вещей:
-
-* Она управляет доступом к непосредственно подключенным принтерам и принтерам, подключенным к другим хостам в сети.
-* Она позволяет пользователям посылать файлы на печать; эти данные называют _заданиями_.
-* Она предотвращает одновременный доступ к принтеру нескольких пользователей путем поддержки _очереди_ для каждого принтера.
-* Она позволяет печатать _страницы заголовка_ (их также называют _баннерными_ или _начальными_ страницами), чтобы пользователи могли легко находить распечатанные задания в пачке распечаток.
-* Она обеспечивает установку параметров взаимодействия для принтеров, подключенных к последовательным портам.
-* Она может отправлять задания по сети спулеру LPD на другом хосте.
-* Она может применять специальные фильтры для форматирования заданий для печати на разных языках описания страниц или задействования специфических возможностей принтера.
-* Она учитывает использование принтера.
-
-С помощью файла конфигурации ([.filename]#/etc/printcap#) и за счет предоставления специальных программ фильтрования, можно потребовать от системы LPD выполнять все или некоторые из перечисленных выше функций на широком спектре принтерного оборудования.
-
-[[printing-intro-why]]
-=== Зачем использовать спулер
-
-Если вы - единственный пользователь системы, вы можете спросить, зачем возиться со спулером, если управление доступом, страницы заголовка или учет использования принтера вам не нужны. Хотя можно обеспечить непосредственный доступ к принтеру, в любом случае следует использовать спулер, поскольку:
-
-* LPD печатает задания в фоновом режиме; вам не придется ждать, пока данные будут скопированы на принтер.
-* LPD позволяет легко пропустить задание печати через фильтры для добавления заголовков с датой/временем или преобразования специального формата файлов (такого как TeX DVI) в формат, который понимает принтер. Вам не придется выполнять эти шаги вручную.
-* Многие свободно распространяемые и коммерческие программы, обеспечивающие возможность печати, обычно предполагают взаимодействие со спулером системы. Путем настройки системы спулинга вы упростите поддержку другого программного обеспечения, которое может быть добавлено в дальнейшем или уже установлено.
-
-[[printing-intro-setup]]
-== Основная настройка
-
-Для использования принтеров с системой спулинга LPD, необходимо настроить как сам принтер, так и программное обеспечение LPD. Этот документ описывает два уровня настройки:
-
-* См. раздел <<printing-simple,Простая настройка принтера>>, чтобы узнать, как подключить принтер, объяснить LPD, как с ним взаимодействовать, и отправлять на принтер простые текстовые файлы.
-* См. раздел <<printing-advanced,Расширенная настройка принтера>>, чтобы узнать, как печатать файлы множества специальных форматов, как печатать страницы заголовка, печатать по сети, управлять доступом к принтерам и учитывать использование принтера.
-
-[[printing-simple]]
-=== Простая настройка принтера
-
-В этом разделе описано, как сконфигурировать принтер и программное обеспечение LPD для использования принтера. Здесь рассматриваются следующие вопросы:
-
-* В разделе <<printing-hardware,Настройка оборудования>> представлены советы по подключению принтера к порту компьютера.
-* В разделе <<printing-software,Настройка программного обеспечения>> показано, как настроить файл конфигурации спулера LPD ([.filename]#/etc/printcap#).
-
-Если вы настраиваете принтер, использующий для принятия заданий печати сетевой протокол, вместо локальных интерфейсов компьютера, см. раздел <<printing-advanced-network-net-if,Принтеры с сетевыми интерфейсами>>.
-
-Хотя этот раздел и назван "Простая настройка принтера", это, на самом деле, достаточно сложно. Заставить принтер работать с компьютером и спулером LPD - самая сложная часть. Расширенные опции, вроде выдачи страниц заголовков и учета использования, установить несложно, как только принтер заработает.
-
-[[printing-hardware]]
-==== Настройка оборудования
-
-В этом разделе описаны различные способы подключения принтера к ПК. Рассматриваются различные порты и кабели, а также параметры конфигурации ядра, которые может потребоваться установить, чтобы ОС FreeBSD могла взаимодействовать с принтером.
-
-Если вы уже подключили ваш принтер и успешно печатали на него в другой операционной системе, можете перейти к разделу <<printing-software,Настройка программного обеспечения>>.
-
-[[printing-ports]]
-===== Порты и кабели
-
-Принтеры, которые продаются сегодня для использования на ПК, обычно поддерживают один или несколько из следующих интерфейсов:
-
-* _Последовательные_ интерфейсы, также известные как RS-232, или COM-порты, используют для посылки данных на принтер последовательный порт компьютера. Последовательные интерфейсы широко распространены в компьютерной индустрии, кабели для них легко найти и просто сделать. Для последовательных интерфейсов иногда нужны специальные кабели, и для их использования может потребоваться настраивать достаточно сложные опции взаимодействия. Большинство последовательных портов ПК имеют максимальную скорость передачи 115200 бит/сек, поэтому печатать через них большие графические задания неудобно.
-* _Параллельные_ интерфейсы используют параллельный порт компьютера для посылки данных на принтер. Параллельные интерфейсы широко распространены на рынке ПК и работают быстрее, чем последовательные RS-232. Кабели легко найти, но сделать самостоятельно сложнее. При использовании параллельных интерфейсов опции взаимодействия обычно задавать не надо, что делает их конфигурирование существенно проще.
-+
-Параллельные интерфейсы иногда называют интерфейсами "Centronics", по названию типа разъема на принтере.
-* Интерфейсы USB (сокращение от Universal Serial Bus - универсальная последовательная шина), могут работать на еще больших скоростях, чем параллельные или последовательные интерфейсы RS-232. Кабели для них - простые и дешевые. USB превосходит последовательный RS-232 и параллельный интерфейсы для печати, но не слишком хорошо поддерживается в UNIX(R)-системах. Обойти эту проблему можно, купив принтер с двумя интерфейсами, USB и параллельным, как у многих принтеров.
-
-В общем случае, параллельные интерфейсы обычно обеспечивают только одностороннюю передачу (с компьютера на принтер), тогда как последовательные и USB поддерживают двустороннюю. Более новые параллельные порты (EPP и ECP) и принтеры могут взаимодействовать в обоих направлениях под FreeBSD, если используется кабель, соответствующий стандарту IEEE-1284.
-
-Двустороннее взаимодействие с принтером через параллельный порт обычно выполняется одним из двух способов. Первый метод опирается на использование специально созданного драйвера принтера для FreeBSD, который поддерживает специфический язык данного принтера. Этот метод типичен для струйных принтеров и может использоваться для получения информации об уровне чернил и другой информации о состоянии. Второй метод используется, когда принтер поддерживает PostScript(R).
-
-Фактически, задания PostScript(R) являются программами, посылаемыми для выполнения принтеру; они вообще могут не выдавать результат на бумагу и возвращать его непосредственно компьютеру. PostScript(R) также использует двустороннее взаимодействие для сообщения компьютеру о проблемах, таких как ошибки в PostScript(R)-программе или замятие бумаги. Такая информация может пригодиться пользователям. Более того, лучший способ эффективного учета использования PostScript(R)-принтера требует двустороннего взаимодействия: вы запрашиваете у принтера значение счетчика страниц (сколько страниц напечатал принтер за все время существования), затем посылаете задание пользователя, затем снова запрашиваете значение его счетчика страниц. Вычитаем одно значение из другого, и узнаем, сколько бумаги потратил пользователь.
-
-[[printing-parallel]]
-===== Параллельные порты
-
-Для подключения принтера через параллельный интерфейс, соедините принтер и компьютер кабелем Centronics. Инструкции для принтера, для компьютера или обе должны полностью описывать эту процедуру.
-
-Помните, какой параллельный порт компьютера вы использовали. Первый параллельный порт в ОС FreeBSD - [.filename]#ppc0#; второй - [.filename]#ppc1#, и так далее. Имена устройств для принтеров используют ту же схему: [.filename]#/dev/lpt0# для принтера на первом параллельном порту и т.д.
-
-[[printing-serial]]
-===== Последовательные порты
-
-Для подключения принтера через последовательный интерфейс, соедините принтер с компьютером подходящим последовательным кабелем. Инструкции для принтера, для компьютера или обе должны полностью описывать эту процедуру.
-
-Если вы не знаете, что такое "подходящий последовательный кабель", можете попробовать использовать один из следующих:
-
-* _Модемный_ кабель соединяет каждый штырёк на одном конце кабеля напрямую с соответствующим штырьком на другом конце. Кабель такого типа также называют кабелем "DTE-to-DCE".
-*
-+
-_Нуль-модемный_ кабель соединяет часть штырьков напрямую, другие - меняет (пересылку данных на приём данных, например), а некоторые - закорачивает на каждом разъеме. Кабель такого типа также называют кабелем "DTE-to-DTE" cable.
-* Кабель _последовательного принтера_, необходимый для некоторых редко используемых принтеров, похож на нуль-модемный кабель, но посылает часть сигналов на соответствующие штырьки, а не закорачивает их.
-
-Вам надо также настроить эти параметры взаимодействия с принтером, обычно - через элементы управления на лицевой панели или переключатели (DIP switches) на принтере. Выберите максимальную скорость передачи `bps` (бит в секунду, иногда - _baud rate_), которую могут поддерживать как компьютер, так и принтер. Выберите 7 или 8 битов данных; четность none, even или odd; и 1 или 2 стоп-бита. Также надо выбрать протокол управления передачей: none или XON/XOFF (также известный как "внутриполосный" или "программный"). Запомните выбранные установки для последующего конфигурирования программного обеспечения.
-
-[[printing-software]]
-==== Настройка программного обеспечения
-
-В этом разделе описана настройка программного обеспечения, необходимая для печати с помощью системы спулинга LPD в ОС FreeBSD.
-
-Вот план действий, которые необходимо выполнить:
-
-[.procedure]
-====
-. При необходимости, сконфигурировать в ядре поддержку порта, к которому подключен принтер; в разделе <<printing-kernel,Конфигурирование ядра>> описано, что надо сделать.
-. Установить режим взаимодействия для параллельного порта, если используется параллельный порт; детали представлены в разделе <<printing-parallel-port-mode,Настройка режима взаимодействия для параллельного порта>>.
-. Проверить, может ли операционная система посылать данные на принтер. В разделе <<printing-testing,Проверка взаимодействия с принтером>> даны советы, как это сделать.
-. Настроить LPD для принтера, изменяя файл [.filename]#/etc/printcap#. Как это сделать описано далее в этой главе.
-====
-
-[[printing-kernel]]
-===== Конфигурирование ядра
-
-Ядро операционной системы компилируется для работы с конкретным набором устройств. Последовательный или параллельный интерфейс для принтера входит в этот набор. Поэтому может понадобиться добавить поддержку для дополнительного последовательного или параллельного порта, если он еще не сконфигурирован в ядре.
-
-Чтобы узнать, поддерживает ли используемое в настоящий момент ядро последовательный интерфейс, наберите:
-
-[source,shell]
-....
-# grep sioN /var/run/dmesg.boot
-....
-
-Где _N_ - номер последовательного порта, начиная с нуля. Если вы получаете результат, подобный следующему:
-
-[source,shell]
-....
-sio2 at port 0x3e8-0x3ef irq 5 on isa
-sio2: type 16550A
-....
-
-значит, ядро поддерживает порт.
-
-Чтобы узнать, поддерживает ли ядро параллельный интерфейс, наберите:
-
-[source,shell]
-....
-# grep ppcN /var/run/dmesg.boot
-....
-
-Где _N_ номер параллельного порта, начиная с нуля. Если вы получаете результат, подобный следующему:
-
-[source,shell]
-....
-ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
-ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
-ppc0: FIFO with 16/16/8 bytes threshold
-....
-
-значит, ядро поддерживает порт.
-
-Может потребоваться переконфигурировать ядро, чтобы операционная система распознала и использовала параллельный или последовательный порт, используемый для подключения принтера.
-
-Чтобы добавить поддержку последовательного порта, обратитесь к разделу, посвященному конфигурированию ядра. Чтобы добавить поддержку параллельного порта, почитайте этот же раздел _и_ следующий раздел.
-
-[[printing-parallel-port-mode]]
-==== Настройка режима взаимодействия для параллельного порта
+Размещение информации на бумаге — это важная функция, несмотря на многочисленные попытки отказаться от неё. Печать состоит из двух основных компонентов. Данные должны быть переданы на принтер и представлены в форме, которую принтер может обработать.
-При использовании параллельного интерфейса можно выбрать, должна ли ОС FreeBSD взаимодействовать с принтером на основе прерываний или путем опроса. Универсальный драйвер принтера (man:lpt[4]) во FreeBSD использует систему man:ppbus[4], которая управляет чипсетом порта с помощью драйвера man:ppc[4].
+[[printing-quick-start]]
+== Быстрый старт
-* Метод взаимодействия _на основе прерываний_ является стандартным для ядра GENERIC. По этому методу, операционная система использует линию запроса прерывания (IRQ line) для определения готовности принтера к приему данных.
-* Метод взаимодействия _путем опроса_ требует от операционной системы постоянно запрашивать принтер, готов ли он к приему данных. Когда он отвечает, что готов, ядро посылает дополнительные данные.
-
-Метод взаимодействия на основе прерываний обычно работает несколько быстрее, но использует ценную линию запроса прерывания. Про некоторые новые принтеры HP утверждают, что они работают некорректно в режиме взаимодействия на основе прерываний, вероятно, из-за некоторой (еще не вполне понятной) проблемы синхронизации. Для этих принтеров необходимо устанавливать режим опроса. Используйте тот режим, который работает. Некоторые принтеры будут работать в обоих режимах, но оказываются крайне медленными в режиме на основе прерываний.
-
-Режим взаимодействия можно установить двумя способами: конфигурируя ядро или с помощью программы man:lptcontrol[8].
-
-_Для установки режима взаимодействия путем конфигурирования ядра:_
+Базовую печать можно быстро настроить. Принтер должен уметь печатать обычный текст `ASCII`. Для печати других типов файлов см. crossref:printing[printing-lpd-filters, Фильтры].
[.procedure]
-====
-
-. Отредактируйте файл конфигурации ядра. Найдите запись `ppc0`. Если вы настраиваете второй параллельный порт, ищите запись `ppc1`. Используйте запись `ppc2` для третьего порта, и так далее.
-+
-** Если необходимо установить режим на основе прерываний, отредактируйте следующую строку:
+****
+. Создайте каталог для хранения файлов во время печати:
+
-[.programlisting]
-....
-hint.ppc.0.irq="N"
-....
-+
-в файле [.filename]#/boot/device.hints#, заменив _N_ соответствующим номером IRQ. Файл конфигурации ядра также должен содержать драйвер man:ppc[4]:
-+
-[source,shell]
+[source, shell]
....
-device ppc
+# mkdir -p /var/spool/lpd/lp
+# chown daemon:daemon /var/spool/lpd/lp
+# chmod 770 /var/spool/lpd/lp
....
+
-** Если необходимо установить режим опроса, удалите из файла [.filename]#/boot/device.hints# следующую строку:
+. Как `root`, создайте файл [.filename]#/etc/printcap# со следующим содержимым:
+
[.programlisting]
....
-hint.ppc.0.irq="N"
+lp:\
+lp=/dev/unlpt0:\ <.>
+sh:\
+mx#0:\
+sd=/var/spool/lpd/lp:\
+lf=/var/log/lpd-errs:
....
-+
-В некоторых случаях, этого недостаточно для перевода порта в режим опроса под FreeBSD. Чаще всего, проблема связана с драйвером man:acpi[4], который может опрашивать и подключать устройства и, тем самым, управлять режимом доступа к порту принтера. Чтобы решить эту проблему, проверьте конфигурацию man:acpi[4].
+
-. Сохраните файл. Затем сконфигурируйте, соберите и установите ядро и перезагрузите систему. Подробнее см. в разделе crossref:kernelconfig[kernelconfig,конфигурирование ядра].
-====
-
-_Для настройки режима взаимодействия с помощью утилиты_ man:lptcontrol[8]:
-
-[.procedure]
-====
-
-. Введите команду:
+<.> Эта строка предназначена для принтера, подключенного к порту `USB`.
+
-[source,shell]
-....
-# lptcontrol -i -d /dev/lptN
-....
-+
-для установки режима взаимодействия на основе прерываний для `lpt__N__`.
-. Введите команду:
+Для принтера, подключённого к параллельному или «принтерному» порту, используйте:
+
-[source,shell]
-....
-# lptcontrol -p -d /dev/lptN
-....
-+
-для установки режима взаимодействия по опросу для `lpt__N__`.
-====
-
-Вы можете поместить эти команды в файл [.filename]#/etc/rc.local# для установки требуемого режима при каждой загрузке системы. Дополнительную информацию об этом ищите на странице справочного руководства man:lptcontrol[8].
-
-[[printing-testing]]
-==== Проверка взаимодействия с принтером
-
-Прежде чем переходить к конфигурированию системы спулинга, надо убедиться, что операционная система может успешно посылать данные на принтер. Намного проще отлаживать взаимодействие с принтером и систему спулинга отдельно.
-
-Для тестирования принтера мы пошлем на него текст. Для принтеров, которые могут непосредственно печатать посланные на них символы, идеально подходит программа man:lptest[1]: она генерирует все 96 печатных символов ASCII в 96 строках.
-
-Для PostScript(R)- (или основанного на другом языке) принтера, необходим более сложный тест. Подойдет небольшая PostScript(R)-программа, вроде следующей:
-
[.programlisting]
....
-%!PS
-100 100 moveto 300 300 lineto stroke
-310 310 moveto /Helvetica findfont 12 scalefont setfont
-(Is this thing working?) show
-showpage
+:lp=/dev/lpt0:\
....
-
-Представленный выше PostScript(R)-код можно поместить в в файл и использовать, как показано в примерах в следующих разделах.
-
-[NOTE]
-====
-Когда в этом документе речь идет о языке принтера, подразумевается язык типа PostScript(R), а не PCL компании Hewlett Packard. Хотя PCL имеет прекрасные функциональные возможности, в нем можно смешивать обычный текст с его управляющими последовательностями. PostScript(R) не позволяет непосредственно печатать обычный текст, и это язык принтера именно того рода, для которого надо выполнять специальные настройки.
-====
-
-[[printing-checking-parallel]]
-===== Проверка параллельного принтера
-
-В этом разделе описано, как проверить, может ли ОС FreeBSD взаимодействовать с принтером, подключенным к параллельному порту.
-
-_Для тестирования принтера на параллельном порту:_
-
-[.procedure]
-====
-. Станьте пользователем `root` с помощью команды man:su[1].
-. Пошлите данные на принтер.
-
-** Если принтер может печатать обычный текст, используйте утилиту man:lptest[1]. Введите команду:
+
-[source,shell]
-....
-# lptest > /dev/lptN
-....
-+
-Где _N_ - номер параллельного порта, начиная с нуля.
-** Если принтер понимает PostScript(R) или другой язык принтера, пошлите на принтер небольшую программу. Введите команду:
+Для принтера, подключенного напрямую к сети, используйте:
+
-[source,shell]
+[.programlisting]
....
-# cat > /dev/lptN
+:lp=:rm=network-printer-name:rp=raw:\
....
-+
-Затем, построчно, _внимательно_ введите программу, поскольку вы не сможете отредактировать строку после нажатия клавиши `RETURN` или `ENTER`. По окончании ввода программы, нажмите `CONTROL+D` или другую комбинацию клавиш, используемую для ввода символа конца файла.
-+
-Можно также поместить программу в файл и выполнить команду:
+
-[source,shell]
-....
-# cat file > /dev/lptN
-....
-+
-Где _file_ - имя файла, содержащего программу, которую вы хотите послать принтеру.
-====
-
-Вы должны увидеть распечатку. Не переживайте, если текст выглядит не так, как предполагалось; этими проблемами мы займемся позже.
-
-[[printing-checking-serial]]
-===== Проверка последовательного принтера
-
-В этом разделе описано, как проверить, может ли ОС FreeBSD взаимодействовать с принтером, подключенным к последовательному порту.
-
-_Для тестирования принтера на последовательном порту:_
-
-[.procedure]
-====
-
-. Станьте пользователем `root` с помощью команды man:su[1].
-. Отредактируйте файл [.filename]#/etc/remote#. Добавьте следующую запись:
+Замените _network-printer-name_ на `DNS` имя хоста сетевого принтера.
+
-[.programlisting]
-....
-printer:dv=/dev/port:br#bps-rate:pa=parity
-....
-+
-Где _port_ - специальный файл устройства для последовательного порта (`ttyd0`, `ttyd1` и т.д.), _bps-rate_ - скорость обработки данных принтером, в битах в секунду, а _parity_ - требуемая принтером четность (значение `even`, `odd`, `none` или `zero`).
-+
-Вот пример записи для принтера, подключенного к третьему последовательному порту на скорости 19200 bps без четности:
+. Включите LPD, отредактировав файл [.filename]#/etc/rc.conf# и добавив следующую строку:
+
[.programlisting]
....
-printer:dv=/dev/ttyd2:br#19200:pa=none
+lpd_enable="YES"
....
+
-. Подключитесь к принтеру с помощью man:tip[1]. Введите команду:
+Запустите службу:
+
-[source,shell]
+[source, shell]
....
-# tip printer
+# service lpd start
+Starting lpd.
....
-+
-Если этот шаг не срабатывает, снова отредактируйте файл [.filename]#/etc/remote# и попробуйте использовать устройство [.filename]#/dev/cuaaN# вместо [.filename]#/dev/ttydN#.
-. Пошлите данные на принтер.
+
-** Если принтер может печатать обычный текст, используйте утилиту man:lptest[1]. Введите команду:
+. Напечатайте тест:
+
-[source,shell]
+[source, shell]
....
-% $lptest
+# printf "1. This printer can print.\n2. This is the second line.\n" | lpr
....
+
-** Если принтер понимает PostScript(R) или другой язык принтера, пошлите на принтер небольшую программу. Вводите программу, построчно, _очень внимательно_, поскольку нажатие клавиши Backspacе или других клавиш редактирования может иметь значение для принтера. Может также понадобиться нажать специальную комбинацию клавиш, обозначающую конец файла, чтобы принтер понял, что получена вся программа. Для PostScript(R)-принтеров нажмите `CONTROL+D`.
-+
-Можно также поместить программу в файл и ввести команду:
+[TIP]
+====
+Если обе строки начинаются не с левого края, а с отступом («ступеньками»), см. crossref:printing[printing-lpd-filters-stairstep, Предотвращение образования ступенек на простых текстовых принтерах].
+====
++
+Текстовые файлы теперь можно печатать с помощью `lpr`. Укажите имя файла в командной строке или передайте вывод напрямую в `lpr`.
+
-[source,shell]
+[source, shell]
....
-% >file
+% lpr textfile.txt
+% ls -lh | lpr
....
-+
-Где _file_ - имя файла, содержащего программу. После того, как утилита man:tip[1] пошлет файл, нажмите требуемую для ввода признака конца файла комбинацию клавиш.
-====
+****
-Вы должны увидеть распечатку. Не переживайте, если текст выглядит не так, как предполагалось; этими проблемами мы займемся позже.
+[[printing-connections]]
+== Подключение принтеров
-[[printing-printcap]]
-==== Включение спулера: файл [.filename]#/etc/printcap#
+Принтеры подключаются к компьютерным системам различными способами. Небольшие настольные принтеры обычно подключаются непосредственно к `USB`-порту компьютера. Более старые принтеры подключаются к параллельному или «принтерному» порту. Некоторые принтеры подключаются напрямую к сети, что упрощает их совместное использование несколькими компьютерами. Некоторые принтеры используют редкое последовательное соединение через serial-порт.
-Сейчас ваш принтер уже должен быть подключен, ядро (при необходимости) - сконфигурировано для взаимодействия с ним, и вы смогли послать на принтер простые данные. Теперь мы готовы к конфигурированию системы LPD для управления доступом к принтеру.
+FreeBSD может взаимодействовать со всеми типами принтеров.
-Система LPD конфигурируется путем редактирования файла [.filename]#/etc/printcap#. Система спулинга LPD читает этот файл при каждом использовании спулера, так что, изменения в файле сразу же учитываются.
-
-Формат файла man:printcap[5] прост. Используйте свой любимый текстовый редактор для изменения файла [.filename]#/etc/printcap#. Формат файла идентичен формату других файлов, описывающих характеристики, например, [.filename]#/usr/shared/misc/termcap# и [.filename]#/etc/remote#. Полная информация о формате представлена на странице справочного руководства man:cgetent[3].
-
-Простое конфигурирование спулера включает следующие шаги:
-
-[.procedure]
-====
-. Выберите имя (и несколько удобных псевдонимов) для принтера и поместите их в файл [.filename]#/etc/printcap#; подробнее об именовании см. в разделе <<printing-naming,Именование принтера>>.
-. Отключите выдачу начальных страниц (которые по умолчанию выдаются), вставив характеристику `sh`; подробнее об этом см. в разделе <<printing-no-header-pages,Подавление выдачи начальных страниц>>.
-. Создайте каталог для спулинга и укажите его местонахождение с помощью характеристики `sd`; подробнее об этом см. в разделе <<printing-spooldir,Создание каталога спулинга>>.
-. Выберите специальный файл устройства [.filename]#/dev# для использования с принтером и укажите его в файле [.filename]#/etc/printcap# с помощью характеристики `lp`; подробнее об этом см. в разделе <<printing-device,Выбор устройства для принтера>>. Кроме того, если принтер подключен к последовательному порту, настройте параметры взаимодействия с помощью характеристики `ms#`, которая обсуждается в разделе <<printing-commparam,Конфигурирование параметров взаимодействия для спулера>>.
-. Установите фильтр для обычного текста; подробнее об этом см. в разделе <<printing-textfilter,Установка текстового фильтра>>.
-. Проверьте настройку, напечатав что-нибудь с помощью команды man:lpr[1]. Подробнее об этом см. в разделах <<printing-trying,Проверка>> и <<printing-troubleshooting,Выявление проблем>>.
-====
-
-[NOTE]
-====
-Принтеры, использующие специальные языки, например, PostScript(R)-принтеры, не могут непосредственно печатать обычный текст. Простая настройка, представленная выше и описанная в следующих разделах, предполагает, что, если вы устанавливаете такой принтер, то будете печатать только файлы, которые он может обработать.
-====
+[[printing-connections-usb]]
+`USB`::
+`USB`-принтеры можно подключить к любому свободному `USB`-порту компьютера.
++
+Когда FreeBSD обнаруживает принтер `USB`, создаются два устройства: [.filename]#/dev/ulpt0# и [.filename]#/dev/unlpt0#. Данные, отправленные на любое из этих устройств, будут переданы принтеру. После каждой печати [.filename]#ulpt0# сбрасывает порт `USB`. Сброс порта может вызывать проблемы с некоторыми принтерами, поэтому обычно используется устройство [.filename]#unlpt0#. [.filename]#unlpt0# не сбрасывает порт USB вообще.
-Пользователи часто предполагают, что они могут печатать обычный текст на любом из установленных в системе принтеров. Программы, взаимодействующие для обеспечения печати с системой LPD, обычно исходят из этого же предположения. Если вы устанавливаете такой принтер и хотите иметь возможность посылать на печать задания на языке принтера _и_ в виде обычного текста, настоятельно рекомендуется добавить дополнительный шаг к представленной выше простой последовательности настройки: установите программу автоматического преобразования обычного текста в PostScript(R) (или другой язык принтера). В разделе <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>> рассказано, как это сделать.
+[[printing-connections-parallel]]
+Параллельный порт (`IEEE`-1284)::
+Параллельный порт устройства это [.filename]#/dev/lpt0#. Это устройство присутствует независимо от того, подключен принтер или нет, оно не определяется автоматически.
++
+Производители в основном отказались от этих «устаревших» портов, и многие компьютеры больше их не имеют. Для подключения параллельного принтера к порту `USB` можно использовать переходники. С таким переходником принтер можно использовать так, как если бы он был настоящим `USB`-принтером. Также для прямого подключения параллельных принтеров к сети можно использовать устройства, называемые _серверами печати_.
-[[printing-naming]]
-===== Именование принтера
+[[printing-connections-serial]]
+Последовательный порт (RS-232)::
+Последовательные порты — это ещё один устаревший интерфейс, который редко используется для принтеров, за исключением некоторых специализированных применений. Кабели, разъёмы и необходимая распиновка могут сильно различаться.
++
+Для последовательных портов, встроенных в материнскую плату, имя последовательного устройства — [.filename]#/dev/cuau0# или [.filename]#/dev/cuau1#. Также можно использовать последовательные адаптеры `USB`, которые будут отображаться как [.filename]#/dev/cuaU0#.
++
+Несколько параметров связи должны быть известны для взаимодействия с последовательным принтером. Наиболее важные из них — это _скорость передачи_ или `BPS` (бит в секунду) и _четность_. Значения могут различаться, но обычно последовательные принтеры используют скорость 9600 и отсутствие проверки на четность.
-Первый (простой) шаг - выбрать имя для принтера. На самом деле, не важно, выберете ли вы функциональное имя или причудливое, поскольку для принтера можно также задать несколько псевдонимов.
+[[printing-connections-network]]
+Сеть::
+Сетевые принтеры подключаются напрямую к локальной компьютерной сети.
++
+`DNS` имя хоста принтера должно быть известно. Если принтеру назначается динамический адрес через `DHCP`, `DNS` должен динамически обновляться, чтобы имя хоста всегда соответствовало правильному `IP`-адресу. Сетевые принтеры часто получают статические `IP`-адреса, чтобы избежать этой проблемы.
++
+Большинство сетевых принтеров понимают задания печати, отправленные по протоколу LPD. Также можно указать имя очереди печати. Некоторые принтеры обрабатывают данные по-разному в зависимости от используемой очереди. Например, очередь `raw` печатает данные без изменений, а очередь `text` добавляет символы возврата каретки к обычному тексту.
++
+Многие сетевые принтеры также могут печатать данные, отправленные напрямую на порт 9100.
-По крайней мере, один из принтеров, указанных в файле [.filename]#/etc/printcap#, должен иметь псевдоним `lp`. Это - стандартное имя принтера. Если пользователи не установят переменную среды `PRINTER` и не укажут имя принтера в командной сроке при вводе любой команды системы LPD, по умолчанию для ее выполнения будет использован принтер `lp`.
+[[printing-connections-summary]]
+=== Краткое содержание
-Также широко распространена практика в качестве последнего псевдонима для принтера задавать полное его описание, включая производителя и модель.
+Проводные сетевые подключения обычно проще всего настроить и обеспечивают наиболее быструю печать. Для прямого подключения к компьютеру предпочтительнее использовать `USB` из-за скорости и простоты. Параллельные подключения работают, но имеют ограничения по длине кабеля и скорости. Последовательные подключения сложнее настроить. Разводка кабелей различается в зависимости от модели, а параметры связи, такие как скорость передачи данных и биты четности, добавляют сложности. К счастью, последовательные принтеры встречаются редко.
-После выбора имени и нескольких популярных псевдонимов поместите их в файл [.filename]#/etc/printcap#. Имя принтера должно начинаться с крайнего левого столбца. Каждый псевдоним отделяйте вертикальной чертой, а после последнего псевдонима поместите двоеточие.
+[[printing-pdls]]
+== Языки описания страниц
-В следующем примере мы начнем со скелетного файла [.filename]#/etc/printcap#, определяющего два принтера (построчный принтер Diablo 630 и лазерный PostScript(R)-принтер Panasonic KX-P4455):
+Данные, отправляемые на принтер, должны быть на языке, который принтер может понять. Эти языки называются языками описания страниц или PDL (Page Description Languages).
-[.programlisting]
-....
-#
-# /etc/printcap для хоста rose
-#
-rattan|line|diablo|lp|Diablo 630 Line Printer:
+[[print-pdls-ascii]]
+`ASCII`::
+Обычный текст `ASCII` — это самый простой способ отправить данные на принтер. Символы соответствуют один к одному тому, что будет напечатано: символ `A` в данных напечатает `A` на странице. Доступно очень мало возможностей форматирования. Нет способа выбрать шрифт или пропорциональные интервалы. Вынужденная простота обычного `ASCII` означает, что текст можно печатать напрямую с компьютера с минимальным или вообще отсутствующим кодированием или преобразованием. Напечатанный вывод напрямую соответствует отправленным данным.
++
+Некоторые недорогие принтеры не могут печатать обычный текст `ASCII`. Это усложняет их настройку, но обычно это всё равно возможно.
-bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
-....
+[[print-pdls-postscript]]
+PostScript(R)::
+PostScript(R) почти противоположен `ASCII`. Вместо простого текста программа PostScript(R) представляет собой набор инструкций, которые рисуют итоговый документ. Можно использовать различные шрифты и графику. Однако за эту мощь приходится платить. Необходимо написать программу, которая рисует страницу. Обычно эта программа генерируется прикладным программным обеспечением, поэтому процесс остается невидимым для пользователя.
++
+Недорогие принтеры иногда не поддерживают совместимость с PostScript(R) в целях экономии.
-В этом примере первый принтер назван `rattan` и ему заданы псевдонимы `line`, `diablo`, `lp` и `Diablo 630 Line Printer`. Поскольку у него есть псевдоним `lp`, он является стандартным принтером. Второму принтеру дано имя `bamboo` и ему заданы псевдонимы `ps`, `PS`, `S`, `panasonic` и `Panasonic KX-P4455 PostScript v51.4`.
+[[print-pdls-pcl]]
+`PCL` (Printer Command Language)::
+`PCL` является расширением `ASCII`, добавляющим escape-последовательности для форматирования, выбора шрифтов и печати графики. Многие принтеры поддерживают `PCL5`. Некоторые поддерживают более новые версии `PCL6` или `PCLXL`. Эти более поздние версии являются надмножествами `PCL5` и могут обеспечивать более быструю печать.
-[[printing-no-header-pages]]
-===== Подавление выдачи начальных страниц
+[[print-pdls-host-based]]
+Принтер на основе хоста::
+Производители могут снизить стоимость принтера, используя простой процессор и минимум памяти. Такие принтеры не способны печатать обычный текст. Вместо этого растровые изображения текста и графики создаются драйвером на главном компьютере и затем отправляются на принтер. Такие принтеры называются _host-based_ (управляемыми хостом).
++
+Взаимодействие между драйвером и принтером, подключенным к хосту, часто осуществляется по проприетарным или недокументированным протоколам, что делает их работоспособными только в наиболее распространённых операционных системах.
-Система спулинга LPD будет по умолчанию печатать _заголовочную страницу_ для каждого задания. Заголовочная страница содержит имя пользователя, отправившего задание, хост, с которого поступило задание, и имя задания, красивыми большими буквами. К сожалению, все эти дополнительные тексты мешают отладке простой настройки принтера, поэтому мы будет отключать выдачу начальных страниц.
+[[print-pdls-table]]
+=== Преобразование PostScript(R) в другие PDL
-Для подавления выдачи начальных страниц добавьте характеристику `sh` к записи принтера в файле [.filename]#/etc/printcap#. Вот пример файла [.filename]#/etc/printcap# с добавлением `sh`:
+Многие приложения из Коллекции портов и утилиты FreeBSD создают вывод в формате PostScript(R). В следующей таблице представлены утилиты для преобразования этого формата в другие распространённые PDL:
-[.programlisting]
-....
-#
-# /etc/printcap для хоста rose - никаких начальных страниц
-#
-rattan|line|diablo|lp|Diablo 630 Line Printer:\
- :sh:
+[[print-pdls-ps-to-other-tbl]]
+.Языки PDL на выходе
+[cols="1,1,1", frame="none", options="header"]
+|===
+<| PDL на выходе
+<| Чем создается
+<| Заметки
-bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
- :sh:
-....
+|`PCL` или `PCL5`
+|package:print/ghostscript9-base[]
+|`-sDEVICE=ljet4` для монохромной печати, `-sDEVICE=cljet5` для цветной
-Обратите внимание, как мы использовали правильный формат: первая строка начинается с самого левого столбца, а последующие строки смещены. Каждая строка в записи, кроме последней, завершается символом обратной косой черты.
+|`PCLXL` или `PCL6`
+|package:print/ghostscript9-base[]
+|`-sDEVICE=pxlmono` для монохромного режима, `-sDEVICE=pxlcolor` для цветного
-[[printing-spooldir]]
-===== Создание каталога для спулинга
+|`ESC/P2`
+|package:print/ghostscript9-base[]
+|`-sDEVICE=uniprint`
-Следующий шаг в простой настройке спулера - создать _каталог для спулинга_, каталог, в котором находятся задания печати, пока не будут напечатаны, и где находятся еще несколько других файлов для поддержки спулера.
+|`XQX`
+|package:print/foo2zjs[]
+|
+|===
-Из-за присущих каталогам спулинга постоянных изменений, принято помещать эти каталоги в каталог [.filename]#/var/spool#. Кроме того, не нужно создавать резервные копии содержимого каталогов спулинга. Пересоздать их можно с помощью простой команды man:mkdir[1].
+[[print-pdls-summary]]
+=== Краткое содержание
-Принято также задавать для каталога имя, совпадающее с именем принтера, как показано ниже:
+Для наиболее простой печати выберите принтер с поддержкой PostScript(R). Принтеры, поддерживающие `PCL`, являются следующим предпочтительным вариантом. С помощью package:print/ghostscript9-base[] эти принтеры можно использовать так, как если бы они изначально понимали PostScript(R). Принтеры, которые напрямую поддерживают PostScript(R) или `PCL`, почти всегда также поддерживают прямую печать обычных текстовых файлов в формате `ASCII`.
-[source,shell]
-....
-# mkdir /var/spool/имя-принтера
-....
+Строковые принтеры, такие как обычные струйные, обычно не поддерживают PostScript(R) или `PCL`. Они часто могут печатать простые текстовые файлы в формате `ASCII`. Пакет package:print/ghostscript9-base[] поддерживает языки описания страниц (PDL), используемые некоторыми из этих принтеров. Однако печать всей графической страницы на таких принтерах часто происходит очень медленно из-за большого объема передаваемых и печатаемых данных.
-Однако при наличии большого количества принтеров в сети может иметь смысл поместить все каталоги спулинга в один каталог, который просто резервируется для печати с помощью LPD. Мы сделаем это для наших двух принтеров, `rattan` и `bamboo`:
+Настроить принтеры, управляемые хостом, часто сложнее. Некоторые из них вообще нельзя использовать из-за проприетарных языков описания страниц (PDL). По возможности избегайте таких принтеров. Информацию о конкретных `PDL`, используемых различными моделями принтеров, можно найти на сайте http://www.openprinting.org/printers[].
-[source,shell]
-....
-# mkdir /var/spool/lpd
-# mkdir /var/spool/lpd/rattan
-# mkdir /var/spool/lpd/bamboo
-....
+[[printing-direct]]
+== Прямая печать
-[NOTE]
-====
-Если вас интересует конфиденциальность заданий, отправляемых пользователями на печать, можно защитить каталог спулинга, чтобы он не был общедоступным. Каталоги спулинга должны принадлежать и быть доступны на чтение, запись и просмотр содержимого пользователю daemon и группе daemon, и никому больше. Мы установим это для каталогов спулинга принтеров из нашего примера:
+Для периодической печати файлы можно отправлять непосредственно на устройство принтера без дополнительной настройки. Например, файл с именем [.filename]#sample.txt# можно отправить на принтер с интерфейсом `USB`:
-[source,shell]
+[source, shell]
....
-# chown daemon:daemon /var/spool/lpd/rattan
-# chown daemon:daemon /var/spool/lpd/bamboo
-# chmod 770 /var/spool/lpd/rattan
-# chmod 770 /var/spool/lpd/bamboo
+# cp sample.txt /dev/unlpt0
....
-====
-
-Наконец, надо сообщить системе LPD об этих каталогах с помощью файла [.filename]#/etc/printcap#. Полное имя каталога спулинга задается с помощью характеристики `sd`:
+Прямая печать на сетевые принтеры зависит от возможностей принтера, но большинство из них принимают задания на печать через порт 9100, и для этого можно использовать man:nc[1]. Чтобы напечатать тот же файл на принтере с `DNS`-именем хоста _netlaser_:
-[.programlisting]
+[source, shell]
....
-#
-# /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:
+# nc netlaser 9100 < sample.txt
....
-Обратите внимание, что имя принтера начинается с самого первого столбца, а все последующие строки смещены, и каждая строка в записи, кроме последней, завершается символом обратной косой черты.
+[[printing-lpd]]
+== LPD (демон линейного принтера)
-Если вы не зададите каталог спулинга с помощью характеристики `sd`, система спулинга будет использовать по умолчанию каталог [.filename]#/var/spool/lpd#.
+Печать файла в фоновом режиме называется спулингом. Спулер позволяет пользователю продолжать работу с другими программами на компьютере, не ожидая завершения медленного процесса печати.
-[[printing-device]]
-===== Выбор устройства для принтера
+FreeBSD включает спулер под названием man:lpd[8]. Задания на печать отправляются с помощью man:lpr[1].
-Мы выяснили, какой специальный файл устройства в каталоге [.filename]#/dev# FreeBSD будет использовать для взаимодействия с принтером. Теперь мы сообщаем эту информацию системе LPD. Когда у системы спулинга есть задание для печати, она будет открывать указанное устройство от имени программы-фильтра (которая отвечает за передачу данных на принтер).
+[[printing-lpd-setup]]
+=== Начальная настройка
-Задайте полное имя устройства [.filename]#/dev# в файле [.filename]#/etc/printcap# с помощью характеристики `lp`.
+Создается каталог для хранения заданий печати, устанавливается владелец, а права доступа настраиваются так, чтобы другие пользователи не могли просматривать содержимое этих файлов:
-В нашем текущем примере давайте предположим, что принтер `rattan` подключен к первому параллельному порту, а принтер `bamboo` - к шестому последовательному порту; вот что нужно добавить в файл [.filename]#/etc/printcap#:
-
-[.programlisting]
+[source, shell]
....
-#
-# /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:
+# mkdir -p /var/spool/lpd/lp
+# chown daemon:daemon /var/spool/lpd/lp
+# chmod 770 /var/spool/lpd/lp
....
-Если вы не укажете характеристику `lp` для принтера в файле [.filename]#/etc/printcap#, система LPD использует по умолчанию устройство [.filename]#/dev/lp#. Устройство [.filename]#/dev/lp# сейчас в ОС FreeBSD не существует.
-
-Если устанавливаемый принтер подключен к параллельному порту, перейдите к разделу <<printing-textfilter,Установка текстового фильтра>>. Иначе выполните сначала инструкции, представленные в следующем разделе.
-
-[[printing-commparam]]
-===== Конфигурирование параметров взаимодействия спулера
-
-Для принтеров на последовательных портах система LPD может устанавливать скорость передачи, четность и другие параметры взаимодействия через последовательных порт от имени программы-фильтра, которая посылает данные на принтер. Это полезно потому, что:
-
-* Позволяет опробовать различные параметры взаимодействия, просто редактируя файл [.filename]#/etc/printcap#; программу-фильтр перекомпилировать не нужно.
-* Позволяет системе спулинга использовать одну и ту же программу-фильтр для нескольких принтеров, которые могут иметь различные установки для взаимодействия через последовательный порт.
-
-Следующие характеристики в файле [.filename]#/etc/printcap# задают параметры взаимодействия через последовательный порт для устройства, указанного в качестве значения характеристики `lp`:
-
-`br#_bps-rate_`::
-Устанавливает скорость взаимодействия для устройства в _bps-rate_, где _bps-rate_ может иметь значение 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600 или 115200 бит в секунду.
-
-`ms#_stty-mode_`::
-Устанавливает опции для терминального устройства после открытия устройства. Поддерживаемые опции описаны на странице справочного руководства man:stty[1].
-
-Когда система LPD открывает устройство, заданное характеристикой `lp`, она устанавливает опции устройства в соответствии со значением характеристики `ms#`. Наибольший интерес представляют режимы `parenb`, `parodd`, `cs5`, `cs6`, `cs7`, `cs8`, `cstopb`, `crtscts` и `ixon`, которые описаны на странице справочного руководства man:stty[1].
-
-Давайте зададим опции для нашего принтера на шестом последовательном порту. Мы установим скорость передачи 38400. В качестве режима установим режим без четности с помощью `-parenb`, 8-битовые символы с помощью `cs8`, отсутствие модемного управления с помощью `clocal` и аппаратное управление потоком с помощью опции `crtscts`:
+Принтеры определяются в файле [.filename]#/etc/printcap#. Запись для каждого принтера включает такие данные, как имя, порт, к которому он подключен, и различные другие параметры. Создайте файл [.filename]#/etc/printcap# со следующим содержимым:
[.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:
+lp:\ <.>
+ :lp=/dev/unlpt0:\ <.>
+ :sh:\ <.>
+ :mx#0:\ <.>
+ :sd=/var/spool/lpd/lp:\ <.>
+ :lf=/var/log/lpd-errs: <.>
....
-[[printing-textfilter]]
-===== Установка текстового фильтра
-
-Теперь мы готовы задать системе LPD, какой текстовый фильтр использовать для посылки заданий на принтер. _Текстовый фильтр_, известный также как _входной фильтр_, - это программа, которую система LPD запускает при получении задания на печать. Когда система LPD запускает текстовый фильтр для принтера, она направляет на стандартный входной поток фильтра задание печати, а его стандартный выходной поток - на устройство принтера, заданное характеристикой `lp`. Предполагается, что фильтр прочитает задание из стандартного входного потока, выполнит все необходимые для принтера преобразования и выдаст результат в стандартный выходной поток, который и будет напечатан. Подробнее о текстовом фильтре см. в разделе <<printing-advanced-filters,Фильтры>>.
+<.> Имя этого принтера. man:lpr[1] отправляет задания на печать на принтер `lp`, если другой принтер не указан с помощью `-P`, поэтому принтер по умолчанию должен называться `lp`.
-Для простой настройки принтера в качестве текстового фильтра можно задать небольшой скрипт командного интерпретатора, который просто выполняет `/bin/cat` для посылки задания на принтер. В составе FreeBSD поставляется другой фильтр, [.filename]#lpf#, обрабатывающий забой и подчеркивание для принтеров, которые не слишком хорошо справляются с потоком данных, содержащих такие символы. И, конечно же, вы можете использовать любую другую необходимую программу-фильтр. Фильтр `lpf` детально описан в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>.
+<.> Устройство, к которому подключен принтер. Замените эту строку на соответствующую для типа подключения, указанного здесь.
-Сначала давайте создадим скрипт командного интерпретатора [.filename]#/usr/local/libexec/if-simple# для простого тестового фильтра. Поместите в этот файл следующий текст с помощью любимого текстового редактора:
-
-[.programlisting]
-....
-#!/bin/sh
-#
-# if-simple - Простой фильтр входного текста для lpd
-# Установлен в /usr/local/libexec/if-simple
-#
-# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
+<.> Подавить вывод титульной страницы в начале задания печати.
-/bin/cat && exit 0
-exit 2
-....
+<.> Не ограничивать максимальный размер задания на печать.
-Сделайте этот файл выполняемым:
+<.> Путь к каталогу спулинга для этого принтера. Каждый принтер использует свой собственный каталог спулинга.
-[source,shell]
-....
-# chmod 555 /usr/local/libexec/if-simple
-....
+<.> Файл журнала, в который будут записываться ошибки для этого принтера.
-А теперь потребуйте от системы LPD его использовать, указав его в качестве значения характеристики `if` в файле [.filename]#/etc/printcap#. Мы добавим его для двух принтеров, имеющихся пока в примере файла [.filename]#/etc/printcap#:
+После создания [.filename]#/etc/printcap# используйте man:chkprintcap[8] для проверки на ошибки:
-[.programlisting]
+[source, shell]
....
-#
-# /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:
+# chkprintcap
....
-[NOTE]
-====
-Копию скрипта [.filename]#if-simple# можно найти в каталоге [.filename]#/usr/shared/examples/printing#.
-====
-
-===== Запуск системы LPD
+Исправьте все выявленные проблемы перед продолжением.
-Даемон man:lpd[8] запускается из [.filename]#/etc/rc#, а необходимость запуска задается переменной `lpd_enable`. Эта переменная по умолчанию имеет значение `NO`. Если вы еще этого не сделали, добавьте строку:
+Включите man:lpd[8] в [.filename]#/etc/rc.conf#:
[.programlisting]
....
lpd_enable="YES"
....
-в файл [.filename]#/etc/rc.conf#, а затем либо перезапустите машину, либо просто выполните команду man:lpd[8].
+Запустите службу:
-[source,shell]
+[source, shell]
....
-# lpd
+# service lpd start
....
-[[printing-trying]]
-===== Проверка
+[[printing-lpd-lpr]]
+=== Печать с помощью man:lpr[1]
-Вы добрались до конца простой настройки системы LPD. К сожалению, поздравлять вас еще рано, поскольку надо еще проверить настройку и устранить все выявленные проблемы. Для проверки настройки, попытайтесь что-то распечатать. Для печати с помощью системы LPD используется команда man:lpr[1], которая посылает задание на печать.
+Документы отправляются на печать с помощью `lpr`. Файл для печати может быть указан в командной строке или передан в `lpr` через конвейер. Эти две команды эквивалентны и отправляют содержимое файла [.filename]#doc.txt# на принтер по умолчанию:
-Можно скомбинировать man:lpr[1] с программой man:lptest[1], представленной в разделе <<printing-testing,Проверка взаимодействия с принтером>>, генерирующей тестовый текст.
-
-_Для тестирования простой настройки LPD:_
-
-Введите команду:
-
-[source,shell]
+[source, shell]
....
-# lptest 20 5 | lpr -Pprinter-name
+% lpr doc.txt
+% cat doc.txt | lpr
....
-Где _printer-name_ - имя (или псевдоним) принтера, заданное в файле [.filename]#/etc/printcap#. Для проверки стандартного принтера, введите команду man:lpr[1] без аргумента `-P`. Как уже отмечалось, если тестируется принтер, предполагающий использование PostScript(R), пошлите ему PostScript(R)-программу вместо использования утилиты man:lptest[1]. Это можно сделать, поместив программу в файл и выполнив команду `lpr _file_`.
+Принтеры можно выбрать с помощью `-P`. Для печати на принтере с именем _laser_:
-Для PostScript(R)-принтера вы должны получить результаты выполнения программы. Если вы используете man:lptest[1], ваши результаты должны иметь такой вид:
-
-[.programlisting]
+[source, shell]
....
-!"#$%&'()*+,-./01234
-"#$%&'()*+,-./012345
-#$%&'()*+,-./0123456
-$%&'()*+,-./01234567
-%&'()*+,-./012345678
+% lpr -Plaser doc.txt
....
-Для дальнейшего тестирования принтера, попытайтесь загрузить программы побольше (для принтеров, поддерживающих определенный язык) или выполните команду man:lptest[1] с другими аргументами. Например, команда `lptest 80 60` выдаст 60 строк по 80 символов в каждой.
-
-Если принтер не работает, см. раздел <<printing-troubleshooting,Выявление проблем>>.
-
-[[printing-advanced]]
-== Расширенная настройка принтера
-
-В этом разделе описаны фильтры для печати специально сформатированных файлов, начальных страниц, печати по сети, ограничения и учета использования принтера.
-
-[[printing-advanced-filter-intro]]
+[[printing-lpd-filters]]
=== Фильтры
-Хотя система LPD поддерживает сетевые протоколы, очереди, контроль доступа и другие аспекты печати, большая часть _реальной_ работы происходит в _фильтрах_. Фильтры - это программы, взаимодействующие с принтером и обеспечивающие учет особенностей устройства и специальных требований. При простой настройке принтера мы установили фильтр для обычного текста - крайне простой, который должен работать с большинством принтеров (см. раздел <<printing-textfilter,Установка текстового фильтра>>).
-
-Однако, чтобы обеспечить преобразования формата, учет использования принтера и индивидуальных особенностей отдельных принтеров и т.п., надо разобраться, как работают фильтры. В конечном итоге, всеми этими аспектами печати должен заниматься фильтр. А плохая новость состоит в том, что, в большинстве случаев, вы _сами_ должны предоставить соответствующие фильтры. Хорошая новость состоит в том, что многие фильтры общедоступны; а если подходящих нет, их обычно легко написать.
-
-Кроме того, в составе ОС FreeBSD поставляется один фильтр, [.filename]#/usr/libexec/lpr/lpf#, работающий со многими принтерами, которые могут печатать обычный текст. (Он обрабатывает символы забоя и табуляции в файле, выполняет учет использования, но и не более того.) Есть также ряд фильтров и компонентов фильтров в наборе портов FreeBSD.
-
-Вот что вы найдете в этом разделе:
-
-* В разделе <<printing-advanced-filters,Как работают фильтры>> сделана попытка дать обзор роли фильтра в процессе печати. Прочтите этот раздел, чтобы понять, что происходит "за кадром", когда система LPD использует фильтры. Это понимание поможет предвидеть и решать проблемы, с которыми вы можете столкнуться при добавлении дополнительных фильтров для каждого из принтеров.
-* Система LPD предполагает, что каждый принтер, по умолчанию, может печатать обычный текст. Это проблематично для PostScript(R)-принтеров (или принтеров на базе другого языка), поскольку они не могут печатать обычный текст непосредственно. В разделе <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>> описано, что нужно сделать, чтобы решить эту проблему. Прочтите этот раздел, если используете PostScript(R)-принтер.
-* PostScript(R) - популярный формат выдачи для многих программ. Некоторые люди даже пишут PostScript(R)-код непосредственно. К сожалению, PostScript(R)-принтеры дороги. В разделе <<printing-advanced-ps,Имитация PostScript(R) на не-PostScript(R) принтерах>> описано, как можно дополнительно изменить текстовый фильтр принтера для приема и печати данных PostScript(R) не _не-PostScript(R)_ принтере. Прочтите этот раздел, если ваш принтер не поддерживает PostScript(R).
-* В разделе <<printing-advanced-convfilters,Фильтры преобразования>> описан способ автоматизации преобразования определенных форматов файлов, например, графики или данных для печатного станка, в форматы, которые может обработать ваш принтер. После чтения этого раздела вы сможете настроить свои принтеры так, что пользователи смогут выполнять команду `lpr -t` для печати данных troff, или `lpr -d` для печати данных TeX DVI, или `lpr -v` - для печати растровых изображений, и так далее. Я рекомендую прочитать этот раздел.
-* В разделе <<printing-advanced-of,Выходные фильтры>> описана не часто используемая возможность задавать выходные фильтры в системе LPD. Если только вы не печатаете начальные страницы (см. <<printing-advanced-header-pages,Начальные страницы>>), можно, пожалуй, вообще пропустить этот раздел.
-* В разделе <<printing-advanced-lpf,lpf: текстовый фильтр>> описана команда `lpf`, - достаточно полный, хотя и простой текстовый фильтр для строчных принтеров (и лазерных принтеров, работающих как строчные), поставляемый в составе ОС FreeBSD. Если надо быстро настроить учет использования принтера для обычного текста или если используется принтер, из которого при получении символов забоя идет дым, несомненно, стоит подумать об использовании `lpf`.
-
-[NOTE]
-====
-Различные скрипты, описанные далее, можно найти в каталоге [.filename]#/usr/shared/examples/printing#.
-====
-
-[[printing-advanced-filters]]
-==== Как работают фильтры
-
-Как уже упоминалось, фильтр - это выполняемая программа, запускаемая системой LPD для поддержки специфических особенностей устройства при взаимодействии с принтером.
-
-Когда системе LPD надо напечатать входящий в задание файл, она запускает программу-фильтр. Стандартный входной поток фильтра связывается с файлом, который надо распечатать, его стандартный выходной поток - с принтером, а стандартный поток ошибок перенаправляется в файл регистрации ошибок (задается характеристикой `lf` в файле [.filename]#/etc/printcap#, или используется стандартное устройство [.filename]#/dev/console#).
-
-Запускаемый системой LPD фильтр и его аргументы зависят от того, что указано в файле [.filename]#/etc/printcap#, и какие аргументы указал пользователь для задания в команде man:lpr[1]. Например, если пользователь ввел команду `lpr -t`, система LPD должна запустить фильтр troff, заданный характеристикой `tf` для соответствующего принтера. Если пользователь хочет печатать обычный текст, система должна запустить фильтр `if` (это верно в большинстве случаев: подробнее см. в разделе <<printing-advanced-of,Выходные фильтры>>).
-
-В файле [.filename]#/etc/printcap# можно задавать три вида фильтров:
-
-* _Текстовый фильтр_, который в документации LPD двусмысленно называют _входным фильтром_, обеспечивает печать обычного текста. Рассматривайте его как стандартный фильтр. Система LPD предполагает, что любой принтер может по умолчанию печатать обычный текст, а на текстовый фильтр возлагается задача обеспечить, чтобы символы забоя, табуляции или другие специальные символы не сбивали принтер с толку. Если вы работаете в среде, где надо учитывать использование принтера, текстовый фильтр должен также учитывать количество напечатанных страниц, обычно, подсчитывая количество напечатанных строк и сравнивая их с количеством строк на страницу, поддерживаемых принтером. Текстовый фильтр запускается со следующим списком аргументов:
-+
-`имя-фильтра [-c] -wширина -lдлина -iсдвиг -n имя-пользователя -h хост учетный-файл`
-
-`-c`:::
-указывается, если задание послано командой `lpr -l`
-
-_ширина_:::
-значение из характеристики `pw` (page width - ширина страницы), указанной в файле [.filename]#/etc/printcap#, по умолчанию - 132
-
-_длина_:::
-значение из характеристики `pl` (page length - длина страницы), по умолчанию - 66
-
-_сдвиг_:::
-сдвиг, заданный командой `lpr -i`, по умолчанию - 0
-
-_имя-пользователя_:::
-регистрационное имя пользователя, печатающего файл
-
-_хост_:::
-имя хоста, с которого было послано задание
-
-_учетный-файл_:::
-имя учетного файла, задаваемое характеристикой `af`.
-
-* _Фильтр преобразования_ преобразует специфичный формат файла в то, что принтер может воспроизвести на бумаге. Например, данные системы набора ditroff нельзя печатать непосредственно, но можно установить фильтр преобразования для файлов ditroff, чтобы преобразовывать данные ditroff в тот вид, который принтер может воспринять и напечатать. В разделе <<printing-advanced-convfilters,Фильтры преобразования>> написано всё об этих фильтрах. Фильтры преобразования также необходимы для учета, если предполагается учет использования принтера. Фильтры преобразования запускаются со следующими аргументами:
-+
-`имя-фильтра` -x__ширина-пиксела__ -y__высота-пиксела__ -n __имя-пользователя__ -h __хост__ __учетный-файл__ где __ширина-пиксела__ - значение характеристики px (по умолчанию - 0), а __высота-пиксела__ - значение характеристики py (по умолчанию - 0).
-* _Выходной фильтр_ используется только если нет текстового фильтра или если включена выдача начальных страниц. Судя по моему опыту, выходные фильтры используются редко. Они описаны в разделе <<printing-advanced-of,Выходные фильтры>>. У выходного фильтра есть всего два аргумента:
-+
-`имя-фильтра` -w__ширина__ -l__длина__ которые идентичны аргументам `-w` и `-l` текстового фильтра.
-
-Фильтры также должны _завершать работу_ со следующим статусом выхода:
-
-exit 0::
-Если фильтр успешно напечатал файл.
-
-exit 1::
-Если фильтр не смог напечатать файл, но хочет, чтобы система LPD попыталась распечатать файл ещё раз. Система LPD перезапустит фильтр, если его работа завершена с этим статусом.
+Примеры, показанные до этого, отправляли содержимое текстового файла напрямую на принтер. Пока принтер понимает содержимое этих файлов, вывод будет печататься корректно.
-exit 2::
-Если фильтр не смог напечатать файл и не хочет, чтобы система LPD пыталась его печатать еще раз. Система LPD удалит файл.
+Некоторые принтеры не способны печатать обычный текст, а входной файл может даже не быть текстовым.
-Поставляемый в составе FreeBSD текстовый фильтр [.filename]#/usr/libexec/lpr/lpf# использует аргументы, задающие ширину и длину страницы для определения того, когда посылать символ прогона страницы (form feed) и как учитывать использование принтера. Он использует переданные в качестве аргументов имя пользователя, хост и учетный файл для внесения учетных записей.
+Фильтры позволяют преобразовывать или обрабатывать файлы. Обычно они используются для преобразования одного типа входных данных, например, простого текста, в формат, который принтер может понять, например PostScript(R) или `PCL`. Фильтры также могут использоваться для предоставления дополнительных функций, таких как добавление номеров страниц или подсветка исходного кода для удобства чтения.
-При поиске фильтров убедитесь, что они совместимы с системой LPD. Если да, они должны поддерживать описанные выше списки аргументов. Если вы планируете создавать фильтры для общего использования, позаботьтесь о поддержке этих списков аргументов и кодов выхода.
+Обсуждаемые здесь фильтры являются _входными фильтрами_ или _текстовыми фильтрами_. Эти фильтры преобразуют входящий файл в различные формы. Используйте man:su[1], чтобы стать `root` перед созданием файлов.
-[[printing-advanced-if-conversion]]
-==== Прием заданий с обычным текстом на PostScript(R)-принтеры
-
-Если вы - единственный пользователь компьютера и PostScript(R)-принтера (или принтера на основе другого языка), и вы обещаете никогда не посылать на принтер обычный текст и никогда не использовать возможностей различных программ, требующих посылки на принтер обычного текста, вам можно не заботиться о том, что описано в этом разделе.
-
-Но, если вы хотите посылать на принтер как задания PostScript(R), так и обычный текст, рекомендуется дополнить настройку принтера. Для этого надо, чтобы текстовый фильтр определял, является ли поступающее задание обычным текстом или программой на языке PostScript(R). Все PostScript(R)-задания должны начинаться с `%!` (для других языков принтеров обратитесь к соответствующей документации). Если первые два символа в задании - именно эти, речь идет о PostScript(R), и мы можем остальную часть задания передавать непосредственно. Если же первые два символа в файле - другие, фильтр будет преобразовывать текст в PostScript(R) и печатать результат.
-
-Как нам это сделать?
-
-Если вы используете последовательный принтер, хороший способ достичь поставленной цели состоит в установке `lprps`. `lprps` - это фильтр для PostScript(R)-принтера, выполняющий двустороннее взаимодействие с принтером. Он обновляет файл состояния принтера, помещая в него подробную информацию, выданную принтером, так что пользователи и администраторы могут узнать, в каком именно состоянии (например, `toner low` или `paper jam`) находится принтер. Но еще важнее, что он включает программу `psif`, которая определяет, является ли входящее задание обычным текстом, и вызывает `textps` (еще одну программу, поставляемую вместе с `lprps`) для преобразования его в PostScript(R). Затем `lprps` посылает преобразованное задание на принтер.
-
-`lprps` входит в набор портов FreeBSD (см. crossref:ports[ports,Набор портов]). Вы, конечно, можете загрузить, собрать и установить его самостоятельно. После установки `lprps` просто укажите путь к программе `psif`, входящей в состав пакета `lprps`. Если вы установили `lprps` из Коллекции Портов, используйте следующий текст в записи для последовательного PostScript(R)-принтера в файле [.filename]#/etc/printcap#:
+Фильтры указываются в [.filename]#/etc/printcap# с идентификатором `if=`. Чтобы использовать [.filename]#/usr/local/libexec/lf2crlf# в качестве фильтра, измените [.filename]#/etc/printcap# следующим образом:
[.programlisting]
....
-:if=/usr/local/libexec/psif:
+lp:\
+ :lp=/dev/unlpt0:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/lp:\
+ :if=/usr/local/libexec/lf2crlf:\ <.>
+ :lf=/var/log/lpd-errs:
....
-Надо также задать характеристику `rw`; она требует от системы LPD открывать принтер в режиме чтения и записи.
-
-При использовании параллельного PostScript(R)-принтера (что не позволяет обеспечить двустороннее взаимодействие с принтером, необходимое для системы `lprps`), можно использовать в качестве текстового фильтра следующий скрипт командного интерпретатора:
-
-[.programlisting]
-....
-#!/bin/sh
-#
-# psif - Печать PostScript или обычного текста на PostScript-принтере
-# Скрипт, а НЕ версия, входящая в состав lprps
-# Установлен в /usr/local/libexec/psif
-#
-
-IFS="" read -r first_line
-first_two_chars=`expr "$first_line" : '\(..\)'`
-
-if [ "$first_two_chars" = "%!" ]; then
- #
- # Задание PostScript, печатать его.
- #
- echo "$first_line" && cat && printf "\004" && exit 0
- exit 2
-else
- #
- # Обычный текст, преобразовать его, а затем напечатать.
- #
- ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
- exit 2
-fi
-....
-
-В представленном выше скрипте, `textps` - отдельно установленная программа для преобразования обычного текста в PostScript(R). Можно использовать любую программу преобразования текста в PostScript(R). Коллекция Портов FreeBSD (см. материал о crossref:ports[ports,Коллекции Портов]) включает полнофункциональную программу преобразования текста в PostScript(R) под названием `a2ps`, которую тоже можно попробовать использовать.
-
-[[printing-advanced-ps]]
-==== Имитация PostScript(R) на не-PostScript(R) принтерах
-
-PostScript(R) является _фактическим_ стандартом для высококачественного набора и печати. PostScript(R), однако, - _дорогой_ стандарт. К счастью, благодаря компании Aladdin Enterprises есть свободный аналог PostScript(R) под названием Ghostscript, который работает с FreeBSD. Ghostscript может читать большинство PostScript(R)-файлов и выдавать соответствующие страницы на множество устройств, включая многие моделей не-PostScript принтеров. Установив Ghostscript и используя специальный текстовый фильтр для принтера, можно заставить ваш не-PostScript(R) принтер работать фактически как PostScript(R)-принтер.
-
-Ghostscript входит в набор портов FreeBSD, если вы хотите устанавливать его оттуда. Вы можете также легко загрузить, собрать и установить его самостоятельно.
-
-Для имитации PostScript(R) надо, чтобы текстовый фильтр определял, печатается ли PostScript(R)-файл. Если нет, фильтр будет передавать файл на принтер непосредственно; в противном случае, он будет использовать Ghostscript, чтобы сначала преобразовать файл в формат, который поймет принтер.
-
-Рассмотрим пример: следующий сценарий представляет собой текстовый фильтр для принтеров Hewlett Packard DeskJet 500. Для других принтеров замените аргумент `-sDEVICE` в команде `gs` (Ghostscript). (Введите команду `gs -h` для получения списка устройств, поддерживаемых установленной версией Ghostscript.)
+<.> `if=` определяет _входной фильтр_, который будет использоваться для входящего текста.
-[.programlisting]
-....
-#!/bin/sh
-#
-# ifhp - Печать Ghostscript-эмулированного PostScript на DeskJet 500
-# Установлен в /usr/local/libexec/ifhp
-
-#
-# Обрабатывать LF как CR+LF (чтобы избежать "эффекта ступенек"
-# на принтерах HP/PCL:
-#
-printf "\033&k2G" || exit 2
-
-#
-# Прочитать первые два символа файла
-#
-IFS="" read -r first_line
-first_two_chars=`expr "$first_line" : '\(..\)'`
-
-if [ "$first_two_chars" = "%!" ]; then
- #
- # Это PostScript; используем Ghostscript для чтения, преобразования и печати.
- #
- /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
- -sOutputFile=- - && exit 0
-else
- #
- # Обычный текст или HP/PCL, поэтому просто печатаем его напрямую; печатаем в
- # конце символ прогона страницы, чтобы была выдана последняя страница.
- #
- echo "$first_line" && cat && printf "\033&l0H" &&
-exit 0
-fi
-
-exit 2
-....
-
-Наконец, надо указать системе LPD, какой фильтр использовать, задав характеристику `if`:
+[TIP]
+====
+Символы обратной косой черты _продолжения строки_ в конце строк в записях [.filename]#printcap# показывают, что запись для принтера на самом деле представляет собой одну длинную строку с элементами, разделёнными двоеточиями. Предыдущий пример можно переписать в виде одной менее читаемой строки:
[.programlisting]
....
-:if=/usr/local/libexec/ifhp:
-....
-
-Вот и все. Теперь можно выполнять `lpr plain.text` и [.filename]#lpr whatever.ps#, и обе команды должны успешно печатать.
-
-[[printing-advanced-convfilters]]
-==== Фильтры преобразования
-
-После завершения простой настройки, описанной в разделе <<printing-simple,Простая настройка принтера>>, прежде всего, вам может потребоваться установить фильтры преобразования для любимых форматов файлов (кроме обычных текстов ASCII).
-
-===== Зачем устанавливать фильтры преобразования?
-
-Фильтры преобразования упрощают печать различного рода файлов. В качестве примера, предположим, что активно используется издательская система TeX и имеется PostScript(R)-принтер. При каждой генерации DVI-файла из TeX, мы не можем печатать его непосредственно, пока не преобразуем в PostScript(R). Для этого используется такая последовательность команд:
-
-[source,shell]
-....
-% dvips seaweed-analysis.dvi
-% lpr seaweed-analysis.ps
+lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
....
-Установив фильтр преобразования для файлов DVI, мы можем не конвертировать файл каждый раз вручную, возложив эту задачу на систему LPD. Теперь при каждом получении DVI-файла нас от его распечатки отделяет только один шаг:
-
-[source,shell]
-....
-% lpr -d seaweed-analysis.dvi
-....
-
-Мы заставили систему LPD автоматически преобразовывать DVI-файл, указав опцию `-d`. Все опции преобразования представлены в разделе <<printing-lpr-options-format,Опции форматирования и преобразования>>.
-
-Для каждой из опций преобразования, которая должна поддерживаться принтером, установите _фильтр преобразования_ и укажите его полное имя в файле [.filename]#/etc/printcap#. Фильтр преобразования аналогичен текстовому фильтру для простой настройки принтера (см. раздел <<printing-textfilter,Установка текстового фильтра>>), но вместо печати обычного текста он преобразует файл в формат, который может понять принтер.
-
-===== Какие фильтры преобразования следует устанавливать?
-
-Устанавливать надо те фильтры преобразования, которые предполагается использовать. Если вы часто печатаете файлы DVI, значит, фильтр преобразования DVI необходим. Если вам часто приходится печатать результаты работы troff, может потребоваться фильтр troff.
-
-В следующей таблице представлены фильтры, с которыми работает система LPD, их соответствующие характеристики для файла [.filename]#/etc/printcap#, а также способ их вызова в команде `lpr`:
-
-[.informaltable]
-[cols="1,1,1", frame="none", options="header"]
-|===
-| Тип файла
-| Характеристика /etc/printcap
-| Опция lpr
-
-|cifplot
-|`cf`
-|`-c`
-
-|DVI
-|`df`
-|`-d`
-
-|plot
-|`gf`
-|`-g`
-
-|ditroff
-|`nf`
-|`-n`
-
-|Текст на языке FORTRAN
-|`rf`
-|`-f`
-
-|troff
-|`tf`
-|`-f`
-
-|растровое изображение
-|`vf`
-|`-v`
-
-|обычный текст
-|`if`
-|никакой, `-p` или `-l`
-|===
-
-В нашем примере использование `lpr -d` означает, что для принтера должна быть задана характеристика `df` в записи в файле [.filename]#/etc/printcap#.
-
-Вопреки мнению многих, форматы вроде текста на языке FORTRAN и plot, вероятно, устарели. У себя на машине вы можете дать новые значения этим или любым другим опциям форматирования, установив соответствующие специализированные фильтры. Например, пусть необходимо напрямую печатать файлы Printerleaf (файлы настольной издательской системы Interleaf), но вообще вы не собираетесь печатать файлы типа plot. Можно установить фильтр преобразования Printerleaf в качестве значения характеристики `gf` и научить своих пользователей, что команда `lpr -g` означает "печатать файлы Printerleaf".
-
-===== Установка фильтров преобразования
-
-Поскольку фильтры преобразования представляют собой программы, не входящие в базовую поставку FreeBSD, их, видимо, надо помещать в каталоге [.filename]#/usr/local#. Популярное местонахождение - каталог [.filename]#/usr/local/libexec#, поскольку эти фильтры являются специализированными программами для выполнения системой LPD; обычным пользователям никогда не понадобится их выполнять.
-
-Для включения фильтра преобразования, укажите его полное имя в качестве значения соответствующей характеристики для принтера в файле [.filename]#/etc/printcap#.
-
-В качестве примера, давайте добавим фильтр преобразования DVI в запись для принтера `bamboo`. Вот опять пример файла [.filename]#/etc/printcap#, с новой характеристикой `df` для принтера `bamboo`.
-
-[.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:
-....
+[[printing-lpd-filters-stairstep]]
+==== Предотвращение ступенчатости на простых текстовых принтерах
-Фильтр DVI - скрипт командного интерпретатора по имени [.filename]#/usr/local/libexec/psdf#. Вот его текст:
+Типичные текстовые файлы FreeBSD содержат только один символ перевода строки в конце каждой строки. Эти строки будут выводиться "лесенкой" на стандартном принтере:
[.programlisting]
....
-#!/bin/sh
-#
-# psdf - фильтр принтера, преобразующий DVI в PostScript
-# Установлен в /usr/local/libexec/psdf
-#
-# Вызывается системой lpd при выполнении пользователем команды lpr -d
-#
-exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
+A printed file looks
+ like the steps of a staircase
+ scattered by the wind
....
-Это скрипт выполняет команду `dvips` в режиме фильтрования (аргумент `-f`) входного потока, представляющего собой задание для печати. Затем запускается фильтр PostScript(R)-принтера `lprps` (см. раздел <<printing-advanced-if-conversion,Прием заданий с обычным текстом на PostScript(R)-принтеры>>) с аргументами, переданными системой LPD этому скрипту. Команда `lprps` будет использовать эти аргументы для учета распечатанных страниц.
-
-===== Дополнительные примеры фильтров преобразования
-
-Поскольку нет фиксированного набора шагов для установки фильтров преобразования, я просто представлю дополнительные примеры. Используйте их в качестве руководства при создании собственных фильтров. Используйте их непосредственно, если нужно.
-
-Следующий пример фильтра преобразует растровый файл (точнее, GIF-файл) для печати на принтере Hewlett Packard LaserJet III-Si:
+Фильтр может преобразовывать символы новой строки в возврат каретки и новую строку. Возврат каретки заставляет принтер возвращаться к левому краю после каждой строки. Создайте файл [.filename]#/usr/local/libexec/lf2crlf# со следующим содержимым:
[.programlisting]
....
#!/bin/sh
-#
-# hpvf - Преобразовать GIF-файлы в HP/PCL и напечатать
-# Установлен в /usr/local/libexec/hpvf
-
-PATH=/usr/X11R6/bin:$PATH; export PATH
-giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
- && exit 0 \
- || exit 2
+CR=$'\r'
+/usr/bin/sed -e "s/$/${CR}/g"
....
-Он работает путем преобразования GIF-файла в переносимый формат anymap, его - в переносимый формат graymap, затем - в переносимый bitmap, а уже его - в данные, подходящие для LaserJet/PCL.
-
-Вот файл [.filename]#/etc/printcap# с записью для принтера, в которой используется представленный выше фильтр:
+Установите разрешения и сделайте файл исполняемым:
-[.programlisting]
+[source, shell]
....
-#
-# /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:
+# chmod 555 /usr/local/libexec/lf2crlf
....
-Следующий скрипт является фильтром преобразования для печати данных troff, получаемых из системы набора groff, на PostScript(R)-принтере `bamboo`:
+Измените [.filename]#/etc/printcap#, чтобы использовать новый фильтр:
[.programlisting]
....
-#!/bin/sh
-#
-# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
-# Установлен в /usr/local/libexec/pstf
-#
-exec grops | /usr/local/libexec/lprps "$@"
+:if=/usr/local/libexec/lf2crlf:\
....
-Представленный выше скрипт снова использует команду `lprps` для взаимодействия с принтером. Если принтер подключен к параллельному порту, придется использовать следующий скрипт:
+Протестируйте фильтр, напечатав тот же текстовый файл. Возврат каретки приведет к тому, что каждая строка будет начинаться с левого края страницы.
-[.programlisting]
-....
-#!/bin/sh
-#
-# pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
-# Установлен в /usr/local/libexec/pstf
-#
-exec grops
-....
-
-Вот и все. Вот какую запись надо добавить в файл [.filename]#/etc/printcap#, чтобы включить этот фильтр:
+[[printing-lpd-filters-enscript]]
+==== Красивое оформление текста на PostScript(R) принтерах с помощью package:print/enscript[]
-[.programlisting]
-....
-:tf=/usr/local/libexec/pstf:
-....
+GNUEnscript преобразует обычные текстовые файлы в аккуратно отформатированный PostScript(R) для печати на принтерах PostScript(R). Он добавляет номера страниц, переносит длинные строки и предоставляет множество других функций, чтобы сделать печать текстовых файлов более удобочитаемой. В зависимости от местного размера бумаги установите один из пакетов: package:print/enscript-letter[] или package:print/enscript-a4[] из коллекции портов.
-Вот пример, который пригодится старым специалистам по языку FORTRAN. Это фильтр для печати текста программы на языке FORTRAN на любом принтере, который может непосредственно печатать обычный текст. Мы установим его для принтера `teak`:
+Создайте файл [.filename]#/usr/local/libexec/enscript# со следующим содержимым:
[.programlisting]
....
#!/bin/sh
-#
-# hprf - Фильтр текста на языке FORTRAN для LaserJet 3si:
-# Установлен в /usr/local/libexec/hprf
-#
-
-printf "\033&k2G" && fpr && printf "\033&l0H" &&
- exit 0
-exit 2
+/usr/local/bin/enscript -o -
....
-Надо добавить следующую строку к записи в файле [.filename]#/etc/printcap# для принтера `teak`, чтобы включить этот фильтр:
+Установите разрешения и сделайте файл исполняемым:
-[.programlisting]
+[source, shell]
....
-:rf=/usr/local/libexec/hprf:
+# chmod 555 /usr/local/libexec/enscript
....
-Перейдем к последнему, более сложному примеру. Мы добавим фильтр DVI для уже использовавшегося принтера LaserJet по имени `teak`. Сначала простая часть: изменить файл [.filename]#/etc/printcap#, указав местонахождение фильтра DVI:
+Измените [.filename]#/etc/printcap#, чтобы использовать новый фильтр:
[.programlisting]
....
-:df=/usr/local/libexec/hpdf:
+:if=/usr/local/libexec/enscript:\
....
-А теперь - часть посложнее: создать фильтр. Для этого нам понадобится программа преобразования DVI в LaserJet/PCL. Набор портов FreeBSD (см. crossref:ports[ports,Набор портов]) содержит одну: соответствующий пакет называется `dvi2xx`. Установка этого пакета дает нам необходимую программу, `dvilj2p`, которая преобразует DVI в коды, подходящие для LaserJet IIp, LaserJet III и LaserJet 2000.
+Проверьте фильтр, напечатав простой текстовый файл.
-Команда `dvilj2p` требует создания достаточно сложного фильтра `hpdf`, поскольку она не может читать стандартный входной поток. Она хочет работать с именем файла. Что еще хуже, имя файла должно завершаться расширением [.filename]#.dvi#, так что использование стандартного входного потока [.filename]#/dev/fd/0# тоже проблематично. Мы можем обойти эту проблему, создав (символическую) связь (с именем, завершающимся суффиксом [.filename]#.dvi#) с устройством [.filename]#/dev/fd/0#, тем самым, заставив команду `dvilj2p` читать из стандартного входного потока.
+[[printing-lpd-filters-ps2pcl]]
+==== Печать PostScript(R) на принтеры `PCL`
-Единственная оставшаяся проблема состоит в том, что мы не можем создавать временную связь в каталоге [.filename]#/tmp#. Символьные связи принадлежат пользователю и группе `bin`. Фильтр же работает от имени пользователя `daemon`. А у каталога [.filename]#/tmp# установлен sticky bit. Фильтр сможет создать связь, но не сможет почистить за собой и удалить ее, поскольку связь будет принадлежать другому пользователю.
+Многие программы создают документы в формате PostScript(R). Однако недорогие принтеры часто поддерживают только простой текст или `PCL`. Этот фильтр преобразует файлы PostScript(R) в `PCL` перед отправкой на принтер.
-Вместо этого, фильтр будет создавать символическую связь в текущем рабочем каталоге, которым является каталог спулинга (задаваемый характеристикой `sd` в файле [.filename]#/etc/printcap#). Это отличное место для выполнения фильтрами своих действий, особенно потому, что (иногда) в каталоге спулинга места больше, чем в [.filename]#/tmp#.
+Установите интерпретатор PostScript(R) Ghostscript, package:print/ghostscript9-base[], из коллекции портов.
-Вот, наконец, и сам фильтр:
+Создайте файл [.filename]#/usr/local/libexec/ps2pcl# со следующим содержимым:
[.programlisting]
....
#!/bin/sh
-#
-# hpdf - Печать данных DVI на принтере HP/PCL
-# Установлен в /usr/local/libexec/hpdf
-
-PATH=/usr/local/bin:$PATH; export PATH
-
-#
-# Определяем функцию для удаления временных файлов. Они существуют
-# в текущем каталоге - в каталоге спулинга для принтера.
-#
-cleanup() {
- rm -f hpdf$$.dvi
-}
-
-#
-# Определяем функцию для обработки критических ошибок: напечатать заданное
-# сообщение и выйти с кодом 2. Код выхода 2 сообщает системе LPD, что не
-# надо повторно пытаться печатать задание.
-#
-fatal() {
- echo "$@" 1>&2
- cleanup
- exit 2
-}
-
-#
-# Если пользователь удаляет задание, система LPD будет посылать сигнал SIGINT,
-# поэтому перехватываем SIGINT (и пару других сигналов), чтобы убрать за собой.
-#
-trap cleanup 1 2 15
-
-#
-# Гарантируем, что не конфликтуем с существующими файлами.
-#
-cleanup
-
-#
-# Связываем входной файл DVI со стандартным входным потоком (файлом для печати).
-#
-ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
-
-#
-# Заменяем LF = CR+LF
-#
-printf "\033&k2G" || fatal "Cannot initialize printer"
-
-#
-# Преобразуем и печатаем. Значение, возвращаемое программой dvilj2p, не надежно,
-# так что мы его игнорируем.
-#
-dvilj2p -M1 -q -e- dfhp$$.dvi
-
-#
-# Убираем за собой и завершаем работу
-#
-cleanup
-exit 0
+/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
....
-[[printing-advanced-autoconv]]
-===== Автоматизированное преобразование: альтернатива фильтрам преобразования
-
-Все эти фильтры преобразования многое дают для среды печати, но требуют от пользователя указывать (в командной строке man:lpr[1]), какой именно фильтр использовать. Если пользователи не особенно разбираются в компьютерах, необходимость указывать опцию фильтра будет их раздражать. Что еще хуже, однако, при неправильном указании опции фильтрования может быть применен фильтр, не соответствующий типу файла, и принтер испортит несколько сотен страниц бумаги.
-
-Вместо установки фильтров преобразования, можно попытаться заставить текстовый фильтр (поскольку он применяется по умолчанию) определять тип файла, который его попросили напечатать, и затем автоматически вызывать соответствующий фильтр преобразования. В этом могут помочь утилиты вроде `file`. Конечно, будет сложно различать _некоторые_ типы файлов - и, конечно же, можно задавать фильтры преобразования только для них.
-
-В наборе портов FreeBSD есть текстовый фильтр, выполняющий автоматическое преобразование; это `apsfilter`. Он может выявлять обычный текст, PostScript(R) и файлы DVI, выполнять соответствующие преобразования и печатать результат.
-
-[[printing-advanced-of]]
-==== Выходные фильтры
-
-Система спулинга LPD поддерживает еще один тип фильтров, который мы еще не рассматривали: выходные фильтры. Выходной фильтр предназначен только для печати обычного текста, как текстовый фильтр, но с множеством упрощений. Если вы используете выходной фильтр, а текстовый фильтр не задан, то:
-
-* Система LPD запускает выходной фильтр один раз для всего задания, а не для каждого файла задания.
-* Система LPD не пытается определить начало или конец файлов в задании для выходного фильтра.
-* Система LPD не передает выходному фильтру имя пользователя или хоста, так что этот фильтр не предназначен для учета использования принтера. Фактически, он получает всего два аргумента:
-+
-`имя-фильтра` -w__ширина__ -l__длина__
-+
-Где _ширина_ берется из характеристики `pw`, а _длина_ - из характеристики `pl` для соответствующего принтера.
-
-Не соблазняйтесь простотой выходного фильтра. Если вы хотите, чтобы каждый файл в задании начинал печататься с новой страницы, выходной фильтр _не поможет_. Используйте текстовый фильтр (также известный как входной); см. раздел <<printing-textfilter,Установка текстового фильтра>>. Более того, выходной фильтр, фактически, - _более сложный_, поскольку он должен проверять посылаемый ему поток байтов в поисках специальных символов-флагов и посылать себе сигналы от имени системы LPD.
-
-Однако выходной фильтр _необходим_, если надо выдавать начальные страницы и требуется посылать управляющие последовательности или другие строки инициализации, чтобы можно было напечатать начальную страницу. (Но он _не поможет_, если необходимо учитывать начальные страницы для пользователя, поскольку система LPD не передает выходному фильтру никакой информации о пользователе или хосте.)
-
-На одном принтере система LPD позволяет совместно с выходным использовать текстовый или другие фильтры. В таких случаях, система LPD будет запускать выходной фильтр только для печати начальной страницы (см. раздел <<printing-advanced-header-pages,Начальные страницы>>). Система LPD затем предполагает, что выходной фильтр _остановится_, посылая ему два байта: ASCII 031 и ASCII 001. Когда выходной фильтр видит эти два байта (031, 001), он должен остановиться, посылая себе сигнал `SIGSTOP`. Когда система LPD закончит выполнение остальных фильтров, она перезапускает выходной фильтр, посылая ему сигнал `SIGCONT`.
-
-Если есть выходной фильтр, но _нет_ текстового, и система LPD обрабатывает задания с обычным текстом, LPD использует для выполнения задания выходной фильтр. Как уже было сказано, выходной фильтр будет печатать все файлы задания последовательно, без прогонов страниц или других настроек бумаги, а это _вряд ли_ вас устроит. Почти во всех случаях необходим текстовый фильтр.
-
-Программа `lpf`, которую мы представили ранее как текстовый фильтр, может также работать как выходной фильтр. Если срочно необходим простой выходной фильтр, но вы не хотите писать код для выявления байтов и посылки сигнала, попробуйте использовать `lpf`. Можно также поместить `lpf` в скрипт командного интерпретатора для обработки любых кодов инициализации, которые может потребовать принтер.
-
-[[printing-advanced-lpf]]
-==== `lpf`: текстовый фильтр
-
-Программа [.filename]#/usr/libexec/lpr/lpf#, поставляемая в составе двоичного дистрибутива FreeBSD, представляет собой текстовый (входной) фильтр, который может печатать с отступом (если задание послано командой `lpr -i`), пропускать все символы на печать (если задание послано командой `lpr -l`), настраивать позицию печати при получении в задании символов забоя и табуляции, а также учитывать количество напечатанных страниц. Она может также использоваться как выходной фильтр.
-
-Программа `lpf` подходит для многих сред печати. И хотя она не позволяет посылать на принтер инициализационные последовательности, легко написать скрипт командного интерпретатора, который будет выполнять необходимую инициализацию, а затем вызывать `lpf`.
-
-Чтобы программа `lpf` корректно выполняла учет страниц, ей необходимо указать корректные значения характеристик `pw` и `pl` в файле [.filename]#/etc/printcap#. Она использует эти значения для определения того, сколько текста может поместиться на странице и сколько страниц было в задании пользователя. Подробнее об учете использования принтера см. в разделе <<printing-advanced-acct,Учет использования принтера>>.
-
-[[printing-advanced-header-pages]]
-=== Начальные страницы
-
-При наличии _множества_ пользователей, использующих различные принтеры, вероятно, можно считать _начальные страницы_ неизбежным злом.
-
-Начальные страницы, которые также называют _баннерными_ или _разделительными страницами_, идентифицируют, кому принадлежат задания после их печати. Обычно информация на них выдается большими, жирными буквами, возможно, с декоративными рамочками, чтобы в пачке распечаток они отличались от реальных документов, образующих задания пользователей. Они позволяют пользователям быстро находить свои задания. Очевидный недостаток выдачи начальных страниц состоит в том, что для каждого задания надо печатать на одну страницу больше, причем, страница эта хоть сколько-нибудь нужна несколько минут, а затем она оказывается в мусорной корзине или сдается в макулатуру. (Учтите, что начальная страница выдается в начале задания, а не перед каждым файлом, так что бумаги может теряться не так уж и много.)
+Установите разрешения и сделайте файл исполняемым:
-Система LPD может выдавать заголовочные страницы для ваших распечаток автоматически, _если_ ваш принтер может непосредственно печатать обычный текст. Если используется PostScript(R)-принтер, потребуется внешняя программа для генерации начальной страницы; см. <<printing-advanced-header-pages-ps,Начальные страницы на PostScript(R)-принтерах>>.
-
-[[printing-advanced-header-pages-enabling]]
-==== Включение выдачи начальных страниц
-
-В разделе <<printing-simple,Простая настройка принтера>> мы отключили выдачу начальных страниц, задав характеристику `sh` (что означает "suppress header") в файле [.filename]#/etc/printcap#. Для включения выдачи начальных страниц на принтер, просто удалите характеристику `sh`.
-
-Кажется слишком просто, правда?
-
-Вы правы. _Может_ потребоваться задать выходной фильтр для посылки строк инициализации на принтер. Вот пример выходного фильтра для Hewlett Packard PCL-совместимых принтеров:
-
-[.programlisting]
+[source, shell]
....
-#!/bin/sh
-#
-# hpof - Выходной фильтр для Hewlett Packard PCL-совместимых принтеров
-# Установлен в /usr/local/libexec/hpof
-
-printf "\033&k2G" || exit 2
-exec /usr/libexec/lpr/lpf
+# chmod 555 /usr/local/libexec/ps2pcl
....
-Задайте полное имя выходного фильтра в качестве значения характеристики `of`. Подробнее об этом см. в разделе <<printing-advanced-of,Выходные фильтры>>.
+Поступающие на вход этого скрипта данные в формате PostScript(R) будут обработаны, преобразованы в `PCL` и отправлены на принтер.
-Вот пример файла [.filename]#/etc/printcap# для принтера `teak`, который мы представили ранее; мы включили выдачу начальных страниц и добавили показанный выше выходной фильтр:
+Измените файл [.filename]#/etc/printcap#, чтобы использовать новый входной фильтр:
[.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:
+:if=/usr/local/libexec/ps2pcl:\
....
-Теперь, когда пользователи выдают задания на принтер `teak`, они получают начальную страницу с каждым заданием. Если пользователи хотят тратить время на поиск своих распечаток, они могут подавить вывод начальных страниц, посылая задание с опцией `lpr -h`; другие опции man:lpr[1] см. в разделе <<printing-lpr-options-misc,Опции начальных страниц>>.
+Протестируйте фильтр, отправив в него небольшую программу PostScript(R):
-[NOTE]
-====
-Система LPD выдает символ прогона страницы (form feed) после начальной страницы. Если ваш принтер использует другой символ или последовательность символов для выброса напечатанной страницы, укажите их в качестве значения характеристики `ff` в файле [.filename]#/etc/printcap#.
-====
-
-[[printing-advanced-header-pages-controlling]]
-==== Управление начальными страницами
-
-Включая выдачу начальных страниц, система LPD будет выдавать длинный _длинный заголовок_, целую страницу с большими буквами, идентифицирующими пользователя, хост и задание. Ниже представлен пример (kelly напечатала задание по имени outline с хоста `rose`):
-
-[.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
-....
-
-Система LPD добавляет прогон страницы после этого текста, чтобы задание начиналось с новой страницы (если только вы не указали характеристику `sf` (suppress form feeds) в записи соответствующего принтера в файле [.filename]#/etc/printcap#).
-
-Если вы предпочитаете, чтобы система LPD создавала _короткий заголовок_, укажите характеристику `sb` (short banner) в файле [.filename]#/etc/printcap#. Начальная страница будет иметь следующий вид:
-
-[.programlisting]
-....
-rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
+[source, shell]
....
-
-Также по умолчанию система LPD печатает начальную страницу перед заданием. Для изменения порядка на обратный, укажите характеристику `hl` (header last) в файле [.filename]#/etc/printcap#.
-
-[[printing-advanced-header-pages-accounting]]
-==== Учет начальных страниц
-
-Использование встроенных начальных страниц системы LPD порождает определенную парадигму учета использования принтера: начальные страницы пользователи _не должны оплачивать_.
-
-Почему?
-
-Поскольку выходной фильтр - единственная внешняя программа, управляющая выдачей начальных страниц, которая может выполнять учет, а ей не передают информацию о _пользователе или хосте_ и учётный файл, так что, она не имеет никакого представления о том, на чей счет отнести использование принтера. Также недостаточно просто "добавлять одну страницу" в текстовом фильтре или в любом из фильтров преобразований (которые имеют информацию о пользователе и хосте), поскольку пользователи могут подавлять выдачу начальных страниц с помощью опции `lpr -h`. И их заставят оплачивать начальные страницы, которые они не печатали. Понятно, что опцию `lpr -h` будут использовать в большинстве случаев те, кто озабочен проблемами окружающей среды, но вы никак не можете стимулировать ее использование.
-
-Также _недостаточно_, чтобы каждый из фильтров генерировал собственные начальные страницы (и, тем самым, мог их учитывать). Если пользователи захотят отказаться от выдачи начальных страниц и укажут опцию `lpr -h`, они все равно их получат, и будут вынуждены оплатить, поскольку система LPD не передает информации о наличии опции `-h` ни одному из этих фильтров.
-
-Итак, что же вы можете сделать?
-
-Вы можете:
-
-* Принять парадигму системы LPD и сделать начальные страницы бесплатными.
-* Установить альтернативную систему вместо LPD, такую как LPRng. В разделе <<printing-lpd-alternatives,Альтернативы стандартному спулеру>> представлена дополнительная информация о других системах спулинга, которые можно использовать вместо LPD.
-* Написать _умный_ выходной фильтр. Обычно выходной фильтр не предназначен для выполнения чего-то кроме инициализации принтера и простых преобразований символов. Он подходит для начальных страниц и заданий с обычным текстом (когда нет текстового (входного) фильтра). Но, если есть текстовый фильтр для заданий с обычным текстом, то система LPD будет запускать выходной фильтр только для начальных страниц. И выходной фильтр может анализировать текст начальной страницы, которую генерирует система LPD, чтобы определить, на счет какого пользователя и хоста отнести начальную страницу. Единственная проблема этого метода в том, что выходной фильтр все равно не знает, какой учетный файл использовать (ему не передают имя файла, заданное в качестве значения характеристики `af`), но при наличии хорошо известного учетного файла, его имя можно явно указать в выходном фильтре. Для упрощения этапа анализа задайте характеристику `sh` (short header) в файле [.filename]#/etc/printcap#. Повторимся, что это может оказаться слишком сложным, и пользователи, несомненно, больше оценят великодушного системного администратора, который сделает начальные страницы бесплатными.
-
-[[printing-advanced-header-pages-ps]]
-==== Начальные страницы на PostScript(R)-принтерах
-
-Как было описано выше, система LPD может генерировать начальную страницу в виде обычного текста, что подходит для многих принтеров. Конечно, PostScript(R)-принтеры не могут непосредственно печатать обычный текст, так что, для них возможность выдачи начальных страниц системы LPD бесполезна - или почти бесполезна.
-
-Один очевидный способ получить начальные страницы - заставить каждый фильтр преобразования и текстовый фильтр генерировать начальную страницу. Эти фильтры должны использовать аргументы имя пользователя и хост для генерации соответствующей начальной страницы. Недостаток этого метода состоит в том, что пользователи будут всегда получать начальные страницы, даже если будут посылать задания с помощью команды `lpr -h`.
-
-Давайте рассмотрим этот метод детально. Следующий сценарий принимает три аргумента (регистрационное имя пользователя, имя хоста и имя задания) и создает простую начальную страницу на языке PostScript(R):
-
-[.programlisting]
+% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
+72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
....
-#!/bin/sh
-#
-# make-ps-header - выдать начальную страницу на языке PostScript в stdout
-# Установлен в /usr/local/libexec/make-ps-header
-#
-#
-# Это единицы измерения PostScript (72 на дюйм). Измените значения для A4 или
-# другого используемого формата бумаги:
-#
-page_width=612
-page_height=792
-border=72
+[[printing-lpd-filters-smart]]
+==== Умные Фильтры
-#
-# Проверяем аргументы
-#
-if [ $# -ne 3 ]; then
- echo "Usage: `basename $0` <user> <host> <job>" 1>&2
- exit 1
-fi
-
-#
-# Сохраняем значения в переменных, в основном, для упрощения понимания
-# последующего PostScript-кода.
-#
-user=$1
-host=$2
-job=$3
-date=`date`
-
-#
-# Посылаем PostScript-код в stdout.
-#
-exec cat <<EOF
-%!PS
-
-%
-% Гарантируем, что не будем влиять на следующее далее задание пользователя
-%
-save
-
-%
-% Делаем тонкую некрасивую рамку по краям бумаги.
-%
-$border $border moveto
-$page_width $border 2 mul sub 0 rlineto
-0 $page_height $border 2 mul sub rlineto
-currentscreen 3 -1 roll pop 100 3 1 roll setscreen
-$border 2 mul $page_width sub 0 rlineto closepath
-0.8 setgray 10 setlinewidth stroke 0 setgray
-
-%
-% Выдаем регистрационное имя пользователя, красивыми, большими и рельефными буквами
-%
-/Helvetica-Bold findfont 64 scalefont setfont
-$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
-($user) show
-
-%
-% Теперь выдаем всякие детали
-%
-/Helvetica findfont 14 scalefont setfont
-/y 200 def
-[ (Job:) (Host:) (Date:) ] {
-200 y moveto show /y y 18 sub def }
-forall
-
-/Helvetica-Bold findfont 14 scalefont setfont
-/y 200 def
-[ ($job) ($host) ($date) ] {
- 270 y moveto show /y y 18 sub def
-} forall
-
-%
-% Вот и все
-%
-restore
-showpage
-EOF
-....
-
-Теперь, каждый из фильтров преобразования и текстовый фильтр может вызвать этот сценарий, чтобы сначала сгенерировать начальную страницу, а затем напечатать задание пользователя. Вот фильтр преобразования DVI, представленный ранее в этом документе, измененный для выдачи начальной страницы:
+Фильтр, который определяет тип входных данных и автоматически преобразует их в правильный формат для принтера, может быть очень удобным. Первые два символа файла PostScript(R) обычно `%!`. Фильтр может обнаружить эти два символа. Файлы PostScript(R) можно передавать на PostScript(R) принтер без изменений. Текстовые файлы можно преобразовать в PostScript(R) с помощью Enscript, как показано ранее. Создайте файл [.filename]#/usr/local/libexec/psif# с таким содержимым:
[.programlisting]
....
#!/bin/sh
#
-# psdf - фильтр преобразования DVI в PostScript
-# Установлен в /usr/local/libexec/psdf
+# psif - Print PostScript or plain text on a PostScript printer
#
-# Вызывается системой lpd при выполнении пользователем команды lpr -d
-#
-
-orig_args="$@"
+IFS="" read -r first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
-fail() {
- echo "$@" 1>&2
+case "$first_two_chars" in
+%!)
+ # %! : PostScript job, print it.
+ echo "$first_line" && cat && exit 0
exit 2
-}
-
-while getopts "x:y:n:h:" option; do
- case $option in
- x|y) ;; # Ignore
- n) login=$OPTARG ;;
- h) host=$OPTARG ;;
- *) echo "LPD started `basename $0` wrong." 1>&2
- exit 2
- ;;
- esac
-done
-
-[ "$login" ] || fail "No login name"
-[ "$host" ] || fail "No host name"
-
-( /usr/local/libexec/make-ps-header $login $host "DVI File"
- /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
-....
-
-Обратите внимание, как фильтр должен анализировать список аргументов, чтобы определить имя пользователя и имя хоста. Анализ аргументов в других фильтрах аргументов выполняется точно так же. Текстовый фильтр принимает, однако, немного другой набор аргументов (см. раздел <<printing-advanced-filters,Как работают фильтры>>).
-
-Как уже упоминалось, представленная выше схема хотя и достаточно проста, но не позволяет учесть опцию "подавить вывод начальной страницы" (опция `-h`) команды `lpr`. Если пользователи хотят сберечь деревья (или несколько копеек, если вы берете деньги и за начальные страницы), они не смогут этого сделать, поскольку каждый фильтр будет выдавать начальную страницу для каждого задания.
-
-Чтобы позволить пользователям отключать выдачу начальной страницы для отдельного задания, надо будет использовать прием, представленный в разделе <<printing-advanced-header-pages-accounting,Учет начальных страниц>>: написать выходной фильтр, который анализирует сгенерированную системой LPD начальную страницу и выдает ее PostScript(R)-версию. Если пользователь посылает задание командой `lpr -h`, система LPD не будет генерировать начальную страницу, как и ваш выходной фильтр. В противном случае, ваш выходной фильтр будет читать текст, полученный от системы LPD, и посылать на принтер соответствующий PostScript(R)-код для начальной страницы.
-
-Если вы используете PostScript(R)-принтер с последовательным интерфейсом, можно использовать систему `lprps`, которая включает выходной фильтр, `psof`, делающий то, что описано выше. Помните, что программа `psof` не учитывает напечатанные пользователями начальные страницы.
-
-[[printing-advanced-network-printers]]
-=== Печать по сети
-
-FreeBSD поддерживает печать по сети: посылку заданий на удаленные принтеры. Печатью по сети обычно называют две разные ситуации:
-
-* Работа с принтером, подключенным к удаленному хосту. Вы устанавливаете принтер с обычным последовательным или параллельным интерфейсом на одном хосте. Затем, вы настраиваете систему LPD для обеспечения доступа к принтеру с других хостов в сети. В разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">> описано, как это сделать.
-* Работа с принтером, подключенным непосредственно к сети. Принтер имеет сетевой интерфейс, кроме (или вместо) более традиционного последовательного или параллельного. Такой принтер может работать следующим образом:
-
-** Он может понимать протокол LPD и даже поддерживать очереди заданий с удаленных хостов. В этом случае, он работает просто как обычный хост с системой LPD. Для настройки такого принтера следуйте той же процедуре, которая описана в разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
-** Он может поддерживать получение потока данных по сети. В этом случае, вы "подключаете" принтер к одному из хостов в сети, делая этот хост ответственным за поддержку очередей заданий и их посылку на принтер. В разделе <<printing-advanced-network-net-if,Принтеры с сетевыми интерфейсами>> представлен ряд советов по установке таких принтеров.
-
-[[printing-advanced-network-rm]]
-==== Принтеры, установленные на удаленных хостах
-
-Система спулинга LPD имеет встроенную поддержку посылки заданий на другие хосты, на которых тоже работает система LPD (или совместимая с LPD). Это позволяет установить принтер на одном хосте и сделать его доступным с других хостов. Она также работает с принтерами, имеющими сетевые интерфейсы и понимающими протокол LPD.
-
-Для обеспечения такого рода удаленной печати, сначала установите принтер на одном хосте, _хосте принтера_, с помощью процедуры, описанной в разделе <<printing-simple,Простая настройка принтера>>. Выполните любые необходимые дополнительные настройки, как описано в разделе <<printing-advanced,Расширенная настройка принтера>>. Не забудьте протестировать принтер и убедиться, обеспечивает ли он заданные возможности системы LPD. Также проверьте, что _локальный хост_ имеет право использовать службу LPD на _удаленном хосте_ (см. раздел <<printing-advanced-restricting-remote,Ограничение приема заданий с удаленных хостов>>).
-
-Если вы используете принтер с сетевым интерфейсом, совместимый с системой LPD, упомянутым в обсуждении выше _хостом принтера_ будет сам принтер, а в качестве _имени принтера_ будет выступать имя, которое вы сконфигурировали для принтера. См. документацию, поставляемую с принтером и/или сетевым интерфейсом принтера.
-
-[TIP]
-====
-
-Если вы используете Hewlett Packard Laserjet, то при задании принтеру имени `text` будет автоматически выполняться преобразование символа LF в последовательность CRLF, так что, сценарий [.filename]#hpif# не понадобится.
-====
-
-Затем, на других хостах, для которых вы хотите обеспечить доступ к принтеру, создайте запись в их файлах [.filename]#/etc/printcap# со следующими компонентами:
-
-. Дайте записи любое подходящее имя. Для простоты, однако, имеет смысл задавать такое же имя и псевдонимы, как и на хосте принтера.
-. Характеристику `lp` оставьте пустой, указав это явно (`:lp=:`).
-. Создайте каталог спулинга и укажите его местонахождение в характеристике `sd`. Система LPD будет сохранять задания в нем, прежде чем они будут посланы на хост принтера.
-. Укажите имя хоста принтера в качестве значения характеристики `rm`.
-. Укажите имя принтера на _хосте принтера_ в качестве значения характеристики `rp`.
-
-Вот и все. Не нужно перечислять фильтры преобразования, размеры страницы и вообще ничего больше в файле [.filename]#/etc/printcap#.
-
-Рассмотрим пример. На хосте `rose` есть два принтера, `bamboo` и `rattan`. Мы позволим пользователям хоста `orchid` печатать на эти принтеры. Вот файл [.filename]#/etc/printcap# для хоста `orchid` (из раздела <<printing-advanced-header-pages-enabling,Включение выдачи начальных страниц>>). В нем уже есть запись для принтера `teak`; мы добавили две записи для принтеров на хосте `rose`:
-
-[.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:
-....
-
-Затем достаточно только создать каталоги спулинга на `orchid`:
-
-[source,shell]
-....
-# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
-# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
-# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
-....
-
-Теперь пользователи хоста `orchid` могут печатать на принтеры `rattan` и `bamboo`. Если, например, пользователь на `orchid` выполнит команду
-
-[source,shell]
-....
-% lpr -P bamboo -d sushi-review.dvi
-....
-
-система LPD на `orchid` будет копировать задание в каталог спулинга [.filename]#/var/spool/lpd/bamboo# и учтет, что печатается задание DVI. Как только на хосте `rose` появится место в каталоге спулинга принтера `bamboo`, две системы LPD передадут файл на хост `rose`. Файл будет ждать в очереди на `rose` пока, наконец, не будет напечатан. Он будет преобразован из формата DVI в PostScript(R) (поскольку `bamboo` является PostScript(R)-принтером) на хосте `rose`.
-
-[[printing-advanced-network-net-if]]
-==== Принтеры с сетевыми интерфейсами
-
-Часто при покупке сетевой карты для принтера можно приобрести две версии: эмулирующую спулер (более дорогая версия) или просто позволяющую принимать на принтер данные так, как если бы использовался последовательный или параллельный порт (более дешевая версия). В этом разделе описано, как использовать более дешёвую версию. Использование более дорогой версии описано в предыдущем разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
-
-Формат файла [.filename]#/etc/printcap# позволяет указывать, какой последовательный или параллельный интерфейс использовать, и (при использовании последовательного интерфейса), какую установить скорость, использовать ли управление потоком, размер отступов для табуляций, преобразование символов новой строки и другие параметры. Но нет способа указать подключение к принтеру, прослушивающему TCP/IP или другой сетевой порт.
-
-Для посылки данных на подключенный к сети принтер, надо разработать программу взаимодействия, которую могут вызывать текстовый фильтр и фильтры преобразований. Вот один из примеров: скрипт `netprint` принимает все данные со стандартного входного потока и посылает их на принтер, подключенный к сети. Мы указываем имя хоста принтера в качестве первого аргумента, а номер порта, к которому надо подключаться - в качестве второго аргумента команды `netprint`. Учтите, что поддерживается только одностороннее взаимодействие (с ОС FreeBSD на принтер); многие сетевые принтеры поддерживают двустороннее взаимодействие, и вы можете захотеть его использовать (для получения состояния принтера, учета и т.п.).
-
-[.programlisting]
-....
-#!/usr/bin/perl
-#
-# netprint - Текстовый фильтр для принтера, подключенного к сети
-# Установлен в /usr/local/libexec/netprint
-#
-$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
-
-$printer_host = $ARGV[0];
-$printer_port = $ARGV[1];
-
-require 'sys/socket.ph';
-
-($ignore, $ignore, $protocol) = getprotobyname('tcp');
-($ignore, $ignore, $ignore, $ignore, $address)
- = gethostbyname($printer_host);
-
-$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
-
-socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
- || die "Can't create TCP/IP stream socket: $!";
-connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
-while (<STDIN>) { print PRINTER; }
-exit 0;
-....
-
-Затем можно использовать этот сценарий в различных фильтрах. Пусть у нас есть строчный принтер Diablo 750-N, подключенный к сети. Принтер принимает данные на печать через порт 5100. Имя хоста для принтера - scrivener. Вот текстовый фильтр для этого принтера:
-
-[.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
-....
-
-[[printing-advanced-restricting]]
-=== Ограничение использования принтера
-
-В этом разделе представлена информация об ограничении доступа к принтеру. Система LPD позволяет управлять тем, кто может обращаться к принтеру, как локально, так и удаленно, смогут ли они печатать несколько копий, насколько большими могут быть их задания и насколько могут разрастаться очереди печати.
-
-[[printing-advanced-restricting-copies]]
-==== Ограничение количества копий
-
-Система LPD позволяет пользователям легко печатать несколько копий файла. Пользователи могут печатать задания с помощью команды `lpr -#5` (например) и получать пять копий каждого файла в задании. Хорошо это или нет - решать вам.
-
-Если вы считаете, что многочисленные копии только изнашивают ваши принтеры, можете отключить опцию `-#` команды man:lpr[1], добавив характеристику `sc` в файл [.filename]##/etc/printcap##. Когда пользователи пошлют задания с опцией `-##`, они увидят:
-
-[source,shell]
-....
-lpr: multiple copies are not allowed
-....
-
-Учтите, что если вы настроили удаленный доступ к принтеру (см. раздел <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>), необходимо задать характеристику `sc` также и в файлах [.filename]#/etc/printcap# удаленных хостов, иначе пользователи все равно смогут посылать задания с несколькими копиями с других хостов.
-
-Рассмотрим пример. Вот файл [.filename]#/etc/printcap# для хоста `rose`. Принтер `rattan` вполне надежен, поэтому мы разрешим печатать на него несколько копий, но лазерный принтер `bamboo` несколько более изношен, поэтому мы отключим для него печать нескольких копий, добавив характеристику `sc`:
-
-[.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:
-....
-
-Теперь нам также нужно добавить характеристику `sc` в файле [.filename]#/etc/printcap# на хосте `orchid` (и раз уж мы его меняем, давайте отключим печать нескольких копий для принтера `teak`):
-
-[.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:
+ ;;
+*)
+ # otherwise, format with enscript
+ ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
+ exit 2
+ ;;
+esac
....
-С помощью характеристики `sc` мы предотвращаем использование команды `lpr -#`, но это не мешает пользователям просто выполнить команду man:lpr[1] несколько раз или просто послать один и тот же файл несколько раз в одном задании следующим образом:
+Установите разрешения и сделайте файл исполняемым:
-[source,shell]
+[source, shell]
....
-% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
+# chmod 555 /usr/local/libexec/psif
....
-Есть много способов предотвратить такое некорректное использование (включая его игнорирование), которые вы можете разработать самостоятельно.
-
-[[printing-advanced-restricting-access]]
-==== Ограничение доступа к принтерам
-
-Вы можете управлять тем, кто и на какие принтеры может печатать, с помощью механизма групп UNIX(R) и характеристики `rg` в файле [.filename]#/etc/printcap#. Просто поместите пользователей, которым необходимо предоставить доступ к принтеру, в определенную группу, a затем укажите эту группу в качестве значения характеристики `rg`.
-
-Пользователи, не входящие в эту группу (включая `root`) будут получать уведомление `lpr: Not a member of the restricted group` при попытке печатать на контролируемый принтер.
-
-Как и в случае с характеристикой `sc` (подавить выдачу нескольких копий), при необходимости, надо указывать характеристику `rg` и на удаленных хостах, имеющих доступ к вашим принтерам (см. раздел <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>).
-
-Например, давайте разрешим всем обращаться к принтеру `rattan`, но только пользователи группы `artists` смогут использовать принтер `bamboo`. Вот знакомый уже файл [.filename]#/etc/printcap# для хоста `rose`:
+Измените файл [.filename]#/etc/printcap#, чтобы использовать новый входной фильтр:
[.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:
+:if=/usr/local/libexec/psif:\
....
-Давайте не будем менять другой рассматриваемый файл [.filename]#/etc/printcap# (для хоста `orchid`). Конечно, в результате, любой пользователь `orchid` может печатать на `bamboo`. Возможно, на хосте `orchid` учетных записей и так немного, и вы хотите, чтобы все они имели доступ к принтеру. Или нет.
+Протестируйте фильтр, распечатав файлы в формате PostScript(R) и обычные текстовые файлы.
-[NOTE]
-====
-Для принтера может быть только одна ограниченная группа.
-====
-
-[[printing-advanced-restricting-sizes]]
-==== Контроль размеров посылаемых заданий
-
-Если к принтеру обращается несколько пользователей, вам, возможно, понадобиться установить ограничение на максимальный размер файлов, которые пользователи могут посылать на печать. В конечном итоге, размер файловой системы, в которой находятся каталоги спулинга, ограничен, и надо гарантировать, что в нем останется место для заданий других пользователей.
-
-Система LPD ограничить максимально допустимый размер файла в задании с помощью характеристики `mx`. Размер задается в блоках, размер которых, `BUFSIZ`, составляет 1024 байта. Если задать этой характеристике значение ноль, размер файла ограничиваться не будет; однако, если характеристика `mx` вообще не задана, то будет использоваться стандартное ограничение - 1000 блоков.
-
-[NOTE]
-====
-Ограничение применяется к _файлам в задании_, а _не_ к общему размеру задания.
-====
-
-Система LPD не откажется печатать файл больше максимально допустимого для принтера размера. Вместо этого, она поставит в очередь часть файла до заданного предела, и она будет напечатана. Остальное не будет напечатано. Правильность такого поведения не бесспорна.
-
-Давайте установим ограничения для принтеров из наших примеров, `rattan` и `bamboo`. Поскольку PostScript(R)-файлы этих художников обычно бывают весьма большими, мы ограничим их размер пятью мегабайтами. Мы не будем ограничивать использование обычного текстового строчного принтера:
-
-[.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:
-....
+[[printing-lpd-queues]]
+=== Множественные очереди
-Опять таки, ограничения применяются только для локальных пользователей. Если вы настроили удаленный доступ к принтерам, для удаленных пользователей эти ограничения не действуют. Надо задать характеристику `mx` и в файлах [.filename]#/etc/printcap# удаленных хостов. Более детальную информацию по удаленной печати см. в разделе <<printing-advanced-network-rm,"Принтеры, установленные на удаленных хостах">>.
+Записи в [.filename]#/etc/printcap# фактически являются определениями _очередей_. Для одного принтера может быть несколько очередей. В сочетании с фильтрами множественные очереди предоставляют пользователям больше контроля над печатью их заданий.
-Есть еще один специализированный способ ограничить размер заданий печати с удаленных принтеров; см. раздел <<printing-advanced-restricting-remote,Ограничение печати заданий с удаленных хостов>>.
+В качестве примера рассмотрим сетевой PostScript(R) лазерный принтер в офисе. Большинство пользователей хотят печатать простой текст, но несколько продвинутых пользователей хотят иметь возможность печатать PostScript(R) файлы напрямую. Для одного и того же принтера можно создать две записи в [.filename]#/etc/printcap#:
-[[printing-advanced-restricting-remote]]
-==== Ограничение печати заданий с удаленных хостов
-
-Система спулинга LPD обеспечивает несколько способов ограничить посылку заданий с удаленных хостов:
-
-Ограничения хостов::
-Вы можете управлять тем, с каких удаленных хостов локальная система LPD принимает запросы, с помощью файлов [.filename]#/etc/hosts.equiv# и [.filename]#/etc/hosts.lpd#. Система LPD проверяет, поступает ли входящий запрос с хоста, указанного в одном из этих файлов. Если нет, система LPD отвергает запрос.
-+
-Формат этих файлов простой: по одному имени хоста в строке. Учтите, что файл [.filename]#/etc/hosts.equiv# также используется протоколом man:ruserok[3] и влияет на программы man:rsh[1] и man:rcp[1], так что, будьте внимательны.
-+
-Например, вот файл [.filename]#/etc/hosts.lpd# для хоста `rose`:
-+
[.programlisting]
....
-orchid
-violet
-madrigal.fishbaum.de
-....
-+
-Это означает, что хост `rose` будет принимать запросы с хостов `orchid`, `violet` и `madrigal.fishbaum.de`. Если любой другой хост попытается обратиться к системе LPD хоста `rose`, его задание будет отвергнуто.
+textprinter:\
+ :lp=9100@officelaser:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/textprinter:\
+ :if=/usr/local/libexec/enscript:\
+ :lf=/var/log/lpd-errs:
-Ограничения размера::
-Вы можете управлять тем, сколько свободного места должно оставаться в файловой системе, в которой находится каталог спулинга. Создайте файл с именем [.filename]#minfree# в каталоге спулинга для локального принтера. Вставьте в этот файл число, задающее, сколько блоков диска (по 512 байтов) должно быть свободными, чтобы удаленное задание было принято.
-+
-Это позволяет гарантировать, что удаленные пользователи не заполнят вашу файловую систему. Можно также использовать этот механизм для предоставления определенного преимущества локальным пользователям: они смогут ставить задания в очередь еще долго после того, как свободного места на диске станет меньше, чем указано в файле [.filename]#minfree#.
-+
-Например, давайте добавим файл [.filename]#minfree# для принтера `bamboo`. Найдем в файле [.filename]#/etc/printcap# каталог спулинга для этого принтера; вот запись для принтера `bamboo`:
-+
-[.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:
-....
-+
-Каталог спулинга задается характеристикой `sd`. Укажем, что в файловой системе должно быть три мегабайта (что составляет 6144 блоков диска) свободного места, чтобы система LPD принимала удаленные задания:
-+
-[source,shell]
-....
-# echo 6144 > /var/spool/lpd/bamboo/minfree
+psprinter:\
+ :lp=9100@officelaser:\
+ :sh:\
+ :mx#0:\
+ :sd=/var/spool/lpd/psprinter:\
+ :lf=/var/log/lpd-errs:
....
-Ограничения пользователей::
-Вы можете управлять тем, какие удаленные пользователи смогут печатать на локальные принтеры, задавая характеристику `rs` в файле [.filename]#/etc/printcap#. Когда характеристика `rs` указана в записи для локально подключенного принтера, система LPD будет принимать задания с удаленных хостов, _если_ пользователь, посылающий задание, также имеет учетную запись с тем же именем на локальном хосте. В противном случае, система LPD отвергает задание.
-+
-Эта возможность особенно полезна в среде, где есть, например, несколько отделов, совместно использующих сеть, и некоторые пользователи могут переходить из отдела в отдел. Если дать им учетные записи в системах, они смогут использовать принтеры из систем в своих отделах. Если вы хотели бы позволить им использовать _только_ принтеры, но не остальные ресурсы вашего компьютера, можно дать им "формальные" учетные записи, без начального каталога и с бесполезным начальным командным интерпретатором вроде [.filename]#/usr/bin/false#.
-
-[[printing-advanced-acct]]
-=== Учет использования принтера
-
-Итак, вам надо брать деньги за распечатки. А почему нет? Бумага и чернила стоят денег. А есть еще и затраты на поддержку в работоспособном состоянии - принтеры имеют множество движущихся частей и склонны к поломкам. Вы проанализировали состояние принтеров, объемы использования и затраты на их эксплуатацию, и получили определенную стоимость страницы (или фута, метра или чего угодно). Теперь, как же начать реально учитывать распечатки?
-
-Итак, плохая новость состоит в том, что система спулинга LPD в этом не сильно поможет. Учет сильно зависит от типа используемого принтера, форматов распечаток и _ваших_ требований к оплате использования принтеров.
-
-Для реализации учета надо изменить текстовый фильтр принтера (чтобы учитывать обычные текстовые задания) и фильтры преобразования (чтобы учитывать другие форматы файлов), для подсчета страниц или запроса количества напечатанных страниц у принтера. Не получится обойтись использованием простого выходного фильтра, поскольку он не может выполнять учет. См. раздел <<printing-advanced-filter-intro,Фильтры>>.
-
-Обычно есть два способа выполнения учета:
+Документы, отправленные на `textprinter`, будут отформатированы фильтром [.filename]#/usr/local/libexec/enscript#, показанным в предыдущем примере. Опытные пользователи могут печатать PostScript(R) файлы на `psprinter`, где фильтрация не выполняется.
-* _Периодический учет_ - более распространенный способ, возможно, потому, что он проще. Когда кто-то печатает задание, фильтр регистрирует пользователя, хост и количество страниц в учетном файле. Каждый месяц, семестр, год или раз в любой желаемый период времени, вы собираете учетные файлы для различных принтеров, суммируете напечатанные каждым пользователем страницы и выставляете суммы за использование. Затем вы очищаете все регистрационные файлы, начиная с чистого листа новый отчетный период.
-* _Постоянный учет_ используется реже, вероятно, потому, что сложнее в реализации. Этот метод требует от фильтров выставлять пользователям суммы за распечатки сразу после использования принтеров. Как и проверка дисковых квот, этот учет выполняется немедленно. Вы можете не давать пользователям печатать, если баланс на их счету стал отрицательным, а также предоставить им способ проверить и изменить свои "квоты печати". Но этот метод требует поддержки базы данных для отслеживания пользователей и квот.
+Этот метод с несколькими очередями может быть использован для предоставления прямого доступа к различным функциям принтера. Принтер с дуплексом может использовать две очереди: одну для обычной односторонней печати и другую с фильтром, который отправляет последовательность команд для включения двусторонней печати, а затем передает входящий файл.
-Система спулинга LPD легко поддерживает оба метода: поскольку вы (в большинстве случаев) должны предоставить фильтры, вам придется предоставить и код для учета. Но есть и положительный момент: методы учета могут быть сколько угодно гибкими. Например, можно выбрать периодический или постоянный учет. Можно выбрать, какую именно информацию регистрировать: имена пользователей, имена хостов, типы заданий, количество напечатанных страниц, квадратные метры использованной бумаги, продолжительность печати заданий, и т.д. Это делается путем изменения фильтров так, чтобы они сохраняли соответствующую информацию.
+[[printing-lpd-monitor]]
+=== Мониторинг и управление печатью
-==== Простая система учета использования принтера
+Доступно несколько утилит для мониторинга заданий печати, проверки и управления работой принтера.
-В составе FreeBSD поставляется две программы, которые можно сразу использовать для организации простой системы периодического учета. Речь идет о текстовом фильтре `lpf`, описанном в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>, и о программе man:pac[8], обеспечивающей сбор и суммирование записей из учетных файлов принтеров.
+[[printing-lpd-monitor-lpq]]
+==== man:lpq[1]
-Как уже упоминалось в разделе, посвященном фильтрам (<<printing-advanced-filters,Фильтры>>), система LPD при запуске текстового фильтра и фильтров преобразований передает им имя учетного файла в командной строке. Фильтры могут использовать соответствующий аргумент, чтобы определить, куда записывать учетную информацию. Имя этого файла берется из значения характеристики `af` в файле [.filename]#/etc/printcap# и, если не заданно как абсолютное, интерпретируется относительно каталога спулинга.
+man:lpq[1] отображает состояние заданий печати пользователя. Задания печати других пользователей не показываются.
-Система LPD запускает `lpf` с аргументами ширины и длины страницы (которые берутся из характеристик `pw` и `pl`). Программа `lpf` использует эти аргументы для определения количества бумаги, которая будет использована. После посылки файла на принтер она вносит запись в учетный файл. Эти записи имеют следующий вид:
+Показать ожидающие задания текущего пользователя на одном принтере:
-[.programlisting]
+[source, shell]
....
-2.00 rose:andy
-3.00 rose:kelly
-3.00 orchid:mary
-5.00 orchid:mary
-2.00 orchid:zhang
+% lpq -Plp
+Rank Owner Job Files Total Size
+1st jsmith 0 (standard input) 12792 bytes
....
-Следует использовать отдельный учетный файл для каждого принтера, поскольку программа `lpf` не реализует механизм блокирования файлов, и два экземпляра `lpf` могут повредить записи друг друга, если записывают одновременно в один и тот же файл. Простой способ выделить отдельный учетный файл для каждого принтера - использовать характеристику `af=acct` в файле [.filename]#/etc/printcap#. Тогда каждый учетный файл окажется в каталоге спулинга соответствующего принтера и будет назван [.filename]#acct#.
-
-Когда вы будете готовы выставить пользователям счет за распечатки, запустите программу man:pac[8]. Просто перейдите в каталог спулинга принтера, учетную информацию которого вы хотите обработать, и введите команду `pac`. Вы получите итоговые суммы в долларах, как показано ниже:
+Показать ожидающие задания текущего пользователя на всех принтерах:
-[source,shell]
+[source, shell]
....
- 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
+% lpq -a
+lp:
+Rank Owner Job Files Total Size
+1st jsmith 1 (standard input) 27320 bytes
-total 337.00 154 $ 6.74
+laser:
+Rank Owner Job Files Total Size
+1st jsmith 287 (standard input) 22443 bytes
....
-Команда man:pac[8] принимает следующие аргументы:
-
-`-P _принтер_`::
-По какому _принтеру_ подсчитывать итоговые суммы. Эта опция работает, только если в качестве значения характеристики `af` в файле [.filename]#/etc/printcap# указано абсолютное имя.
-
-`-c`::
-Сортировать отчет по сумме, а не по имени пользователя в алфавитном порядке.
-
-`-m`::
-Игнорировать имя хоста в учетных файлах. При указании этой опции, пользователь `smith` на хосте `alpha` считается тем же, что и пользователь `smith` на хосте `gamma`. Обычно эти пользователи считаются разными.
-
-`-p _стоимость_`::
-Вычислять суммы из расчета _стоимость_ долларов за страницу или за фут, вместо использования значения характеристики `pc` в файле [.filename]#/etc/printcap#, или двух центов (как принято по умолчанию). Можно задавать _стоимость_ как число с плавающей запятой.
-
-`-r`::
-Изменить порядок сортировки.
-
-`-s`::
-Создать итоговый учетный файл и очистить учетный файл.
-
-_имя..._::
-Выдать учетную информацию только для пользователей с заданными _именами_.
-
-В стандартном отчете, который создает команда man:pac[8], выдается количество страниц, напечатанное каждым из пользователей с различных хостов. Если для вас хосты не имеют значения (поскольку пользователи могут работать на любом хосте), выполните команду `pac -m` для получения следующих итогов:
-
-[source,shell]
-....
- 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
-....
-
-Для получения сумм в долларах программа man:pac[8] использует значение характеристики `pc` в файле [.filename]#/etc/printcap# (по умолчанию - 200, или 2 цента за страницу). Укажите в качестве значения этой характеристики, в сотых долях цента, стоимость страницы или фута, исходя из которой вы хотите брать деньги за распечатки. Это значение можно переопределить при вызове команды man:pac[8] с помощью опции `-p`. Но при использовании опции `-p` стоимость надо указывать в долларах, а не в сотых долях цента. Например, команда
-
-[source,shell]
-....
-# pac -p1.50
-....
-
-приводит к тому, что страница будет стоить один доллар пятьдесят центов. Используя эту опцию, можно фактически начинать грести деньги лопатой.
-
-Наконец, при выполнении команды `pac -s` итоговая информация будет сохранена в итоговом учетном файле, имя которого строится как имя учетного файла принтера с суффиксом `_sum`. Затем учетный файл принтера очищается. Когда команда man:pac[8] выполняется повторно, она перечитывает итоговый файл для получения начальных сумм, а затем добавляет информацию из обычного учетного файла.
-
-==== Как можно подсчитать количество напечатанных страниц?
-
-Для выполнения хоть отдаленно точного учета надо уметь определять, сколько бумаги использовано для печати задания. Это - основная проблема учета использования принтеров.
-
-Для обычных текстовых заданий решить эту проблему не сложно: надо считать, сколько строк входит в задание, и сравнивать с количеством строк на страницу, которые поддерживает принтер. Не забывайте учитывать символы забоя в файлах, которые приводят к перепечатке строк поверх, а также длинные логические строки, которые переносятся на несколько физических.
-
-Текстовый фильтр `lpf` (представленный в разделе <<printing-advanced-lpf,lpf: текстовый фильтр>>) учитывает эти вещи при выполнении учета. Если вы пишете текстовый фильтр, который должен осуществлять учет, может иметь смысл просмотреть исходный код программы `lpf`.
-
-Но как обрабатывать файлы других форматов?
-
-Ну, для преобразования из DVI в формат LaserJet или из DVI в PostScript(R), можно в фильтре анализировать диагностические результаты команды `dvilj` или `dvips`, чтобы определить, сколько страниц было преобразовано. Может оказаться возможным применить этот прием и для других форматов файлов и программ преобразования.
-
-Но эти методы несовершенны из-за того, что принтер мог фактически и не напечатать все эти страницы. Например, он мог замять бумагу, в нем мог закончиться тонер или он мог вообще взорваться - и пользователю все равно пришлось бы платить.
-
-Так что же делать?
-
-Есть только один _надежный_ способ _точного_ учета. Купите принтер, который может сообщать, сколько бумаги он использовал, и подключите его через последовательный порт или по сети. Практически все PostScript(R)-принтеры поддерживают такую возможность. Другие модели - тоже (сетевые лазерные принтеры Imagen, например). Измените фильтры для этих принтеров так, чтобы получать количество использованных страниц после печати каждого задания, и пусть они записывают учетную информацию _только_ на основе этого значения. Не надо ни считать строки, ни выполнять чреватую ошибками обработку файла.
-
-Конечно, всегда можно поступить великодушно и не брать денег за распечатки.
+[[printing-lpd-monitor-lprm]]
+==== man:lprm[1]
-[[printing-using]]
-== Использование принтеров
+man:lprm[1] используется для удаления заданий печати. Обычные пользователи могут удалять только свои собственные задания. `root` может удалять любые или все задания.
-В этом разделе описано, как использовать настроенные принтеры в ОС FreeBSD. Вот сводка команд пользовательского уровня:
+Удалить все ожидающие задания из принтера:
-man:lpr[1]::
-Печать заданий
-
-man:lpq[1]::
-Проверка очередей принтеров
-
-man:lprm[1]::
-Удаление заданий из очередей принтеров
-
-Есть также административная команда, man:lpc[8], описанная в разделе <<printing-lpc,Администрирование принтеров>>, используемая для управления принтерами и их очередями.
-
-Все три команды, man:lpr[1], man:lprm[1] и man:lpq[1], поддерживают опцию `-P _имя-принтера_`, позволяющую указать, с каким принтером/очередью из указанных в файле [.filename]#/etc/printcap# работать. Это позволяет посылать, удалять и проверять задания на разных принтерах. Если вы не используете опцию `-P`, эти команды используют принтер, указанный в качестве значения переменной среды `PRINTER`. Наконец, если переменная среды `PRINTER` не задана, эти команды по умолчанию направляются на принтер по имени `lp`.
-
-Далее термин _стандартный принтер_ означает принтер, указанный переменной среды `PRINTER` или принтер по имени `lp`, если переменная среды `PRINTER` не задана.
-
-[[printing-lpr]]
-=== Задания печати
-
-Для печати файлов, выполните команду:
-
-[source,shell]
+[source, shell]
....
-% lpr имя-файла ...
+# lprm -Plp -
+dfA002smithy dequeued
+cfA002smithy dequeued
+dfA003smithy dequeued
+cfA003smithy dequeued
+dfA004smithy dequeued
+cfA004smithy dequeued
....
-Эта команда печатает каждый из перечисленных файлов на стандартный принтер. Если файлы не указаны, команда man:lpr[1] читает данные для печати со стандартного входного потока. Например, следующая команда печатает некоторые важные системные файлы:
+Удалить отдельное задание из принтера. Для определения номера задания используется man:lpq[1].
-[source,shell]
-....
-% lpr /etc/host.conf /etc/hosts.equiv
+[source, shell]
....
+% lpq
+Rank Owner Job Files Total Size
+1st jsmith 5 (standard input) 12188 bytes
-Для выбора конкретного принтера, введите:
-
-[source,shell]
-....
-% lpr -P имя-принтера имя-файла ...
+% lprm -Plp 5
+dfA005smithy dequeued
+cfA005smithy dequeued
....
-Следующая команда печатает подробный листинг текущего каталога на принтере `rattan`:
+[[printing-lpd-monitor-lpc]]
+==== man:lpc[8]
-[source,shell]
-....
-% ls -l | lpr -P rattan
-....
+man:lpc[8] используется для проверки и изменения состояния принтеров. После `lpc` указывается команда и, при необходимости, имя принтера. Вместо имени конкретного принтера можно использовать `all`, и тогда команда будет применена ко всем принтерам. Обычные пользователи могут просматривать статус с помощью man:lpc[8]. Только пользователь `root` может использовать команды, изменяющие состояние принтеров.
-Поскольку для команды man:lpr[1] файлы не указаны, команда `lpr` читает данные для печати из стандартного входного потока, который содержит результат выполнения команды `ls -l`.
+Показать состояние всех принтеров:
-Команда man:lpr[1] может также принимать множество опций для управления форматированием, применения преобразований, печати нескольких копий и т.д. Дополнительную информацию см. в разделе <<printing-lpr-options,Опции печати>>.
-
-[[printing-lpq]]
-=== Проверка заданий
-
-При печати с помощью команды man:lpr[1], данные, которые надо напечатать, помещаются вместе в пакет, который называют "заданием печати", и посылаются системе спулинга LPD. Каждый принтер имеет очередь заданий, и ваше задание ждет в этой очереди вместе с другими вашими заданиями и заданиями других пользователей. Принтер печатает эти задания по принципу первым пришло, первым выполнено.
-
-Для получения очереди стандартного принтера, введите команду man:lpq[1]. Чтобы указать конкретный принтер, используйте опцию `-P`. Например, команда
-
-[source,shell]
+[source, shell]
....
-% lpq -P bamboo
+% lpc status all
+lp:
+ queuing is enabled
+ printing is enabled
+ 1 entry in spool area
+ printer idle
+laser:
+ queuing is enabled
+ printing is enabled
+ 1 entry in spool area
+ waiting for laser to come up
....
-показывает очередь для принтера по имени `bamboo`. Вот пример результатов выполнения команды `lpq`:
+Запретить принтеру принимать новые задания, затем снова разрешить прием новых заданий:
-[source,shell]
+[source, shell]
....
-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
+# lpc disable lp
+lp:
+ queuing disabled
+# lpc enable lp
+lp:
+ queuing enabled
....
-Показано, что в очереди `bamboo` есть три задания. Первое задание, посланное пользователем kelly, получило "номер задания" 9. Каждое задание для принтера получает уникальный номер задания. В большинстве случаев номер задания можно игнорировать, но он потребуется, если надо будет отменить задание; подробнее об этом см. в разделе <<printing-lprm,Удаление заданий>>.
-
-Задание номер 9 состоит из двух файлов; несколько файлов, указанных в командной строке man:lpr[1], считаются частью одного задания. Это задание является текущим активным (обратите внимание на слово `active` в столбце "Rank"), т.е. принтер должен сейчас печатать это задание. Второе задание состоит из данных, передаваемых в качестве стандартного входного потока команде man:lpr[1]. Третье задание послано пользователем `mary`; оно намного больше по объему. Полное имя файла, который печатается, слишком длинное и не помещается, поэтому команда man:lpq[1] просто выдает три точки.
-
-Самая первая строка результатов команды man:lpq[1] тоже полезна: она говорит о том, что сейчас делает принтер (или, по крайней мере, что он делает по мнению системы LPD).
+Приостановить печать, но продолжать принимать новые задания. Затем возобновить печать:
-Команда man:lpq[1] также поддерживает опцию `-l` для генерации подробного длинного листинга. Вот пример результатов выполнения команды `lpq -l`:
-
-[source,shell]
+[source, shell]
....
-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
+# lpc stop lp
+lp:
+ printing disabled
+# lpc start lp
+lp:
+ printing enabled
+ daemon started
....
-[[printing-lprm]]
-=== Удаление заданий
+Перезапустить принтер после возникновения ошибки:
-Если вы передумали печатать задание, можно удалить его из очереди заданий с помощью команды man:lprm[1]. Часто можно использовать man:lprm[1] для удаления активного задания, но часть задания или даже все задание все равно может быть напечатано.
-
-Для удаления задания со стандартного принтера сначала используйте команду man:lpq[1] для поиска номера задания. Затем введите команду:
-
-[source,shell]
+[source, shell]
....
-% lprm номер-задания
+# lpc restart lp
+lp:
+ no daemon to abort
+ printing enabled
+ daemon restarted
....
-Для удаления задания с указанного принтера, задайте опцию `-P` option. Следующая команда удаляет задание номер 10 из очереди заданий принтера `bamboo`:
+Отключите очередь печати и запретите печать, добавив сообщение для пользователей с объяснением проблемы:
-[source,shell]
+[source, shell]
....
-% lprm -P bamboo 10
+# lpc down lp Repair parts will arrive on Monday
+lp:
+ printer and queuing disabled
+ status message is now: Repair parts will arrive on Monday
....
-Для команды man:lprm[1] есть ряд сокращений:
-
-lprm -::
-Удаляет все задания (со стандартного принтера), принадлежащие пользователю, который выполнил команду.
+Включить принтер, который выключен:
-lprm _пользователь_::
-Удаляет все задания (для стандартного принтера), принадлежащие указанному _пользователю_. Суперпользователь может удалять задания других пользователей; обычный пользователь может удалять только собственные задания.
-
-lprm::
-Если в командной строке не указаны номер задания, имя пользователя, или указана опция `-`, команда man:lprm[1] удаляет текущее активное задание на стандартном принтере, если оно принадлежит вам. Суперпользователь может удалять любое активное задание.
-
-Добавьте опцию `-P` для любого из перечисленных выше сокращений, чтобы работать с любым необходимым принтером вместо стандартного. Например, следующая команда удаляет все задания текущего пользователя из очереди принтера по имени `rattan`:
-
-[source,shell]
-....
-% lprm -P rattan -
-....
-
-[NOTE]
-====
-Если вы работаете в сетевой среде, команда man:lprm[1] позволит вам удалять задания только с хоста, с которого они были посланы, даже если тот же принтер доступен и с других хостов. Следующая последовательность команд демонстрирует это:
-
-[source,shell]
+[source, shell]
....
-% lpr -P rattan myfile
-% rlogin orchid
-% lpq -P rattan
-Rank Owner Job Files Total Size
-active seeyan 12 ... 49123 bytes
-2nd kelly 13 myfile 12 bytes
-% lprm -P rattan 13
-rose: Permission denied
-% logout
-% lprm -P rattan 13
-dfA013rose dequeued
-cfA013rose dequeued
+# lpc up lp
+lp:
+ printing enabled
+ daemon started
....
-====
-
-[[printing-lpr-options]]
-=== Не только обычный текст: опции печати
+См. man:lpc[8] для получения дополнительных команд и параметров.
-Команда man:lpr[1] поддерживает несколько опций, управляющих форматированием текста, преобразованием графики и других форматов файлов, выдачей нескольких копий, обработкой задания и др. В этом разделе описаны эти опции.
+[[printing-lpd-shared]]
+=== Общие принтеры
-[[printing-lpr-options-format]]
-==== Опции форматирования и преобразования
+Принтеры часто используются совместно несколькими пользователями в офисах и учебных заведениях. Для удобства совместного использования предусмотрены дополнительные функции.
-Следующие опции команды man:lpr[1] управляют форматированием файлов в задании. Используйте эти опции, если задание содержит не простой текст или если вы хотите сформатировать простой текст с помощью утилиты man:pr[1].
+[[printing-shared-aliases]]
+==== Aliases
-Например, следующая команда печатает файл DVI (из системы верстки TeX) по имени [.filename]#fish-report.dvi# на принтере `bamboo`:
+Имя принтера задается в первой строке записи в [.filename]#/etc/printcap#. Дополнительные имена или _псевдонимы_ могут быть добавлены после этого имени. Псевдонимы отделяются от имени и друг от друга вертикальными чертами:
-[source,shell]
+[.programlisting]
....
-% lpr -P bamboo -d fish-report.dvi
+lp|repairsprinter|salesprinter:\
....
-Эти опции применяются для каждого файла в задании, так что нельзя смешивать (например) файлы DVI и ditroff в одном задании. Вместо этого посылайте однотипные файлы отдельными заданиями, используя для каждого задания соответствующие опции преобразования.
-
-[NOTE]
-====
-Все эти опции, кроме `-p` и `-T`, требуют наличия установленных для целевого принтера фильтров преобразования. Например, опция `-d` требует фильтра преобразования DVI. Подробнее см. в разделе <<printing-advanced-convfilters,Фильтры преобразования>>.
-====
-
-`-c`::
-Печать файлов cifplot.
-
-`-d`::
-Печать файлов DVI.
-
-`-f`::
-Печать текстовых файлов на языке FORTRAN.
-
-`-g`::
-Печать графиков.
-
-`-i _число_`::
-Сдвинуть результат вправо на _число_ столбцов; если _число_ не указано, сдвиг выполняется на 8 столбцов. Эта опция работает только с определенными фильтрами преобразования.
-+
-[NOTE]
-====
-Не помещайте пробелы между `-i` и числом.
-====
-
-`-l`::
-Печать текстовых данных буквально, включая управляющие символы.
-
-`-n`::
-Печать данных ditroff (device independent troff).
+Алиасы могут использоваться вместо имени принтера. Например, сотрудники отдела продаж печатают на свой принтер с помощью
--p::
-Форматировать обычный текст перед печатью утилитой man:pr[1]. Подробнее см. man:pr[1].
-
-`-T _заголовок_`::
-Использовать указанный _заголовок_ в колонтитуле man:pr[1] вместо имени файла. Эта опция учитывается только при использовании вместе с опцией `-p`.
-
-`-t`::
-Печать данных troff.
-
-`-v`::
-Печать растровых данных.
-
-Вот пример: следующая команда печатает красиво сформатированную версию справочного руководства по команде man:ls[1] на стандартный принтер:
-
-[source,shell]
+[source, shell]
....
-% zcat /usr/shared/man/man1/ls.1.gz | troff -t -man | lpr -t
+% lpr -Psalesprinter sales-report.txt
....
-Команда man:zcat[1] распаковывает исходный код страницы справочного руководства man:ls[1] и передает его команде man:troff[1], которая форматирует его и выдает результат в формате GNU troff, передаваемый команде man:lpr[1], посылающей задание спулеру LPD. Поскольку мы использовали опцию `-t` команды man:lpr[1], спулер при печати задания будет преобразовывать результат GNU troff в формат, понятный стандартному принтеру.
-
-[[printing-lpr-options-job-handling]]
-==== Опции обработки заданий
-
-Следующие опции команды man:lpr[1] требуют от системы LPD специальной обработки задания:
+Пользователи отдела ремонта печатают на _своём_ принтере с помощью
--# _копий_::
-Выдавать указанное количество _копий_ каждого файла в задании вместо одной. Администратор может отключить эту опцию для уменьшения износа принтера и поощрения использования ксерокса. См. раздел <<printing-advanced-restricting-copies,Ограничение количества копий>>.
-+
-В следующем примере на стандартный принтер печатается три копии файла [.filename]#parser.c#, а затем - три копии [.filename]#parser.h#:
-+
-[source,shell]
+[source, shell]
....
-% lpr -#3 parser.c parser.h
+% lpr -Prepairsprinter repairs-report.txt
....
--m::
-Посылать почту после завершения задания печати. При указании этой опции, система LPD будет посылать почту на ваше имя после завершения обработки вашего задания. В сообщении будет сказано, выполнено ли задание успешно или по ходу была ошибка, и (часто) - в чем она состояла.
-
--s::
-Не копировать файлы в каталог спулинга, а сделать там на них символические связи.
-+
-Эту опцию имеет смысл использовать при печати больших заданий. Она экономит место в каталоге спулинга (ваше задание может занять все свободное место в файловой системе, в которой находится каталог спулинга). Она также экономит время, поскольку системе LPD не придется копировать каждый байт задания в каталог спулинга.
-+
-Есть, однако, и недостаток: поскольку система LPD будет ссылаться на исходные файлы непосредственно, вы не сможете изменять или удалять их, пока они не будут распечатаны.
-+
-[NOTE]
-====
-Если вы печатаете на удаленный принтер, система LPD будет вынуждена, так или иначе, скопировать файлы с локального хоста на удаленный, поэтому опция ``-s``сэкономит место только в локальном каталоге спулинга, но не в удаленном. Но, она все равно полезна.
-====
-
--r::
-Удалять файлы в задании после копирования в каталог спулинга или после печати, если указана опция `-s`. Будьте внимательны при использовании этой опции!
-
-[[printing-lpr-options-misc]]
-==== Опции начальных страниц
-
-Эти опции команды man:lpr[1] изменяют текст, который обычно выдается на начальной странице задания. Если выдача начальных страниц для целевого принтера отключена, эти опции не действуют. Информацию по настройке начальных страниц см. в разделе <<printing-advanced-header-pages,Начальные страницы>>.
-
--C _текст_::
-Заменить имя хоста на начальной странице _текстом_. Обычно на ней выдается имя хоста, с которого было послано задание.
-
--J _текст_::
-Заменить имя задания на начальной странице _текстом_. Имя задания обычно совпадает с именем первого файла в задании или имеет значение [.filename]#stdin#, если печатается стандартный входной поток.
-
--h::
-Не выдавать начальной страницы.
-+
-[NOTE]
-====
-В некоторых организациях эта опция может не действовать, что определяется способом генерации начальных страниц. Подробнее см. в разделе <<printing-advanced-header-pages,Начальные страницы>>.
-====
-
-[[printing-lpc]]
-=== Администрирование принтеров
+Все документы печатаются на этом единственном принтере. Когда отдел продаж разрастётся настолько, что ему понадобится собственный принтер, псевдоним можно удалить из записи общего принтера и использовать как имя нового принтера. Пользователи в обоих отделах продолжают использовать те же команды, но документы отдела продаж отправляются на новый принтер.
-Как администратор принтеров, вы должны их установить, настроить и протестировать. С помощью команды man:lpc[8] вы можете взаимодействовать с принтерами и другими способами. С помощью man:lpc[8] вы можете:
-
-* Запускать и останавливать принтеры
-* Включать и отключать их очереди
-* Изменять порядок заданий в каждой очереди.
-
-Начнем с замечания по терминологии: если принтер _остановлен_, он не будет печатать ничего из своей очереди. Пользователи могут продолжать посылать задания, которые будут ждать в очереди, пока принтер не будет _запущен_ или пока очередь не будет очищена.
-
-Если очередь _отключена_, ни один пользователь (кроме `root`) не может посылать задания на принтер. Во _включенную_ очередь можно посылать задания. Принтер для отключенной очереди может быть _запущен_; при этом он будет продолжать печатать находящиеся в очереди задания, пока очередь не станет пустой.
-
-В общем случае, для использования команды man:lpc[8] необходимо иметь привилегии `root`. Обычные пользователи могут использовать команду man:lpc[8] только для получения состояния принтера и перезапуска зависшего принтера.
-
-Далее представлена сводка команд man:lpc[8]. Большинство команд принимает аргумент _имя-принтера_, задающий, с каким принтером работать. Можно использовать значение `all` вместо _имени-принтера_, означающее все принтеры, перечисленные в файле [.filename]#/etc/printcap#.
-
-`abort _имя-принтера_`::
-Снять текущее задание и остановить принтер. Пользователи могут продолжать посылать задания, если очередь включена.
-
-`clean _имя-принтера_`::
-Удалить старые файлы из каталога спулинга принтера. Иногда файлы, составляющие задание, не удаляются как положено системой LPD, особенно если в ходе печати были ошибки и выполнялось много административных действий. Эта команда находит файлы, не принадлежащие каталогу спулинга, и удаляет их.
-
-`disable _имя-принтера_`::
-Отключить постановку новых заданий в очередь. Если принтер работает, он продолжит печатать задания, остающиеся в очереди. Суперпользователь (`root`) всегда может посылать задания, даже в отключенную очередь.
-+
-Эта команда полезна при тестировании вновь установленного принтера или фильтра: отключаем очередь и посылаем задания как `root`. Другие пользователи не смогут посылать задания, пока вы не закончите тестирование и не включите очередь повторно командой `enable`.
-
-`down _имя-принтера_ _сообщение_`::
-Отключить принтер. Аналогична последовательности команд `disable` и `stop`. Указанное _сообщение_ выдается как состояние принтера при проверке пользователем очереди принтера с помощью man:lpq[1] или запросе его состояния командой `lpc status`.
-
-`enable _имя-принтера_`::
-Включить очередь для принтера. Пользователи могут посылать задания, но принтер не будет их печатать, пока не будет запущен.
-
-`help _имя-команды_`::
-Выдать справочную информацию по команде _имя-команды_. Если _имя-команды_ не указано, выдает сводку по имеющимся командам.
-
-`restart _имя-принтера_`::
-Перезапустить принтер. Обычные пользователи могут использовать эту команду, если в результате неких чрезвычайных обстоятельств система LPD зависла, но они не могут запустить принтер, остановленный командами `stop` или `down`. Команда `restart` эквивалентна последовательности команд `abort` и `start`.
-
-`start _имя-принтера_`::
-Запустить принтер. Принтер будет печатать задания, находящиеся в его очереди.
-
-`stop _имя-принтера_`::
-Остановить принтер. Принтер закончит печать текущего задания и больше ничего из очереди печатать не будет. Хотя принтер и остановлен, пользователи могут посылать задания во включенную очередь.
-
-`topq _имя-принтера_ _задание-или-имя-пользователя_`::
-Переупорядочить очередь для указанного принтера, помещая указанные по номеру _задания_ или задания указанного по имени _пользователя_ в начало очереди. Для этой команды нельзя использовать `all` в качестве _имени-принтера_.
-
-`up _имя-принтера_`::
-Включить принтер; команда по действию противоположна команде `down`. Эквивалентна последовательности команд `start` и `enable`.
-
-Утилита man:lpc[8] принимает перечисленные выше команды в командной строке. Если команда не указана, утилита man:lpc[8] входит в интерактивный режим, в котором можно вводить команды, пока не будет введена команда `exit`, `quit` или символ конца файла.
-
-[[printing-lpd-alternatives]]
-== Альтернативы стандартному спулеру
-
-Если вы прочитали все это руководство, к этому моменту вы знаете практически все, что надо знать о системе спулинга LPD, входящей в состав ОС FreeBSD. Вы, возможно, уже осознали многие из ее недостатков, что, естественно, приводит к вопросу: "Какие еще системы спулинга существуют (и работают с ОС FreeBSD)"?
-
-LPRng::
-Система LPRng, имя которой означает "LPR: the Next Generation" (LPR: следующее поколение) - это полностью переписанная система PLP. Патрик Пауэл (Patrick Powell) и Джастин Мейсон (Justin Mason) (основной специалист, занимающийся поддержкой PLP) объединили усилия для создания системы LPRng. Основной сайт по системе LPRng - http://www.lprng.org/[http://www.lprng.org/].
-
-CUPS::
-Система CUPS (сокращение от Common UNIX Printing System) предоставляет переносимый механизм печати для операционных систем, основанных на UNIX(R). Она была разработана компанией Easy Software Products в качестве стандартного механизма печати для всех производителей и пользователей UNIX(R).
-+
-Система CUPS использует протокол Internet Printing Protocol (IPP) для управления заданиями и очередями. Протоколы Line Printer Daemon (LPD), Server Message Block (SMB) и AppSocket (известный также как JetDirect) также поддерживаются, но с меньшими возможностями. Система CUPS добавляет поиск сетевых принтеров и опции печати на основе PostScript Printer Description (PPD), для поддержки практической печати в UNIX(R).
-+
-Основной сайт по системе CUPS - http://www.cups.org/[http://www.cups.org/].
+[[printing-shared-headers]]
+==== Страницы заголовков
-[[printing-troubleshooting]]
-== Выявление проблем
+Пользователям может быть сложно найти свои документы в стопке страниц, напечатанных на занятом общем принтере. Для решения этой проблемы были созданы _титульные страницы_. Перед каждой задачей печати выводится титульная страница с именем пользователя и названием документа. Эти страницы также иногда называют _баннерами_ или _разделителями_.
-После выполнения простого тестирования с помощью команды man:lptest[1] вы можете получить один из следующих результатов вместо корректной распечатки:
+Включение титульных страниц различается в зависимости от того, подключен ли принтер напрямую к компьютеру с помощью кабеля `USB`, кабеля параллельного или последовательного порта или удаленно через сеть.
-Все работает, после определенной задержки; или не выдается распечатанная страница.::
-Принтер напечатал все, что нужно, но он на некоторое время задумывался и ничего не делал. Фактически, могло потребоваться нажать кнопку PRINT REMAINING или FORM FEED на принтере, чтобы результаты были выданы.
-+
-Если это произошло, вероятно, принтер ждал, нет ли в задании еще данных, прежде чем что бы то ни было печатать. Для решения этой проблемы можно посылать в текстовом фильтре на принтер символ FORM FEED (или любую необходимую последовательность символов). Этого обычно достаточно, чтобы принтер немедленно распечатал любой остающийся в его внутреннем буфере текст. Также полезно убедиться, что каждое задание печати заканчивается полной страницей, чтобы следующее задание не начиналось где-то с середины последней страницы предыдущего задания.
-+
-Следующий измененный скрипт командного интерпретатора [.filename]#/usr/local/libexec/if-simple# выдает символ прогона страницы после посылки задания на принтер:
-+
-[.programlisting]
-....
-#!/bin/sh
-#
-# if-simple - Простой текстовый входной фильтр для lpd
-# Установлен в /usr/local/libexec/if-simple
-#
-# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
-# Выдает символ прогона страницы (\f) после печати задания.
+Заголовочные страницы на непосредственно подключенных принтерах включаются путем удаления строки `:sh:\` (Suppress Header) из записи в файле [.filename]#/etc/printcap#. Эти заголовочные страницы используют только символы перевода строки для новых строк. Некоторым принтерам может потребоваться фильтр [.filename]#/usr/share/examples/printing/hpif#, чтобы предотвратить ступенчатый текст. Фильтр настраивает принтеры `PCL` на печать как возврата каретки, так и перевода строки при получении символа перевода строки.
-/bin/cat && printf "\f" && exit 0
-exit 2
-....
+Заглавные страницы для сетевых принтеров должны быть настроены на самом принтере. Записи заглавных страниц в [.filename]#/etc/printcap# игнорируются. Настройки обычно доступны через панель управления принтера или веб-интерфейс конфигурации, который можно открыть в браузере.
-Принтер печатает "лесенкой".::
-Вы получаете на бумаге следующее:
-+
-[.programlisting]
-....
-!"#$%&'()*+,-./01234
- "#$%&'()*+,-./012345
- #$%&'()*+,-./0123456
-....
-+
-Вы стали очередной жертвой _эффекта лесенки_, вызванного различными интерпретациями того, какие символы должны обозначать новую строку. Операционные системы UNIX(R)-стиля используют один символ: ASCII-код 10, перевод строки (line feed - LF). MS-DOS(R), OS/2(R) и другие используют пару символов, ASCII-код 10 _и_ ASCII-код 13 (возврат каретки, carriage return или CR). Многие принтеры используют соглашение MS-DOS(R) для представления новых строк.
-+
-При печати из FreeBSD в тексте используется только символ перевода строки. Принтер, встретив символ перевода строки, переходит на следующую строку, но оставляет ту же горизонтальную позицию на строке для следующего печатаемого символа. Вот зачем нужен символ возврата каретки: чтобы перенести следующий печатаемый символ на левый край бумаги.
-+
-Вот что ОС FreeBSD хочет от принтера:
-+
-[.informaltable]
-[cols="1,1", frame="none"]
-|===
+[[printing-lpd-references]]
+=== Список литературы
-|Принтер получает CR
-|Принтер печатает CR
+Примеры файлов: [.filename]#/usr/share/examples/printing/#.
-|Принтер получает LF
-|Принтер печатает CR + LF
-|===
-+
-Вот несколько способов этого добиться:
+_Руководство по системе печати 4.3BSD_, [.filename]#/usr/share/doc/smm/07.lpd/paper.ascii.gz#.
-** Использовать переключатели конфигурации принтера или панель управления, чтобы изменить его интерпретацию этих символов. Поищите как это сделать в руководстве по своему принтеру.
-+
-[NOTE]
-====
-Если вы загружаете другие операционные системы, кроме FreeBSD, может иметь смысл _переконфигурировать_ принтер для использования такой интерпретации символов CR и LF, которая принята в этих операционных системах. Затем можно использовать одно из представленных далее решений.
-====
+Страницы Справочника: man:printcap[5], man:lpd[8], man:lpr[1], man:lpc[8], man:lprm[1], man:lpq[1].
-** Заставить драйвер последовательного порта FreeBSD автоматически преобразовывать LF в CR+LF. Конечно, это подойдет _только_ для принтеров, подключенных к последовательным портам. Для включения этой возможности используйте характеристику `ms#` и установите режим `onlcr` для принтера в файле [.filename]#/etc/printcap#.
-** Послать _управляющий код_ на принтер, заставляющий его временно обрабатывать символы LF по-другому. Управляющие коды, которые может поддерживать ваш принтер, поищите в руководстве своего принтера. Когда найдете соответствующий управляющий код, измените текстовый фильтр для посылки сначала этого кода, а затем - задания печати.
-+
-Вот пример текстового фильтра для принтеров, понимающих управляющие последовательности языка Hewlett-Packard PCL. Этот фильтр заставляет принтер обрабатывать символы LF как LF и CR; затем он посылает задание; наконец, он посылает символ прогона страницы для выдачи последней страницы задания. Он должен работать практически со всеми принтерами Hewlett Packard.
-+
-[.programlisting]
-....
-#!/bin/sh
-#
-# hpif - Простой текстовый входной фильтр для lpd для принтеров на базе HP-PCL
-# Установлен в /usr/local/libexec/hpif
-#
-# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
-# Требует от принтера обрабатывать LF как CR+LF. Выдает страницу по окончании.
+[[printing-other]]
+== Другие системы печати
-printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
-exit 2
-....
-+
-Вот пример файла [.filename]#/etc/printcap# с хоста `orchid`. К нему через первый параллельный порт подключен один принтер, Hewlett Packard LaserJet 3Si, по имени `teak`. Для него в качестве текстового фильтра используется представленный выше скрипт:
-+
-[.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:
-....
+Несколько других систем печати доступны в дополнение к встроенной man:lpd[8]. Эти системы обеспечивают поддержку других протоколов или дополнительные возможности.
-Строки напечатаны одна поверх другой.::
-Принтер так и не перешел на следующую строку. Все строки текста были напечатаны одна поверх другой, на одной строке.
-+
-Эта проблема "обратна" эффекту лесенки, описанному выше, и встречается намного реже. Каким-то образом, символы LF, которые ОС FreeBSD использует для завершения строк, обрабатывались как символы CR и вызывали перевод позиции печати на левый край бумаги, но не переход на следующую строку.
-+
-Используйте переключатели конфигурации принтера или панель управления для обеспечения следующей интерпретации символов LF и CR:
-+
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| Принтер получает
-| Принтер печатает
+[[printing-other-cups]]
+=== CUPS (Common UNIX(R) Printing System)
-|CR
-|CR
+CUPS — это популярная система печати, доступная во многих операционных системах. Использование CUPS в FreeBSD описано в отдельной статье: extref:{cups}[CUPS]
-|LF
-|CR + LF
-|===
-Принтер теряет символы.::
-По ходу печати принтер не печатает несколько символов в каждой строке. Проблема со временем может становиться все хуже, так что теряется все больше символов.
-+
-Проблема состоит в том, что принтер не справляется с той скоростью, с которой компьютер посылает данные по последовательной линии (эта проблема не должна возникать на принтерах, подключенных к параллельным портам). Есть два способа решить проблему:
+[[printing-other-hplip]]
+=== HPLIP
-** Если принтер поддерживает управление потоком XON/XOFF, заставить FreeBSD использовать его, указав режим `ixon` в характеристике `ms#`.
-** Если принтер поддерживает управление несущим потоком (carrier flow control), укажите режим `crtscts` в характеристике `ms#`. Убедитесь, что кабель, соединяющий принтер с компьютером, правильно распаян для управления несущим потоком.
+Компания Hewlett Packard предоставляет систему печати, поддерживающую многие их струйные и лазерные принтеры. Порт находится в package:print/hplip[]. Основная веб-страница расположена по адресу https://developers.hp.com/hp-linux-imaging-and-printing[]. Порт обрабатывает все детали установки в FreeBSD. Информация по настройке доступна на странице https://developers.hp.com/hp-linux-imaging-and-printing/install[].
-Напечатан мусор.::
-Принтер напечатал нечто похожее на случайный мусор, а не требуемый текст.
-+
-Это, обычно, - еще один симптом неправильных параметров взаимодействия с последовательным принтером. Перепроверьте скорость взаимодействия в характеристике `br` и установку четности в характеристике `ms#`; проверьте, что принтер использует те же установки, которые заданы в файле [.filename]#/etc/printcap#.
+[[printing-other-lprng]]
+=== LPRng
-Ничего не произошло.::
-Если ничего не произошло, проблема, вероятно, связана с FreeBSD, а не с оборудованием. Добавьте характеристику журнального файла (`lf`) в файл [.filename]#/etc/printcap# для принтера, работу с которым отлаживаете. Например, вот запись для принтера `rattan` с характеристикой `lf`:
-+
-[.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
-....
-+
-Затем попытайтесь напечатать снова. Поищите в журнальном файле (в нашем примере - [.filename]#/var/log/rattan.log#) возможные сообщения об ошибках. На основе полученных сообщений попытайтесь решить проблему.
-+
-Если вы не зададите характеристику `lf`, система LPD использует по умолчанию [.filename]#/dev/console#.
+LPRng был разработан как улучшенная альтернатива man:lpd[8]. Порт находится в package:sysutils/LPRng[]. Подробности и документацию можно найти на https://lprng.sourceforge.net/[].