---
description: 'Эта глава посвящена системе печати в FreeBSD'
next: books/handbook/linuxemu
params:
  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]]
= Печать
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 11
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/printing/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

Размещение информации на бумаге — это важная функция, несмотря на многочисленные попытки отказаться от неё. Печать состоит из двух основных компонентов. Данные должны быть переданы на принтер и представлены в форме, которую принтер может обработать.

[[printing-quick-start]]
== Быстрый старт

Базовую печать можно быстро настроить. Принтер должен уметь печатать обычный текст `ASCII`. Для печати других типов файлов см. crossref:printing[printing-lpd-filters, Фильтры].

[.procedure]
****
. Создайте каталог для хранения файлов во время печати:
+
[source, shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....
+
. Как `root`, создайте файл [.filename]#/etc/printcap# со следующим содержимым:
+
[.programlisting]
....
lp:\
lp=/dev/unlpt0:\  <.>
sh:\
mx#0:\
sd=/var/spool/lpd/lp:\
lf=/var/log/lpd-errs:
....
+
<.> Эта строка предназначена для принтера, подключенного к порту `USB`.
+
Для принтера, подключённого к параллельному или «принтерному» порту, используйте:
+
[.programlisting]
....
:lp=/dev/lpt0:\
....
+
Для принтера, подключенного напрямую к сети, используйте:
+
[.programlisting]
....
:lp=:rm=network-printer-name:rp=raw:\
....
+
Замените _network-printer-name_ на `DNS` имя хоста сетевого принтера.
+
. Включите LPD, отредактировав файл [.filename]#/etc/rc.conf# и добавив следующую строку:
+
[.programlisting]
....
lpd_enable="YES"
....
+
Запустите службу:
+
[source, shell]
....
# service lpd start
Starting lpd.
....
+
. Напечатайте тест:
+
[source, shell]
....
# printf "1. This printer can print.\n2. This is the second line.\n" | lpr
....
+
[TIP]
====
Если обе строки начинаются не с левого края, а с отступом («ступеньками»), см. crossref:printing[printing-lpd-filters-stairstep, Предотвращение образования ступенек на простых текстовых принтерах].
====
+
Текстовые файлы теперь можно печатать с помощью `lpr`. Укажите имя файла в командной строке или передайте вывод напрямую в `lpr`.
+
[source, shell]
....
% lpr textfile.txt
% ls -lh | lpr
....
****

[[printing-connections]]
== Подключение принтеров

Принтеры подключаются к компьютерным системам различными способами. Небольшие настольные принтеры обычно подключаются непосредственно к `USB`-порту компьютера. Более старые принтеры подключаются к параллельному или «принтерному» порту. Некоторые принтеры подключаются напрямую к сети, что упрощает их совместное использование несколькими компьютерами. Некоторые принтеры используют редкое последовательное соединение через serial-порт.

FreeBSD может взаимодействовать со всеми типами принтеров.

[[printing-connections-usb]]
`USB`::
`USB`-принтеры можно подключить к любому свободному `USB`-порту компьютера.
+
Когда FreeBSD обнаруживает принтер `USB`, создаются два устройства: [.filename]#/dev/ulpt0# и [.filename]#/dev/unlpt0#. Данные, отправленные на любое из этих устройств, будут переданы принтеру. После каждой печати [.filename]#ulpt0# сбрасывает порт `USB`. Сброс порта может вызывать проблемы с некоторыми принтерами, поэтому обычно используется устройство [.filename]#unlpt0#. [.filename]#unlpt0# не сбрасывает порт USB вообще.

[[printing-connections-parallel]]
Параллельный порт (`IEEE`-1284)::
Параллельный порт устройства это [.filename]#/dev/lpt0#. Это устройство присутствует независимо от того, подключен принтер или нет, оно не определяется автоматически.
+
Производители в основном отказались от этих «устаревших» портов, и многие компьютеры больше их не имеют. Для подключения параллельного принтера к порту `USB` можно использовать переходники. С таким переходником принтер можно использовать так, как если бы он был настоящим `USB`-принтером. Также для прямого подключения параллельных принтеров к сети можно использовать устройства, называемые _серверами печати_.

[[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.

[[printing-connections-summary]]
=== Краткое содержание

Проводные сетевые подключения обычно проще всего настроить и обеспечивают наиболее быструю печать. Для прямого подключения к компьютеру предпочтительнее использовать `USB` из-за скорости и простоты. Параллельные подключения работают, но имеют ограничения по длине кабеля и скорости. Последовательные подключения сложнее настроить. Разводка кабелей различается в зависимости от модели, а параметры связи, такие как скорость передачи данных и биты чётности, добавляют сложности. К счастью, последовательные принтеры встречаются редко.

[[printing-pdls]]
== Языки описания страниц

Данные, отправляемые на принтер, должны быть на языке, который принтер может понять. Эти языки называются языками описания страниц или PDL (Page Description Languages).

[[print-pdls-ascii]]
`ASCII`::
Обычный текст `ASCII` — это самый простой способ отправить данные на принтер. Символы соответствуют один к одному тому, что будет напечатано: символ `A` в данных напечатает `A` на странице. Доступно очень мало возможностей форматирования. Нет способа выбрать шрифт или пропорциональные интервалы. Вынужденная простота обычного `ASCII` означает, что текст можно печатать напрямую с компьютера с минимальным или вообще отсутствующим кодированием или преобразованием. Напечатанный вывод напрямую соответствует отправленным данным.
+
Некоторые недорогие принтеры не могут печатать обычный текст `ASCII`. Это усложняет их настройку, но обычно это всё равно возможно.

[[print-pdls-postscript]]
PostScript(R)::
PostScript(R) почти противоположен `ASCII`. Вместо простого текста программа PostScript(R) представляет собой набор инструкций, которые рисуют итоговый документ. Можно использовать различные шрифты и графику. Однако за эту мощь приходится платить. Необходимо написать программу, которая рисует страницу. Обычно эта программа генерируется прикладным программным обеспечением, поэтому процесс остаётся невидимым для пользователя.
+
Недорогие принтеры иногда не поддерживают совместимость с PostScript(R) в целях экономии.

[[print-pdls-pcl]]
`PCL` (Printer Command Language)::
`PCL` является расширением `ASCII`, добавляющим escape-последовательности для форматирования, выбора шрифтов и печати графики. Многие принтеры поддерживают `PCL5`. Некоторые поддерживают более новые версии `PCL6` или `PCLXL`. Эти более поздние версии являются надмножествами `PCL5` и могут обеспечивать более быструю печать.

[[print-pdls-host-based]]
Принтер на основе хоста::
Производители могут снизить стоимость принтера, используя простой процессор и минимум памяти. Такие принтеры не способны печатать обычный текст. Вместо этого растровые изображения текста и графики создаются драйвером на главном компьютере и затем отправляются на принтер. Такие принтеры называются _host-based_ (управляемыми хостом).
+
Взаимодействие между драйвером и принтером, подключенным к хосту, часто осуществляется по проприетарным или недокументированным протоколам, что делает их работоспособными только в наиболее распространённых операционных системах.

[[print-pdls-table]]
=== Преобразование PostScript(R) в другие PDL

Многие приложения из Коллекции портов и утилиты FreeBSD создают вывод в формате PostScript(R). В следующей таблице представлены утилиты для преобразования этого формата в другие распространённые PDL:

[[print-pdls-ps-to-other-tbl]]
.Языки PDL на выходе
[cols="1,1,1", frame="none", options="header"]
|===
<| PDL на выходе
<| Чем создается
<| Заметки

|`PCL` или `PCL5`
|package:print/ghostscript9-base[]
|`-sDEVICE=ljet4` для монохромной печати, `-sDEVICE=cljet5` для цветной

|`PCLXL` или `PCL6`
|package:print/ghostscript9-base[]
|`-sDEVICE=pxlmono` для монохромного режима, `-sDEVICE=pxlcolor` для цветного

|`ESC/P2`
|package:print/ghostscript9-base[]
|`-sDEVICE=uniprint`

|`XQX`
|package:print/foo2zjs[]
| 
|===

[[print-pdls-summary]]
=== Краткое содержание

Для наиболее простой печати выберите принтер с поддержкой PostScript(R). Принтеры, поддерживающие `PCL`, являются следующим предпочтительным вариантом. С помощью package:print/ghostscript9-base[] эти принтеры можно использовать так, как если бы они изначально понимали PostScript(R). Принтеры, которые напрямую поддерживают PostScript(R) или `PCL`, почти всегда также поддерживают прямую печать обычных текстовых файлов в формате `ASCII`.

Строковые принтеры, такие как обычные струйные, обычно не поддерживают PostScript(R) или `PCL`. Они часто могут печатать простые текстовые файлы в формате `ASCII`. Пакет package:print/ghostscript9-base[] поддерживает языки описания страниц (PDL), используемые некоторыми из этих принтеров. Однако печать всей графической страницы на таких принтерах часто происходит очень медленно из-за большого объёма передаваемых и печатаемых данных.

Настроить принтеры, управляемые хостом, часто сложнее. Некоторые из них вообще нельзя использовать из-за проприетарных языков описания страниц (PDL). По возможности избегайте таких принтеров. Информацию о конкретных `PDL`, используемых различными моделями принтеров, можно найти на сайте http://www.openprinting.org/printers[].

[[printing-direct]]
== Прямая печать

Для периодической печати файлы можно отправлять непосредственно на устройство принтера без дополнительной настройки. Например, файл с именем [.filename]#sample.txt# можно отправить на принтер с интерфейсом `USB`:

[source, shell]
....
# cp sample.txt /dev/unlpt0
....

Прямая печать на сетевые принтеры зависит от возможностей принтера, но большинство из них принимают задания на печать через порт 9100, и для этого можно использовать man:nc[1]. Чтобы напечатать тот же файл на принтере с `DNS`-именем хоста _netlaser_:

[source, shell]
....
# nc netlaser 9100 < sample.txt
....

[[printing-lpd]]
== LPD (демон линейного принтера)

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

FreeBSD включает спулер под названием man:lpd[8]. Задания на печать отправляются с помощью man:lpr[1].

[[printing-lpd-setup]]
=== Начальная настройка

Создается каталог для хранения заданий печати, устанавливается владелец, а права доступа настраиваются так, чтобы другие пользователи не могли просматривать содержимое этих файлов:

[source, shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....

Принтеры определяются в файле [.filename]#/etc/printcap#. Запись для каждого принтера включает такие данные, как имя, порт, к которому он подключен, и различные другие параметры. Создайте файл [.filename]#/etc/printcap# со следующим содержимым:

[.programlisting]
....
lp:\				<.>
	:lp=/dev/unlpt0:\	<.>
	:sh:\			<.>
	:mx#0:\			<.>
	:sd=/var/spool/lpd/lp:\	<.>
	:lf=/var/log/lpd-errs:	<.>
....

<.> Имя этого принтера. man:lpr[1] отправляет задания на печать на принтер `lp`, если другой принтер не указан с помощью `-P`, поэтому принтер по умолчанию должен называться `lp`.

<.> Устройство, к которому подключен принтер. Замените эту строку на соответствующую для типа подключения, указанного здесь.

<.> Подавить вывод титульной страницы в начале задания печати.

<.> Не ограничивать максимальный размер задания на печать.

<.> Путь к каталогу спулинга для этого принтера. Каждый принтер использует свой собственный каталог спулинга.

<.> Файл журнала, в который будут записываться ошибки для этого принтера.

После создания [.filename]#/etc/printcap# используйте man:chkprintcap[8] для проверки на ошибки:

[source, shell]
....
# chkprintcap
....

Исправьте все выявленные проблемы перед продолжением.

Включите man:lpd[8] в [.filename]#/etc/rc.conf#:

[.programlisting]
....
lpd_enable="YES"
....

Запустите службу:

[source, shell]
....
# service lpd start
....

[[printing-lpd-lpr]]
=== Печать с помощью man:lpr[1]

Документы отправляются на печать с помощью `lpr`. Файл для печати может быть указан в командной строке или передан в `lpr` через конвейер. Эти две команды эквивалентны и отправляют содержимое файла [.filename]#doc.txt# на принтер по умолчанию:

[source, shell]
....
% lpr doc.txt
% cat doc.txt | lpr
....

Принтеры можно выбрать с помощью `-P`. Для печати на принтере с именем _laser_:

[source, shell]
....
% lpr -Plaser doc.txt
....

[[printing-lpd-filters]]
=== Фильтры

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

Некоторые принтеры не способны печатать обычный текст, а входной файл может даже не быть текстовым.

Фильтры позволяют преобразовывать или обрабатывать файлы. Обычно они используются для преобразования одного типа входных данных, например, простого текста, в формат, который принтер может понять, например PostScript(R) или `PCL`. Фильтры также могут использоваться для предоставления дополнительных функций, таких как добавление номеров страниц или подсветка исходного кода для удобства чтения.

Обсуждаемые здесь фильтры являются _входными фильтрами_ или _текстовыми фильтрами_. Эти фильтры преобразуют входящий файл в различные формы. Используйте man:su[1], чтобы стать `root` перед созданием файлов.

Фильтры указываются в [.filename]#/etc/printcap# с идентификатором `if=`. Чтобы использовать [.filename]#/usr/local/libexec/lf2crlf# в качестве фильтра, измените [.filename]#/etc/printcap# следующим образом:

[.programlisting]
....
lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   <.>
	:lf=/var/log/lpd-errs:
....

<.> `if=` определяет _входной фильтр_, который будет использоваться для входящего текста.

[TIP]
====
Символы обратной косой черты _продолжения строки_ в конце строк в записях [.filename]#printcap# показывают, что запись для принтера на самом деле представляет собой одну длинную строку с элементами, разделёнными двоеточиями. Предыдущий пример можно переписать в виде одной менее читаемой строки:

[.programlisting]
....
lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
....

====

[[printing-lpd-filters-stairstep]]
==== Предотвращение ступенчатости на простых текстовых принтерах

Типичные текстовые файлы FreeBSD содержат только один символ перевода строки в конце каждой строки. Эти строки будут выводиться "лесенкой" на стандартном принтере:

[.programlisting]
....
A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind
....

Фильтр может преобразовывать символы новой строки в возврат каретки и новую строку. Возврат каретки заставляет принтер возвращаться к левому краю после каждой строки. Создайте файл [.filename]#/usr/local/libexec/lf2crlf# со следующим содержимым:

[.programlisting]
....
#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"
....

Установите разрешения и сделайте файл исполняемым:

[source, shell]
....
# chmod 555 /usr/local/libexec/lf2crlf
....

Измените [.filename]#/etc/printcap#, чтобы использовать новый фильтр:

[.programlisting]
....
:if=/usr/local/libexec/lf2crlf:\
....

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

[[printing-lpd-filters-enscript]]
==== Красивое оформление текста на PostScript(R) принтерах с помощью package:print/enscript[]

GNUEnscript преобразует обычные текстовые файлы в аккуратно отформатированный PostScript(R) для печати на принтерах PostScript(R). Он добавляет номера страниц, переносит длинные строки и предоставляет множество других функций, чтобы сделать печать текстовых файлов более удобочитаемой. В зависимости от местного размера бумаги установите один из пакетов: package:print/enscript-letter[] или package:print/enscript-a4[] из коллекции портов.

Создайте файл [.filename]#/usr/local/libexec/enscript# со следующим содержимым:

[.programlisting]
....
#!/bin/sh
/usr/local/bin/enscript -o -
....

Установите разрешения и сделайте файл исполняемым:

[source, shell]
....
# chmod 555 /usr/local/libexec/enscript
....

Измените [.filename]#/etc/printcap#, чтобы использовать новый фильтр:

[.programlisting]
....
:if=/usr/local/libexec/enscript:\
....

Проверьте фильтр, напечатав простой текстовый файл.

[[printing-lpd-filters-ps2pcl]]
==== Печать PostScript(R) на принтеры `PCL`

Многие программы создают документы в формате PostScript(R). Однако недорогие принтеры часто поддерживают только простой текст или `PCL`. Этот фильтр преобразует файлы PostScript(R) в `PCL` перед отправкой на принтер.

Установите интерпретатор PostScript(R) Ghostscript, package:print/ghostscript9-base[], из коллекции портов.

Создайте файл [.filename]#/usr/local/libexec/ps2pcl# со следующим содержимым:

[.programlisting]
....
#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
....

Установите разрешения и сделайте файл исполняемым:

[source, shell]
....
# chmod 555 /usr/local/libexec/ps2pcl
....

Поступающие на вход этого скрипта данные в формате PostScript(R) будут обработаны, преобразованы в `PCL` и отправлены на принтер.

Измените файл [.filename]#/etc/printcap#, чтобы использовать новый входной фильтр:

[.programlisting]
....
:if=/usr/local/libexec/ps2pcl:\
....

Протестируйте фильтр, отправив в него небольшую программу PostScript(R):

[source, shell]
....
% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
....

[[printing-lpd-filters-smart]]
==== Умные фильтры

Фильтр, который определяет тип входных данных и автоматически преобразует их в правильный формат для принтера, может быть очень удобным. Первые два символа файла PostScript(R) обычно `%!`. Фильтр может обнаружить эти два символа. Файлы PostScript(R) можно передавать на PostScript(R) принтер без изменений. Текстовые файлы можно преобразовать в PostScript(R) с помощью Enscript, как показано ранее. Создайте файл [.filename]#/usr/local/libexec/psif# с таким содержимым:

[.programlisting]
....
#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript job, print it.
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # otherwise, format with enscript
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac
....

Установите разрешения и сделайте файл исполняемым:

[source, shell]
....
# chmod 555 /usr/local/libexec/psif
....

Измените файл [.filename]#/etc/printcap#, чтобы использовать новый входной фильтр:

[.programlisting]
....
:if=/usr/local/libexec/psif:\
....

Протестируйте фильтр, распечатав файлы в формате PostScript(R) и обычные текстовые файлы.

[[printing-lpd-queues]]
=== Множественные очереди

Записи в [.filename]#/etc/printcap# фактически являются определениями _очередей_. Для одного принтера может быть несколько очередей. В сочетании с фильтрами множественные очереди предоставляют пользователям больше контроля над печатью их заданий.

В качестве примера рассмотрим сетевой PostScript(R) лазерный принтер в офисе. Большинство пользователей хотят печатать простой текст, но несколько продвинутых пользователей хотят иметь возможность печатать PostScript(R) файлы напрямую. Для одного и того же принтера можно создать две записи в [.filename]#/etc/printcap#:

[.programlisting]
....
textprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/textprinter:\
	:if=/usr/local/libexec/enscript:\
	:lf=/var/log/lpd-errs:

psprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/psprinter:\
	:lf=/var/log/lpd-errs:
....

Документы, отправленные на `textprinter`, будут отформатированы фильтром [.filename]#/usr/local/libexec/enscript#, показанным в предыдущем примере. Опытные пользователи могут печатать PostScript(R) файлы на `psprinter`, где фильтрация не выполняется.

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

[[printing-lpd-monitor]]
=== Мониторинг и управление печатью

Доступно несколько утилит для мониторинга заданий печати, проверки и управления работой принтера.

[[printing-lpd-monitor-lpq]]
==== man:lpq[1]

man:lpq[1] отображает состояние заданий печати пользователя. Задания печати других пользователей не показываются.

Показать ожидающие задания текущего пользователя на одном принтере:

[source, shell]
....
% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes
....

Показать ожидающие задания текущего пользователя на всех принтерах:

[source, shell]
....
% lpq -a
lp:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     1    (standard input)                      27320 bytes

laser:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     287  (standard input)                      22443 bytes
....

[[printing-lpd-monitor-lprm]]
==== man:lprm[1]

man:lprm[1] используется для удаления заданий печати. Обычные пользователи могут удалять только свои собственные задания. `root` может удалять любые или все задания.

Удалить все ожидающие задания из принтера:

[source, shell]
....
# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued
....

Удалить отдельное задание из принтера. Для определения номера задания используется man:lpq[1].

[source, shell]
....
% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes

% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued
....

[[printing-lpd-monitor-lpc]]
==== man:lpc[8]

man:lpc[8] используется для проверки и изменения состояния принтеров. После `lpc` указывается команда и, при необходимости, имя принтера. Вместо имени конкретного принтера можно использовать `all`, и тогда команда будет применена ко всем принтерам. Обычные пользователи могут просматривать статус с помощью man:lpc[8]. Только пользователь `root` может использовать команды, изменяющие состояние принтеров.

Показать состояние всех принтеров:

[source, shell]
....
% 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
....

Запретить принтеру принимать новые задания, затем снова разрешить прием новых заданий:

[source, shell]
....
# lpc disable lp
lp:
	queuing disabled
# lpc enable lp
lp:
	queuing enabled
....

Приостановить печать, но продолжать принимать новые задания. Затем возобновить печать:

[source, shell]
....
# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started
....

Перезапустить принтер после возникновения ошибки:

[source, shell]
....
# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted
....

Отключите очередь печати и запретите печать, добавив сообщение для пользователей с объяснением проблемы:

[source, shell]
....
# lpc down lp Repair parts will arrive on Monday
lp:
	printer and queuing disabled
	status message is now: Repair parts will arrive on Monday
....

Включить принтер, который выключен:

[source, shell]
....
# lpc up lp
lp:
	printing enabled
	daemon started
....

См. man:lpc[8] для получения дополнительных команд и параметров.

[[printing-lpd-shared]]
=== Общие принтеры

Принтеры часто используются совместно несколькими пользователями в офисах и учебных заведениях. Для удобства совместного использования предусмотрены дополнительные функции.

[[printing-shared-aliases]]
==== Aliases

Имя принтера задается в первой строке записи в [.filename]#/etc/printcap#. Дополнительные имена или _псевдонимы_ могут быть добавлены после этого имени. Псевдонимы отделяются от имени и друг от друга вертикальными чертами:

[.programlisting]
....
lp|repairsprinter|salesprinter:\
....

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

[source, shell]
....
% lpr -Psalesprinter sales-report.txt
....

Пользователи отдела ремонта печатают на _своём_ принтере с помощью

[source, shell]
....
% lpr -Prepairsprinter repairs-report.txt
....

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

[[printing-shared-headers]]
==== Страницы заголовков

Пользователям может быть сложно найти свои документы в стопке страниц, напечатанных на занятом общем принтере. Для решения этой проблемы были созданы _титульные страницы_. Перед каждой задачей печати выводится титульная страница с именем пользователя и названием документа. Эти страницы также иногда называют _баннерами_ или _разделителями_.

Включение титульных страниц различается в зависимости от того, подключен ли принтер напрямую к компьютеру с помощью кабеля `USB`, кабеля параллельного или последовательного порта или удаленно через сеть.

Заголовочные страницы на непосредственно подключенных принтерах включаются путем удаления строки `:sh:\` (Suppress Header) из записи в файле [.filename]#/etc/printcap#. Эти заголовочные страницы используют только символы перевода строки для новых строк. Некоторым принтерам может потребоваться фильтр [.filename]#/usr/share/examples/printing/hpif#, чтобы предотвратить ступенчатый текст. Фильтр настраивает принтеры `PCL` на печать как возврата каретки, так и перевода строки при получении символа перевода строки.

Заглавные страницы для сетевых принтеров должны быть настроены на самом принтере. Записи заглавных страниц в [.filename]#/etc/printcap# игнорируются. Настройки обычно доступны через панель управления принтера или веб-интерфейс конфигурации, который можно открыть в браузере.

[[printing-lpd-references]]
=== Список литературы

Примеры файлов: [.filename]#/usr/share/examples/printing/#.

_Руководство по системе печати 4.3BSD_, [.filename]#/usr/share/doc/smm/07.lpd/paper.ascii.gz#.

Страницы Справочника: man:printcap[5], man:lpd[8], man:lpr[1], man:lpc[8], man:lprm[1], man:lpq[1].

[[printing-other]]
== Другие системы печати

Несколько других систем печати доступны в дополнение к встроенной man:lpd[8]. Эти системы обеспечивают поддержку других протоколов или дополнительные возможности.

[[printing-other-cups]]
=== CUPS (Common UNIX(R) Printing System)

CUPS — это популярная система печати, доступная во многих операционных системах. Использование CUPS в FreeBSD описано в отдельной статье: extref:{cups}[CUPS]

[[printing-other-hplip]]
=== HPLIP

Компания 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[].

[[printing-other-lprng]]
=== LPRng

LPRng был разработан как улучшенная альтернатива man:lpd[8]. Порт находится в package:sysutils/LPRng[]. Подробности и документацию можно найти на https://lprng.sourceforge.net/[].
