Печать в Linux HOWTO (Linux Printing HOWTO)

Grant Taylor <[email protected]>, перевод Alex Ott [email protected]

версия 4.5, февраль 2000


Это Linux Printing HOWTO, набор информации о том как создавать, просматривать, печатать и отсылать по факсу все что угодно из под Linux (и в большинстве других Юниксов).

Примечание переводчика: Шлите мне любые комментарии и замечания, даже небольшие.

1. Введение

Printing HOWTO должно содержать все, что вам необходимо знать, чтобы помочь вам настроить сервисы печати на вашей Linux-системе. Как и жизнь, это немного сложнее чем мир "укажи и нажми" (the point-and-click) систем Microsoft и Apple, но это также является более гибкой вещью и определенно более легкой для администрирования в больших сетях (LANs).

Этот документ организован так, что большинству людей будет необходимо прочитать только первую его половину. Большинство малоизвестной и ситуационо-зависимой информации расположено во второй половине документа и может быть легко найдено по содержанию, в то время как большинство информации в разделах 8 и 9 вероятно необходимо большому количеству людей.

Начиная с версии 3.x документ полностью переписан и много информации из предыдущих версий утеряно. Это сделано с умыслом, так как предыдущие версии были настолько велики, что занимали 60 печатных страниц. Если вы не нашли здесь нужных ответов, вы можете: a) посмотреть предыдущую версию документа по адресу Домашняя страница Printing HOWTO b) послать мне замечание сообщающее о том, чему следовало здесь быть, но чего нет.

Домашняя страница Printing HOWTO хорошее место, где можно найти последние версии документа; он также распространяется с MetaLab (metalab.unc.edu) и локальных зеркал LDP.

1.1 История

Это четвертое поколение Printing HOWTO (PHT). Хронологически история PHT может быть поделена следующим образом:

  1. Я написал этот документ в 1992 в ответ на большое число вопросов о печати в группе новостей comp.os.linux, и разослал его. Это на несколько месяцев предшествовало проекту HOWTO и таким образом это был первый FAQ названный `howto'. Эта редакция была в формате plain ascii.
  2. После присоединения к проекту HOWTO, Printing-HOWTO был соединен с Lpd FAQ Brian McCauley <[email protected]>; мы продолжали быть соавторами PHT примерно два года. В тоже время мы включили работу Karl Auer <[email protected]>. Эта редакция PHT была в формате TeXinfo, и доступна в форматах PS, HTML, Ascii, и Info.
  3. После примерно годового загнивания и распада PHT, и неудачных попыток делать что-нибудь кроме сопровождения документа, он был полностью переписан. Эта редакция PHT сделана в формате SGML, используя LinuxDoc DTD и пакет SGML-tools-1. Начиная с версии 3.27, в документ включена база данных поддерживаемых принтеров; до версии 3.27 в этом документе не было списка совместимости принтеров (!).
  4. В середине января 200 года я узнал о программе для буферизации печати PDQ. PDQ обеспечивает настолько лучший механизм печати, чем lpd, что я измученный несколькими часами экспериментов с ним переписал части этого документа и сменил номер его версии на 4.

1.2 Авторские права

Авторскими правами на этот документ владеет Grant Taylor (c) 1992-1999. Свободно копируйте и распространяйте этот документ согласно терминам GNU General Public License, версии 2 или более поздней.

2. Как печатать

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

2.1 С помощью PDQ

Большинство систем в настоящее время продаются с lpd, так что данный раздел не будет к ним применяться. Я рекомендую людям для большинства случаев установить и использовать PDQ вместо (или в добавление к) lpd. PDQ просто имеет лучшую поддержку принтеров и тому подобное.

При использовании PDQ, вместо команды lpr, вы будете использовать команду pdq или xpdq. Обе они подобны традиционной команде lpr в том, что они будут печатать либо указанные файлы, либо данные со стандартного ввода, если файл не указан.

Xpdq

Xpdq это приложение для X Windows, которое показывает список доступных принтеров и сводные данные об очереди печати (включая текущие и старые задания). Существуют два пункта в меню File, один для печати указанного файла, второй для печати данных со стандартного ввода. Вы можете установить настройки вашего драйвера принтера используя диалог Driver Options; обычно можно установить параметры двунаправленного соединения, плотность печати, размер и тип бумаги, и т.п.

Pdq

Командно-строковая версия программа для системы PDQ называется просто pdq. Она может использоваться вместо команды lpr в большинстве случаев; она понимает аргумент -P для указания принтера. Подобно lpr, она печатает либо перечисленные файлы, либо данные со стандартного ввода.

Настройки принтера могут контролироваться ключами -o и -a.

2.2 Используя LPD и команду lpr

Если вы уже настроили lpd для печати на вашем принтере, или ваш системный администратор уже сделал это, или ваш поставщик сделал это для вас, то все что вам необходимо -- это научиться как использовать команду lpr. Printing Usage HOWTO делает обзор этого и вы должны знать еще несколько других команд манипуляции очередью печати. Или просто прочитайте справочную страницу lpr(1).

Однако если у вас новая машина или новый принтер, вам необходимо будет настроить сервисы печати одним или другим способом до того как вы сможете печатать. Читайте!

3. Устройства печати в ядре Linux

Существует два полностью отличающихся драйвера устройства для параллельного порта; что вы используете, зависит от версии ядра (которую вы можете узнать с помощью команды uname -a). Драйвер изменен в Linux версии 2.1.33.

Несколько деталей одинаковы для обоих типов драйвера. Скорее всего, много людей обнаружат, что Linux не обнаруживает параллельного порта, до тех пор пока они не запретят "Plug and Play" в их PC BIOS. (это не является сюрпризом; отслеживание данных о PnP не-PCI устройствах в Windows и где-нибудь еще могут быть чем-то вроде бедствия).

3.1 Устройство lp (ядра <=2.1.32)

Ядро Linux (<=2.1.32), предполагает, что вы вкомпилировали в ядро или загрузили модуль устройства lp (вывод команды cat /proc/devices должен включать устройство lp, если оно загружено), обеспечивая одно или больше устройств: /dev/lp0, /dev/lp1, и /dev/lp2. Они не присваиваются динамически, каждое соответствует специфическому адресу ввода/вывода вашего оборудования. Это означает, что ваш первый принтер может быть lp0 или lp1 в зависимости от вашего оборудования. Просто попробуйте оба.

Некоторые пользователи сообщили, что их двунаправленные lp порты не определяются, если они использовали старые однонаправленные кабеля. Проверьте, что вы используете нужный кабель.

Некоторые люди не могут запустить драйвера plip и lp в одно и тоже время на любом заданном порту (в любом случае под 2.0). Однако вы можете загрузить тот или иной драйвер вручную или с помощью kerneld для версий 2.x (и позже 1.3.x) в заданное время. При правильной установке прерываний и подобных вещей, вы по идее можете запустить plip на одном порту, а lp на другом. Некоторые люди делали это редактированием исходного текста драйверов; я с нетерпением ожидаю сообщение о том, что кто-то сделал это только с помощью правильной командной строки.

Существует маленькая утилита, названная tunelp, предназначенная для того, чтобы вы, как администратор, могли настроить для устройств lp Linux 2.0 используемые прерывания, скорость опроса и прочие опции.

Если драйвер встроен в ядро, то ядро может воспринимать опцию lp= для установки прерываний и адресов ввода/вывода:

Когда драйвер lp встроен в ядро, вы можете использовать командную
строку LILO/LOADLIN для установки адресов портов и прерываний,
которые будет использовать драйвер.

Синтаксис:      lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

Например:   lp=0x378,0   or   lp=0x278,5,0x378,7 **

Заметим, что если вы используете это свойство, вы должны указать
*все* порты, которые вы хотите учитывать, значений по умолчанию не
существует. Вы можете запретить встроенные драйвер с помощью опции
lp=0.

Когда драйвер загружен как модуль, то возможно указать адреса ввода/вывода и прерывания в командной строке программы insmod (или в файле /etc/conf.modules, при использовании kerneld) используя обычный синтаксис. Параметры следующие: io=port0,port1,port2 и irq=irq0,irq1,irq2. Прочитайте справочную страницу для команды insmod для более детальной информации об этом.

**Для тех из вас, кто (подобно мне) никогда не может найти номера стандартных портов когда это нужно, я привел два примера выше. Номер другого порта (для lp0) равен 0x3bc. У меня нет никаких идей о том какое прерывание обычно используется.

Исходный код для драйвера параллельного порта Linux 2.0 находится в файле /usr/src/linux/drivers/char/lp.c.

3.2 Устройство parport (ядра >= 2.1.33)

Начиная с ядра 2.1.33 (и доступно как заплатка к ядру 2.0.30), устройство lp является просто клиентом нового устройства parport. Добавление устройства parport исправляет некоторое количество проблем, которые были из-за старого устройства lp - оно может разделять порты с другими устройствами, оно динамически присваивает доступные параллельные порты номерам устройств, вместо использования фиксированных соотношений между адресами ввода/вывода и номером порта, и так далее.

Введение устройства parport позволило создать целую группу новых драйверов параллельного порта для устройств подобных дискам Zip, Backpack CD-ROM и дискам, и так далее. Некоторые из них доступны в ядрах версии 2.0; посмотрите в интернете.

Главное отличие, которое вы отметите, в том, что ядра, основанные на parport динамически присваивают устройства lp для параллельных портов. Так что, то что было lp1 в Linux 2.0 может оказаться lp0 в Linux 2.2. Убедитесь, что вы проверили это если вы делаете обновление с ядра, работающего с драйвером lp на ядро с драйвером parport.

Кажется, что основные проблемы с этим устройством проистекают от неправильной его настройки:

Дистрибутив

Некоторые дистрибутивы Linux продаются с неправильно настроенными /etc/modules.conf (или /etc/conf.modules), так что драйвер не загружается когда вам это нужно. При использовании недавних версий modutils, правильные строки в modules.conf должны выглядеть так:

  alias /dev/printers lp             # only for devfs?
  alias /dev/lp*      lp             # only for devfs?
  alias parport_lowlevel parport_pc  # missing in Red Hat 6.0-6.1

BIOS

Много BIOS для персональных компьютеров представляют параллельный порт как устройство Plug-and-Play. Это только добавляет ненужную сложность к великолепному простому устройству, которое почти всегда присутствует; отключите PnP настройки для вашего параллельного порта (который называется "LPT1" во многих BIOSах) в том случае если ваш параллельный порт не определяется драйвером Linux. Правильные настройки часто называются "legacy", "ISA", или "0x378", но скорее всего не "disabled".

Вы также можете прочитать файл Documentation/parport.txt в исходных текстах ядра, или посмотреть на сервере parport.

3.3 Последовательные устройства

Последовательные устройства под Linux называются подобно /dev/ttyS1. Утилита stty позволит вам интерактивно просмотреть или установить параметры последовательного порта setserial позволит вам контролировать некоторые расширенные атрибуты и настроить IRQ и адреса ввода/вывода для нестандартных портов. Дополнительные обсуждения последовательных портов в Linux вы можете найти в Serial-HOWTO.

При использовании медленных последовательных принтеров с контролем потока, вы можете обнаружить, что некоторые из ваших заданий оборваны. Это может быть из-за последовательного порта, чье действие по умолчанию -- удалить любые не переданные символы из своего буфера через 30 секунд после того как устройство закрыто. Буфер может содержать до 4096 символов, и если ваш принтер использует контроль потока и медлен настолько, что не может принять все данные из буфера за 30 секунд после того как программа печати закрыла последовательный порт, то конец содержимого буфера будет потерян. Если команда cat file > /dev/ttyS2 делает полный печатный вывод для коротких файлов, но обрезает длинные файлы, то у вас может быть такая проблема.

30-ти секундный интервал может быть выровнен с помощью опции "closing_wait" командной строки программы setserial (версии 2.12 и поздних). Последовательные порты машины обычно инициализируются вызовом setserial в загрузочном файле rc.serial. Вызов для последовательного порта принтера может быть модифицирован для установки параметра closing_wait вместе с установкой других параметров.

4. Поддерживаемые принтера

Ядро Linux в основном поддерживает любой принтер, который вы можете подключить к последовательному или параллельному порту, но существуют такие принтера, которые вы не можете использовать, даже если они могут быть подключены к машине и общаться (на электрическом уровне) с Linux. Основными среди этих несовместимых принтеров являются принтера, на которые ссылаются как на принтера "Windows" или "GDI". Они так называются, потому-что часть или есть язык управления принтером и детали проектирования механизма печати не документированы. Обычно производитель предоставляет драйвер для Windows и спокойно продает принтера только для пользователей Windows; Это почему они называются Winprinters. В некоторых случаях производитель также предоставляет драйвера для NT, OS/2, или других операционных систем.

Многие из этих принтеров не работают с Linux. Некоторые из них работают, и некоторые из них работают чуть-чуть (обычно потому-что кто-то сделал исследование деталей, необходимых для написания драйвера). Смотрите список поддерживаемых принтеров, приведенный ниже, для подробностей о нужном принтере.

Некоторые принтера находятся в промежутке между крайностями. Некоторые модели NEC, например, реализуют простую форму стандартного языка принтера PCL, что позволяет работающему с PCL программному обеспечению печатать на них до разрешения 300dpi, но только NEC знает как получить разрешение 600dpi на этих принтерах.

Заметим, что если вы уже имеете один из таких Winprinters, то существует окольный путь, чтобы заставить печать Linux на них, но он достаточно неудобный и я никогда не пробовал применять сам. Смотрите раздел 12 этого документа, для более детального обсуждения принтеров, работающих только с Windows.

4.1 Postscript

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

Программное обеспечение для Unix, и индустрия печати в общем, стандартизировали Postscript как язык управления принтером. Это случилось по нескольким причинам:

Синхронизация (Timing)

Postscript возник как часть Apple Laserwriter, великолепного компаньона для компьютеров Macintosh и принтера наилучшим способом отвечающим революции настольных издательских систем в 80-х годах.

Он независим от устройства

Программы на Postscript могут быть запущены для создания вывода на растровые и векторные дисплеи, на на fax-машины, или почти на любой тип принтеров без необходимости изменения исходной программы. Изображение в Postscript будет одним и тем же на любом устройстве postscript, по крайней мере в пределах обеспечиваемых свойствами принтера. До создания формата PDF, люди обменивались сложными документами в виде файлов Postscript. Единственная причина того, что стандарт не прижился, заключается в том, что машины с Windows обычно не включали средства просмотра Postscript, так что Adobe специфицировала гиперсвязи и сжатие для формата Postscript, назвала резальтат PDF, и распространяет средства просмотра для этого формата, и создала рынок для своих утилит "distiller". (функциональность которых также обеспечиваются программами ps2pdf и pdf2ps из пакета ghostscript).

Это настоящий язык программирования

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

Он является открытым

Postscript полностью специфицирован в общедоступной серии книг (которые вы можете найти в любом хорошем книжном магазине). Хотя Adobe изобрела его и обеспечивает доминирующую коммерческую реализацию этого языка, другие производители, такие как Aladdin также производят независимую реализацию Postscript.

4.2 Non-Postscript

При недостатке бюджета, необходимого чтобы купить PostScript принтер, вы можете использовать любой принтер поддерживаемый программой Ghostscript, свободным интерпретатором PostScript используемый вместо настоящей поддержки PostScript принтером. Заметим, что большинство дистрибутивов Linux могут продаваться с устаревшей версией Ghostscript из-за применяемой лицензии. К счастью обычно существуют пакеты с новыми версиями Ghostscript в разделе contrib каждого дистрибутива. Пожалуйста помогите улучшить страницу поддержки принтеров Ghostscript, посылая сообщения о ваших успехах и неудачах.

В настоящее время Adobe имеет новый язык для принтеров называемый "PrintGear". Я думаю, что это сильно упрощает язык в двоичном формате с некоторыми свойствами PostScript, но без совместимости с PostScript. И я не слышал, что Ghostscript поддерживает его. Но некоторые принтера с PrintGear могут поддерживать другие языки, подобные PCL, и эти принтера будут работать с Linux.(если в принтере реализован PCL, а не в драйвере Windows).

4.3 Какие принтера работают?

Если вы хотите купить принтер, то вы можете посмотреть в нескольких местах информацию о том, будет ли он работать. Назначение базы данных принтеров Printing HOWTO --- быть полным списком состояния поддержки принтера в Linux. Краткое содержимое этой базы приведено ниже; убедитесь, что вы проверили интерактивную версию базы данных для дополнительной информации о принтере и информации о том, какой драйвер необходимо использовать.

Страница совместимости с принтерами Ghostscript содержит список некоторых работающих принтеров, так же как и ссылки на другие страницы.

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

Список совместимых принтеров

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

Заметьте, что это список не является евангелием; люди иногда добавляют неправильную информацию, которую я в конце концов удалю. Записи, которые я не проверил отмечены знаком звездочки (*). До покупки принтера проверьте через Dejanews, что принтер работает у некоторых людей. Если вы не смогли найти информацию на Dejanews, то напишите мне, и я свяжу вас человеком, который добавил информацию о принтере.

Принтера разделены на три типа:

Отлично

Отличные принтера и работают отлично -- вы можете использовать все возможности принтера, включая цвет, полное разрешение и т.п. В некоторых случаях принтера с недокументированными "увеличениями разрешения", которые не работают, все равно перечислены как отличные; в основном различие в качестве печати достаточно слабое, так что вы можете не беспокоится об этом.

Хорошо (небольшие ограничения)

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

Частично

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

Балласт

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

В любом случае, поскольку эта информация предоставлена массой людей, никто не гарантирует, что она правильная; в частности такими полагаются записи со знаком звездочки (*). Однако, информация может быть легко подтверждена поиском информации на страницах о драйверах принтера и серверах производителя.

И без лишней суеты, вот список совместимости принтеров:

Alps

Частично

MD-1000, MD-1300, MD-2000, MD-4000, MD-5000.

Apple

Великолепно

Dot Matrix, ImageWriter*, ImageWriter LQ, LaserWriter 16/600, LaserWriter IINTX*, LaserWriter Select 360.

В большинстве случаев

12/640ps, LaserWriter NT, StyleWriter 2500.

Avery

Великолепно

Personal Label Printer+.

В большинстве случаев

Personal Label Printer.

Brother

Великолепно

HL-1070, HL-10V, HL-10h, HL-1260, HL-2060, HL-4Ve, HL-630*, HL-720*, HL-720*, HL-730, HL-760, HL-8*, HL-820.

В большинстве случаев

HJ-400, HL-1040, HL-1050, HL-1060, HL-1240*, HL-1250, MFC 6550MC, MFC4350*.

Частично

MC-3000, MFC 7150C, MFC8300*.

Балласт

HL-1030, MP-21C.

C.Itoh

Великолепно

M8510.

CalComp

Балласт

Artisan 1023 penplotter*.

Canon

Великолепно

BJ-10e, BJ-20, BJ-200, BJ-330, BJ-5, BJC-210, BJC-250, BJC-4000, BJC-4100, BJC-4200, BJC-4300, BJC-4400, BJC-600, BJC-610, BJC-620*, BJC-70, BJC-800, GP335/405*, LBP-1260*, LBP-1760, LBP-4+*, LBP-4U*, LBP-8A1*, LIPS III*, LIPS-III*, bjc5000*.

В большинстве случаев

BJ-300*, BJC-1000, BJC-2000, BJC-210SP*, BJC-240, BJC-4310SP*, BJC-7004*, BJC-80, LBP-4sx*.

Частично

BJC-4550*, BJC-6000, BJC-7000*, BJC-7100*, MultiPASS C2500*, MultiPASS C3500*, MultiPASS C5000*, Multipass C3000*, Multipass C5500*.

Балласт

BJC-5000, BJC-5100, LBP-430, LBP-460*, LBP-660*, Multipass L6000*.

Citizen

Великолепно

ProJet II*, ProJet IIc*.

Частично

printiva600C*.

DEC

Великолепно

DECWriter 500i*, DECwriter 110i*, DECwriter 520ic*, LA50*, LA75*, LA75 Plus*, LN03*, LN07*.

В большинстве случаев

LJ250*, LN17.

Частично

1800*.

Dymo-CoStar

Великолепно

ASCII 250*, ASCII+*, EL40*, EL60*, LabelWriter II*, LabelWriter XL*, LabelWriter XL+*, SE250*, SE250+*, Turbo*.

Epson

Великолепно

9 Pin Printers high-res*, 9 Pin Printers med-res*, AP3250*, ActionLaser 1100*, LP 8000*, LQ 850*, LQ-24*, LQ-2550*, LQ-500*, LQ-570+*, LX-1050*, SQ 1170*, Stylus Color*, Stylus Color 1520, Stylus Color 400*, Stylus Color 440, Stylus Color 460*, Stylus Color 500*, Stylus Color 600*, Stylus Color 640*, Stylus Color 800*, Stylus Color 850*, Stylus Color I*, Stylus Color II*, Stylus Color IIs*, Stylus Color PRO*, Stylus Pro XL*.

В большинстве случаев

EPL 5700*, Stylus 300*, Stylus Color 3000*, Stylus Color 660, Stylus Color 740*.

Частично

Stylus Color 300*, Stylus Color 900*, Stylus Photo 700*, Stylus Photo 750*, Stylus Photo EX*.

Fujitsu

Великолепно

1200*, 2400*, 3400*, PrintPartner 10V*, PrintPartner 16DV*, PrintPartner 20W*, PrintPartner 8000*.

HP

Великолепно

2000C*, 2500C, Color LaserJet 4500, DeskJet 1200C, DeskJet 1200C/PS, DeskJet 1600C, DeskJet 1600Cm, DeskJet 400, DeskJet 420C, DeskJet 500, DeskJet 500C*, DeskJet 510*, DeskJet 520*, DeskJet 540*, DeskJet 550C*, DeskJet 560C*, DeskJet 600*, DeskJet 610C*, DeskJet 610CL*, DeskJet 612C*, DeskJet 660C*, DeskJet 670C*, DeskJet 672C*, DeskJet 682C*, DeskJet 690C*, DeskJet 692C*, DeskJet 694C*, DeskJet 697C*, DeskJet 812C*, DeskJet 850C, DeskJet 855C*, DeskJet 890C, HP LaserJet 2P Plus*, LaserJet*, LaserJet 1100*, LaserJet 1100A*, LaserJet 2 w/PS*, LaserJet 2100M*, LaserJet 2D*, LaserJet 2P*, LaserJet 3*, LaserJet 3D*, LaserJet 3P w/PS*, LaserJet 4 Plus*, LaserJet 4050N*, LaserJet 4L*, LaserJet 4M*, LaserJet 4ML*, LaserJet 4P*, LaserJet 5*, LaserJet 5000*, LaserJet 5L*, LaserJet 5M*, LaserJet 5MP*, LaserJet 5P*, LaserJet 6*, LaserJet 6MP*, LaserJet 8000*, LaserJet 8100*, LaserJet Plus*, Mopier 320*, PaintJet*, PaintJet XL*, PaintJet XL300*.

В большинстве случаев

DesignJet 650C*, Designjet 750 C Plus*, DeskJet 1100C*, DeskJet 1120C*, DeskJet 310, DeskJet 810C, DeskJet 832C*, DeskJet 870C*, DeskJet 880C*, DeskJet 882C, DeskJet 895C*, DeskJet 895Cxi*, DeskJet 970C*, DeskJet 970Cse, LaserJet 2*, LaserJet 2100*, LaserJet 6P*, OfficeJet Pro 1170Cse*.

Частично

Color LaserJet 5000, DeskJet 1000C*, DeskJet 710C*, DeskJet 712C*, DeskJet 720C*, DeskJet 722C*, DeskJet 820C*, LaserJet 6L*, OfficeJet 500*, OfficeJet 600*, OfficeJet 625*, OfficeJet Pro 1175C*, PhotoSmart P1100*.

Балласт

LaserJet 3100*.

IBM

Великолепно

3853 JetPrinter*, 4019*, 4029 10P*, 4303 Network Color Printer*, Page Printer 3112*, ProPrinterII*.

Imagen

Великолепно

ImPress*.

Kyocera

Великолепно

F-3300*, FS-1700+*, FS-3750*, FS-600*, FS-800*, P-2000*.

В большинстве случаев

FS-3500*.

Lexmark

Великолепно

4039 10plus*, Optra Color 1200*, Optra Color 1275*, Optra Color 40, Optra Color 45, Optra E*, Optra E+*, Optra E310*, Optra Ep*, Optra K 1220*, Optra R+*, Optra S 1250*, Optra S 1855*, Valuewriter 300*.

В большинстве случаев

1000, 1100*, 2070*, 3000*, 5000*, 5700, 7000*, 7200*.

Частично

1020 Business*, 2030*, Winwriter 400*, Z51*.

Балласт

1020*, 2050*, 3200*, Winwriter 100*, Winwriter 150c*, Winwriter 200*, Z11*.

Minolta

Великолепно

PagePro 6*, PagePro 6e*, PagePro 6ex*, PagePro 8*.

Частично

PagePro 8L*.

Mitsubishi

Великолепно

CP50 Color Printer*.

NEC

Великолепно

P2X*, PinWriter P6*, PinWriter P6 plus*, PinWriter P60*, PinWriter P7*, PinWriter P7 plus*, PinWriter P70*, SilentWriter LC 890*, Silentwriter2 S60P*, Silentwriter2 model 290*, SuperScript 660i*.

В большинстве случаев

Silentwriter 95f*.

Частично

SuperScript 100C*, SuperScript 1260*, SuperScript 150C*, SuperScript 650C*, SuperScript 750C*, SuperScript 860*, SuperScript 870.

Балласт

SuperScript 610plus*, SuperScript 660*, SuperScript 660plus*.

Oce

Великолепно

3165*.

Okidata

Великолепно

OL 410e, OL 600e, OL 610e/PS, OL 800, OL 810e/PS, OL400ex, OL810ex, OL830Plus, Okipage 10e, Okipage 12i, Okipage 20DXn, Okipage 6e, Okipage 6ex, Okipage 8c, Okipage 8p.

В большинстве случаев

Microline 182, OL 400w, OL 610e/S, OkiPage 4w+*, Okipage 4w, Super 6e.

Частично

Microline 192+, Okipage 6w.

Балласт

Okijet 2010, Okijet 2500, Okipage 8w*.

Olivetti

Великолепно

JP350S*, JP450*, PG 306*.

PCPI

Великолепно

1030*.

Panasonic

Великолепно

KX-P1123*, KX-P1124*, KX-P1150*, KX-P1180i*, KX-P2023*, KX-P2135*, KX-P2150*, KX-P4410, KX-P4450*, KX-P5400*, KX-P8420*, KX-P8475*, kx-p1624*.

В большинстве случаев

KX-P2123*, KX-P6150*.

Частично

KX-P6500*.

Балласт

KX-P6100*, KX-P6300 GDI*, KX-P8410*.

Printrex

Частично

820 DL*.

QMS

Великолепно

2425 Turbo EX*, magicolour 2*.

В большинстве случаев

ps-810*.

Ricoh

Великолепно

4081*, 4801*, 6000*, Aficio AP2000*.

В большинстве случаев

Aficio 401*.

Балласт

Aficio Color 2206*, Afico FX10*.

Samsung

Великолепно

ML-5000a*, ML-6000/6100*, ML-7000/7000P/7000N*, ML-7050*, ML-85*, QL-5100A*.

В большинстве случаев

ML-5050G*.

Балласт

ML-85G*, SF/MSYS/MJ-4700/4800/4500C*.

Seiko

Великолепно

SpeedJET 200*.

В большинстве случаев

SLP*, SLP 120*, SLP 220*, SLP EZ30*, SLP Plus*, SLP Pro*.

Sharp

Великолепно

AR-161*.

Star

Великолепно

LC24-100*, NL-10*.

В большинстве случаев

LC 90*, LC24-200*, StarJet 48*.

Балласт

WinType 4000*.

Tally

Великолепно

MT908*.

Tektronix

Великолепно

3693d color printer, 8-bit mode*, 4693d color printer, 2-bit mode*, 4693d color printer, 4-bit mode*, 4695*, 4696*, 4697*, Phaser 780*, Phaser IISX*, Phaser PX*.

Xerox

Великолепно

2700 XES, 3700 XES, 4045 XES, DocuPrint 4508, DocuPrint C55, DocuPrint N17, DocuPrint N32.

В большинстве случаев

DocuPrint P12, DocuPrint P8e, XJ6C*.

Частично

Document Homecentre, WorkCentre 450cp*, XJ8C*.

Балласт

DocuPrint P8, WorkCentre 470cx*, WorkCentre XD120f*, WorkCentre XE80.

* Эти модели не были проверены мной.

4.4 Как покупать принтер

В наши дни немного трудно выбрать принтер; производится много моделей, среди которых необходимо сделать выбор. Вот небольшой список советов по выбору:

Стоимость

Вы получите то, за что вы заплатили. Большинство принтеров в пределах $200-300 будут печатать достаточно хорошо, но стоимость печатной страницы будет выше. Для некоторых принтеров поставляют только один или два картриджа к стоимости нового принтера! Аналогично дешевые принтера не будут сохраняться очень долго. По меньшей мере дорогие принтера имеют значение MTBF (Cреднее время наработки на отказ) равное примерно трем месяцам.

Струйные принтера

Головки для струйных принтеров со временем станут непоправимым препятствием, так что возможность сменить головку иногда будет свойством. Печатающие головки для струйных принтеров очень дороги, интегрированный картридж с печатающей головкой и чернилами, стоит в 10 раз дороже простого картриджа с чернилами, так что возможность замены головки только когда это необходимо также хорошее свойство. Принтера Epson Stylus имеют тенденцию к наличию фиксированной головки, а принтера HP DeskJets стремяться иметь головки интегрированные в картридж. Canons имеют картриджы стороних производителей с независимо заменяемыми банками с чернилами; мне нравится такой дизайн. OTOH, картриджи HP не являются ненормально дорогими, и HP создал более полную линую продуктов; Canon часто предлагает решения с точки зрения качества печати. Вы не можете выиграть.

Лазерные принтера

Лазерные принтера расходуют барабаны и тонер. Самые дешевые модели включают вместе тонер и барабан в один большой картридж; эти решения стоят дороже. Лучшим решением для больших объемов является отдельный тонер в виде порошка или по крайней мере отдельные картриджи для тонера и барабана.

Фотографические принтера

Наилучшее фотографическое качество получается термических принтеров подобных серии Alps (термический перенос сухих чернил или сублимация краски). Некоторые из моделей Alps доступны по средствам, но у них плохая поддержка Linux (кто-то говорил мне о картинках с полосами и большой зернистостью). Специализированные струйные принтера обычно используют 6 цветную CMYKcm печать или даже 7 цветный процесс CMYKcmy; только модели с поддержкой Postscript работают с Linux, поскольку Ghostscript не поддерживает 6- и 7-цветную печать. Хотя чтобы получить хороший вывод в CMYK очень просто. Все принтера для фото-печати дороги для работы; либо вы всегда заменяете весь картридж или перезаполняете отдельные цвета для вашего великолепного принтера. Специальная бумага также стоит дорого. Смотрите также раздел о печати фотографии в конце документа, а также раздел о настройке цветов в Ghostscript.

Скорость

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

Формы

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

Наклейки

Существует два типа принтеров для наклеек; посмотрите на модели Dymo-Costar и Seiko SLP. Другие модели могу работать, а могут и не работать. Каждая из моделей может делать наклейки разного размера на формате 8.5x11, который вы прогоняете через обычный принтер.

Плоттеры

Большие форматы в настоящее время поддерживаются огромными струйными принтерами; одной из популярных марок являетсяHP. Струйные принтера среднего размера (11x17) часто используются для печати меньших форматов. Большинство плоттеров этого рода обычно работают с языками RTL, HP-GL, и HP-GL/2, которые все являются патентованными векторными языками HP, вывод данных на которых генерируется прикладным программным обеспечением.

Что есть у меня?

Я владею HP Deskjet 500 и Lexmark Optra 40. Оба принтера работают великолепно: Deskjet является старой черно-белой моделью, хорошо поддерживаемой Ghostscript; а Optra является более современным цветным струйным принтером с полной поддержкой Postscript и PCL 5 (!).

У меня также есть сервер печати Hawking Technology 10/100 Ethernet (модель 7117, в действительности выпущенная Zero One Technologies на Taiwan); это делает возможным поместить принтер в любом месте с подключением к сети и питанию, вместо того, чтобы размещать его рядом с компьютером. Это маленькая заглушка, которая присоединяется к параллельному порту компьютера и имеет Ethernet разъем на другой стороне. Его недостаток заключается в том, что он не поддерживает двустороннее сообщение, так что я не мог приспособить его для того, чтобы он посылал сообщение по электронной почте когда заканчиваются чернила.

5. Какое программное обеспечение используется для буферизации печати?

До недавнего времени выбор для пользователей Linux был очень прост -- каждый запускал тот же самый старый lpd, который был почти дословно перенесен из кода BSD Net-2. Даже сегодня большинство продавцов продает это программное обеспечение. Но ситуация начинает меняться. Системы подобные SVR4, включая Sun Solaris, идут с полностью отличающимся пакетом печати, сконцентрированным вокруг lpsched.

В настоящее время я рекомендую систему PDQ и для простых пользователей домашних компьютеров и для (используя сочетание pdq/lpd) людей, работающих в более крупных средах. Она обеспечивает самый простой и самый гибкий механизм настройки и великолепные пользовательские утилиты (конечно только те, которые обеспечивают общую настройку принтера по функциональности равны диалогу настройки принтера в Windows).

5.1 PDQ

PDQ это система печати без центрального демона, которая имеет встроенный, разумный синтаксис настройки драйвера. Она включает возможность объявления настроек печати, а также графическую и командно-строковые утилиты для того, чтобы пользователи могли использовать эти настройки; пользователям предоставляется великолепное диалоговое окно, в котором указывается плотность печати, тип бумаги, и т.п.

Запуск всех этих фильтров пользователем имеет несколько преимуществ: нет большинства проблем безопасности при использовании Postscript, много файловые задания LaTeX могут печататься очень эффективно в виде dvi-файлов и т.п.

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

Если у вас много пользователей, много принтеров или какая-нибудь сложная система, то я вам рекомендую использовать PDQ как надстройку над сетевой печатью на базе протокола LPD (вы можете печатать через протокол на локальную машину). Во многих таки ситуациях вместо использования BSD lpd как базы я рекомендую использовать LPRng:

5.2 LPRng

Есть данные, что некоторые поставщики Linux будут обеспечивать поддержку LPRng, как менее древней системы буферизации печати, которая более менее свободно доступна. LPRng более легка для администрирования больших организаций (читайте так: более одного принтера, любые последовательные принтера, или любые специфические не-lpd сетевые принтера) и менее страшная основа, чем предоставляет lpd. Она даже претендует на то, что система является безопасной -- нет исполняемых файлов с битом SUID, и она поддерживает аутентификацию через PGP или Kerberos.

LPRng также включает некоторые примеры настроек для типовых сетевых принтеров - в основном HP LaserJets, которые имеют некоторые возможности учета ресурсов. Если вы хотите получить больше информации о LPRng, то посмотрите страницу LPRng.

LPRng распространяется либо под GPL либо под Artistic license. (Раньше это было не так).

5.3 PPR

PPR это система буферизации печати, ориентированная на Postscript, который включает возможность разбора Postscript (еще в зачаточном состоянии) из-за которой он имеет несколько хороших возможностей. Он включает в себя хорошие возможности учета, поддержку клиентов Appletalk, SMB и LPD, и более лучшую обработку чем lpd обработку ошибок. PPR, как и другие перечисленные системы буферизации, может вызывать Ghostscript для работы с принтерами не понимающими Postscript.

Я только недавно нашел информацию о PPR; я не знаю никого, кто экспериментировал бы с ним. Он был написан и используется в Trinity College. Система распространяется под лицензией BSD-стиля; свободно для любого использования, но требуется ссылка на авторов.

5.4 CUPS

Одним из интересных новичков на сцене является "CUPS", реализация протокола печати Internet, определенный в RFC сходный с HTTP протокол заменяющий древний протокол lpd. Основная часть реализации этого пакета является продуктом с открытым исходным кодом от коммерческого продукта "Easy Print", который состоит из системы буферизации и набора коммерческих драйверов печати, созданных на основе Ghostscript (ESP Print Pro).

CUPS, сама система буферизации распространяется под действием лицензии GPL. ESP Print Pro распространяется только в двоичном виде как коммерческий продукт (за исключением системы буферизации, которая также доступна под действием GPL и называется CUPS).

6. Как это работает, основы

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

6.1 PDQ

Pdq обозначает "Print, Don't Queue (Печатать не буферизуя)", и способ который он использует для работы отражает этот дизайн. Следующая последовательность событий происходит при использовании для печати PDQ:

Во время этого процесса и после, состояние каждого задания может быть увидено с помощью xpdq. Задания, которые не смогли быть выполнены показаны красным цветом и могут быть посланы заново.

6.2 LPD

Lpd обозначает Line Printer Daemon (демон линейной печати), и ссылается в разных контекстах и на программу-демона и на весь набор программ которые работают с системой печати. Это:

lpd

Демон системы печати. Один из них работает для контроля действий на машине, И запускается один на каждый принтер пока принтер печатает.

lpr

Пользовательская команда печати. Lpr контактирует с lpd и выдает новое задание печати в очередь печати.

lpq

Перечисляет задания в очереди печати.

lpc

Команда контроля системы lpd. С помощью lpc вы можете останавливать, начинать, переупорядочивать и т.п. очереди печати.

lprm

lprm удаляет задание из очередей печати.

Теперь как это работает вместе? Когда система загружается, стартует процесс под названием lpd. Он сканирует файл /etc/printcap чтобы узнать какие принтера он будет обслуживать. Каждый раз при запуске lpr, lpr контактирует с lpd через именованный сокет /dev/printer, и передает lpd и файл для печати и некоторую информацию о том кто печатает и как печатать файл. Затем lpd печатает файл на соответствующем принтере в порядке очереди.

Система lp была спроектирована когда большинство принтеров было линейными принтерами -- так что люди в большинстве печатали чистый ascii. Как показало время, только небольшое добавление было необходимо чтобы заставить lpd работать довольно хорошо с заданиями сегодняшнего дня, которые часто идут в формате PostScript, или текст, или dvi, или..

7. Как настроить - основы

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

Если предоставленные вам утилиты не подходят вам, или вы хотите контролировать настройки печати, то вы должны использовать PDQ; Я рекомендую использование PDQ в большинстве случаев.

7.1 Настройка PDQ

PDQ может быть настроен либо администратором, либо обычным пользователем. Изменения внесенные администратором делаются в файле /etc/printrc, и применяются ко всем пользователям, в то время как обычный пользователь может изменять только свой персональный файл .printrc. Все описанное применяется к обоим типам настройки.

Если PDQ не доступен в вашем дистрибутиве, то вы должны взять исходные тексты со страницы PDQ и скомпилировать его сами. Он легко компилируется, но вы сначала должны убедиться, что установили разные библиотеки для разработки с применением GTK, пакет для разработки программ на языке C, компилятор gcc, программу make, и возможно еще несколько других пакетов для разработки.

Драйвера и интерфейсы

PDQ позволяет пользователям выбрать принтер на который будет производится печать. Принтер в PDQ определяется как комбинация "драйвера" и "интерфейса". И драйвер и интерфейс являются текстовыми описаниями в файле настройки PDQ.

Интерфейс PDQ описывает то, как данные посылаются на принтер. Наиболее общими интерфейсами, которые поставляются вместе с дистрибутивом PDQ в качестве примера файла printrc, являются:

local-port

Интерфейс локального порта работает с параллельным или последовательным портом на той машине, на которой запущен PDQ. Используя этот интерфейс PDQ может печать прямо в параллельный порт. Заметьть, что если вы работаете в многопользовательской системе, то это может вызвать неразбериху, и если вы имеете сеть, то интерфейс local-port будет применим только для одной системы. В этих случаях вы можете определить очередь печати lpd без фильтра и без проблем печатать на в эту очередь одинаковым способом со всех систем и пользователей. Интерфейс имеет аргумент -- имя устройства; обычным значением является /dev/lp0.

bsd-lpd

Интерфейс bsd lpd общается по сети с демоном LPD или с работающим по протоколу LPD сетевым принтером. PDQ поддерживает постановку, отмену заданий и запросы к интерфейсу LPD. Этот интерфейс имеет параметры: имя сервера и название очереди.

appletalk

Интерфейс appletalk позволяет вам печатать на принтера в сети Appletalk; если у вас есть принтер подключенный к компьютеру Mac, то необходимо использовать этот интерфейс. Этому интерфейсу для работы нужен пакет Netatalk.

Драйвер PDQ описывает как перевести печатаемые данные в формат, который понимает данные принтер. Для принтеров понимающих Postscript, он будет включать преобразования из ascii в Postscript; для не-Postscript принтеров он будет описывать преобразования из Postscript в язык принтер, используя Ghostscript.

Если ни одна из включенных в поставку PDQ спецификаций драйвера не подходит к вашему принтеру, то читайте дальнейшие разделы и пишите свой драйвер.

Определение принтеров

Для того чтобы определить принтер в PDQ:

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

Создание определения драйвера PDQ

Здесь я проведу вас по примеру создания объявления драйвера PDQ. До того, как вы начнете этот процесс, загляните в несколько мест, чтобы найти существующие объявления драйверов:

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

Если вы создали свой собственную спецификацию драйвера, или или вы расширили спецификацию из дистрибутива PDQ или сгенерированную вышеупомянутой программой, то пожалуйста поделитесь вашим трудом со всем миром!Пошлите его мне на адрес ([email protected]), и его смогут найти будущие пользователи PDQ, у которых принтер такого же как у вас типа.

Теперь давайте пройдем сквозь этапы написания спецификации драйвера для принтера, который в базе данных Printing HOWTO отмечен как работающий, но для которого вы не можете найти спецификацию драйвера PDQ. Я буду использовать принтер Canon BJC-210 в качестве примера

Давайте сначала заглянем в информацию об этом принтере. Заметьте, что он поддерживается "великолепно", так что мы можем получить результат, который сравним (или лучше) с результатами, получаемыми пользователями Windows. Важной информацией являются три места в полученной информации:

Драйвер

Последняя строка в колонке Works?/Language/Driver сообщает нам, что есть драйвер работающий с этим принтером. Более того, это имя является ссылкой на домашнюю страницу с драйвером.

Заметки

Заметки понятные для людей часто содержат полезную информацию. Для некоторых принтеров существует ссылка "More Info (Больше информаци)", которая обычно ссылается на страницу пользователя, который работает с этим принтером или на странцу драйвера данного принтера.

Список драйверов

Большинство принтеров имеют список команд драйвера. Это наиболее важная часть.

Спецификация драйвера PDQ имеет две логических функции: взаимодействие с пользователем и обработка задания. Это представляется в файле в трех местах:

Объявление ключей (опций)

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

Языковые фильтры

Этот раздел описывает процесс преобразования заданий печати из формата в котором они пришли (обычно это Postscript или ASCII) в формат, который понимает принтер (например PCL). Значения ключей доступны в этом разделе, так же как и в фильтре вывода.

Выходной фильтр

Этот последний фильтр связывает данные принтера независимо от типа входных данных; часто ключи принтера устанавливаются в этом месте.

Давайте продемонстрируем все это для Canon BJC-210:

Ключи

Список драйверов для данного принтера выглядит следующим образом:

Driver: Ghostscript: -sDEVICE=bj200 -r360x360   # (360x360 BW)
Driver: Ghostscript: -sDEVICE=bjc600 -r360x360  # (360x360 Color)

Документация в базе данных сообщает нам, что тип драйвера "Ghostscript", который является набором ключей для Ghostscript, без "обычных" ключей, таких как -q или файлом, указывающим эти ключи.

BJC-210 поддерживает одну полезную опцию: пользователь должен выбрать в каком режиме будет печатать: в цветном или черно-белом. Давайте объявим это как опцию выбора, названную "MODE":

option {
  var = "MODE"
  desc = "Print Mode"
  # default_choice "Color"    # раскомментируйте для установки значения по умолчанию
  choice "BW" {
    # Часть value назначает переменной MODE все что вы захотите.
    # Мы будем назначать текст, который отличается для разных наборов
    # ключей Ghostscript для каждого из режимов
    value = "bj200"
    help = "Fast black printing with the black cartridge."
    desc = "Black-only"
  }
  choice "Color" {
    value = "bjc600"
    help = "Full-color printing."
    desc = "Color"
  }
}

При описанном выше объявлении пользователь будет видеть выбор только из значений Color или BW, в диалоге драйвера принтера при печати через xpdq. В командно-строковой утилите pdq, пользователь может указать ключи -oBW или -oColor. Значение по умолчанию может быть установлено с помощью xpdq, или объявлено с помощью ключевого слова default_choice.

Обработка типов данных

Обычно PDQ определяет тип входных данных с помощью команды file(1). Для каждого типа, возвращенного командой file, и который вы хотите обрабатывать, вам необходимо определить предложение language_driver. Это предложение состоит в основном из скрипта для обработки задания печати, на любом (!) языке скриптов, который вы захотите использовать (языком по умолчанию является язык Bourne shell).

В нашем случае мы хотим печатать Postscript и ASCII на нашем принтере BJC-210. Поэтому нам необходимо два драйвера для типов файлов: один для запуска Ghostscript для заданий в формате Postscript, и один для добавления команд возврата каретки к заданиям в ASCII:

# Первый language_driver в этом файле, который соответствует результату
# выполнения  file(1) сообщает, что будет использовано
language_driver ps {
  # file(1) возвращает строку "PostScript document text conforming at..."
  filetype_regx = "postscript"
  convert_exec = {
    gs -sDEVICE=$MODE -r360x360 \     # ключи gs из базы данных
       -q -dNOPAUSE -dBATCH -dSAFER \ # "обычные" ключи Ghostscript
       -sOutputFile=$OUTPUT $INPUT    # обработка INPUT в файл OUTPUT

    # Последние две строки часто одинаковы для всех поддерживаемых gs
    # принтеров. Однако строка gs..., будет разная для каждого из
    # принтеров.
  }
}

# Мы объявили тип text после postscript, потому-что команда "file" часто
# описывает файл postscript как текстовый (чем он и является).
language_driver text {
  # Нет filetype_regx; мы ищем соответствие имени драйвера: "text"
  convert_exec = {#!/usr/bin/perl
     # Программа на Perl, просто потому-что мы можем писать на нем!
     my ($in, $out) = ($ENV{'INPUT'}, $ENV{'OUTPUT'});
     open INPUT, "$in";
     open OUTPUT, ">$out";
     while(<INPUT>) {
        chomp;
        print OUTPUT, "$_\r\n";
     }
  }
}

Это все! В то время как другие принтера нуждаются в фильтрации выходных данных (как описано в следующем разделе), вышеприведенное предложение подходит для BJC-210. Мы просто передадим их указанному предложению driver:

driver canon-bjc210-0.1 {
  option {
    var = "MODE"
    desc = "Print Mode"
    # default_choice "Color"    # раскомментируйте для установки значения по
                                                                # умолчанию
    choice "BW" {
      # Часть value назначает переменной MODE все что вы захотите.
      # Мы будем назначать текст, который отличается для разных наборов
      # ключей Ghostscript для каждого из режимов
      value = "bj200"
      help = "Fast black printing with the black cartridge."
      desc = "Black-only"
    }
    choice "Color" {
      value = "bjc600"
      help = "Full-color printing."
      desc = "Color"
    }
  }

  # Первый language_driver в этом файле, который соответствует результату
  # выполнения  file(1) сообщает, что будет использовано
  language_driver ps {
    # file(1) возвращает строку "PostScript document text conforming at..."
    filetype_regx = "postscript"
    convert_exec = {
      gs -sDEVICE=$MODE -r360x360 \     # gs options from the database
         -q -dNOPAUSE -dBATCH -dSAFER \ # the "usual" Ghostscript options
         -sOutputFile=$OUTPUT $INPUT    # process INPUT into file OUTPUT

      # Последние две строки часто одинаковы для всех поддерживаемых gs
      # принтеров. Однако строка gs..., будет разная для каждого из
      # принтеров.
    }
  }

  # Мы объявили тип text после postscript, потому-что команда "file" часто
  # описывает файл postscript как текстовый (чем он и является).
  language_driver text {
    # Нет filetype_regx; мы ищем соответствие имени драйвера: "text"
    convert_exec = {#!/usr/bin/perl
       # Программа на Perl, просто потому-что мы можем писать на нем!
       my ($in, $out) = ($ENV{'INPUT'}, $ENV{'OUTPUT'});
       open INPUT, "$in";
       open OUTPUT, ">$out";
       while(<INPUT>) {
          chomp;
          print OUTPUT, "$_\r\n";
       }
    }
  }
}

Если вы хотите добавит что-нибудь в начало или конец всех заданий печати, или выполнить какое-нибудь преобразование любых данных любых типов, то воспользуйтесь предложением filter_exec. Наш принтер Canon не нуждается в таком предложении, но просто для примера, мы приведем простую иллюстрацию, показывающую как сделать поддержку двухсторонней печати и выбора разрешения на принтерах Laserjet или других моделях, поддерживающих PJL:

driver generic-ljet4-with-duplex-0.1 {
  # Сначала два предложения option для обеспечения выбора пользователя:
  option {
    var = "DUPLEX_MODE"
    desc = "Duplex Mode"
    default_choice = "SIMPLEX"
    choice "SIMPLEX" {
      value = "OFF"
      desc = "Односторонняя печать"
    }
    choice "DUPLEX" {
      value = "ON"
      desc = "Двухсторонняя печать"
    }
  }

  option {
    var = "GS_RES"
    desc = "Resolution"
    default_choice = "DPI600"
    choice "DPI300" {
      value = "-r300x300"
      desc = "300 dpi"
    }
    choice "DPI600" {
      value = "-r600x600"
      desc = "600 dpi"
    }
  }

  # Теперь мы обрабатываем Postscript используя драйвер Ghostscript для ljet4:
  language_driver ps {
    filetype_regx = "postscript"
    convert_exec = {
       gs -sDEVICE=ljet4 $GS_RES \
          -q -dNOPAUSE -dBATCH -dSAFER \
          -sOutputFile=$OUTPUT $INPUT
    }
  }

  # В заключение мы обернем задание в команды PJL:
  filter_exec {
    # требуется наличие команды echo с возможностями выдачи кода escape...
    echo -ne '\33%-12345X' > $OUTPUT

    echo "@PJL SET DUPLEX=$DUPLEX_MODE"    >> $OUTPUT
    # Вы можете вставить дополнительные команды @PJL, подобные приведенным выше.
    # Убедитесь, что вы всегда дополняете (>>) к выходному файлу!

    cat $INPUT >> $OUTPUT
    echo -ne '\33%-12345X' >> $OUTPUT
  }
}

7.2 Настройка LPD

Традиционная настройка lpd

Традиционная настройка lpd заканчивается тем, что можно создавать очереди файлов и печатать их. Она не обращает никакого внимания на то понимает ли принтер эти файлы или нет, и скорее всего не позволит производить привлекательный вывод. Тем не менее, это первый шаг к пониманию, так что читайте!

Для добавления очереди печати к lpd, вы должны добавить запись в файл /etc/printcap, и создать новую буферную директорию в каталоге/var/spool/lpd.

Запись в файле /etc/printcap выглядит примерно так:

# ЛОКАЛЬНЫЙ djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:

Это определяет принтер называемый lp, dj, или deskjet, его спул размещается в директории /var/spool/lpd/dj, без ограничения максимального размера задания, который печатает на устройство /dev/lp0, и который не имеет страницу с заголовком (с именем человека, который печатает и т.п. информацией) добавленную в начало задания печати.

Теперь прочитайте справочную страницу для printcap.

Вышеприведенный пример выглядит очень простым, но он имеет ловушку -- хотя я посылаю файлы, которые DeskJet 500 может понимать, этот DeskJet будет печатать странные вещи. Например посыл обычного текстового файла Unix приведет к тому, что deskjet будет интерпретировать символы новой строки как символы, и выдаст мне:

This is line one.
                 This is line two.
                                  This is line three.

Печать файла PostScript на этот принтер выдаст великолепный листинг команд PostScript, напечатанных с этим "лестничным эффектом", а не полезный вывод.

Очевидно требуется что-то сделать, и это является назначением фильтрации. Более наблюдательные из тех кто читал справочную страницу printcap должны были заметить атрибуты принтера if и of. Хорошо, if, или входной фильтр -- это все что нам нужно здесь.

Если мы напишем маленький скрипт, названный filter, который добавляет возврат каретки до символа новой строки, то лестничный эффект будет ликвидирован. Так что мы добавим строку if в нашу, вышеприведенную запись в printcap:

lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:

Простой скрипт может выглядеть так:

#!perl
# Предыдущая строка должна содержать полный путь к perl
# Скрипт должен быть исполнимым: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# Вы можете также добавить в конец прогон страницы: print "\f";

Если мы сделаем как приведено выше, мы будем иметь принтер на котором мы сможем печатать обычные текстовые файлы Unix и получать осмысленные результаты. (Конечно мы можем написать этот фильтр четырьмя миллионами лучших способов, но этот более иллюстративный. Вы можете попытаться сделать это более эффективно).

Оставшаяся проблема в том что печать простого текста не является злободневной -- наверняка будет лучше если мы сможем печатать PostScript и другие типы форматированого и графического вывода. Да и это легко сделать. Метод является просто расширением вышеприведенного фильтра для исправления перевода строки. Если вы напишите фильтр, который может воспринимать произвольные типы файлов как ввод и производить вывод для DeskJet для каждого случая, тогда мы безусловно получим "умный" спулер принтера.

Такой фильтр называется magic-фильтр. Не беспокойте себя написанием фильтра, до тех пора пока они не будут печатать странные вещи -- в сети уже существует много хорошо написанных фильтров. APS Filter это лучший среди всех, или ваш дистрибутив Linux может иметь утилиту настройки принтера, которая сделает всю настройку очень простой.

Есть правда ловушка для таких фильтров: некоторые старые версии lpd не запускают фильтр if для удаленных принтеров, а некоторые запускают. Версии lpd используемые в современных дистрибутивах Linux и FreeBSD запускают указанный фильтр; большинство коммерческих юниксов до сих пор поставляются с lpd, которые не запускают фильтр для удаленных принтеров. Смотрите раздел о сетевой печати для более детальной информации.

Учет ресурсов

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

Обычный LPD предоставляет очень небольшую помощь в выполнение учета ресурсов. Вы можете указать имя файла для учета ресурсов используя атрибут af= в printcap, но только передается как параметр вашему фильтру, указанному в if=. Возможно сделать так, что ваш if= фильтр будет писать данные в файл учета ресурсов, и вы будете обрабатывать этот файл позже (традиционный формат в основном полезен для строчных принтеров, и нетривиален для разбора с помощью Perl, так что нет причин сохранять его).

Ghostscript предоставляет оператор PageCount, который вы можете использовать для подсчета страниц в каждом из заданий; обычно вам необходимо добавить несколько строк на postscript в конец задания для того, чтобы дописать запись в файл учета; лучшим примером этого является файл unix-lpr.sh в поставке исходного кода Ghostscript.

Заметьте, что реализация учета ресурсов использованная в unix-lpr пишет в файл из Ghostscript и таким образом несовместима с рекомендованным ключом -dSAFER. Лучшим решением мог бы быть опрос принтера с помощью команды PJL после каждого из заданий, или написать программу на postscript, которая будет выдавать число страниц на стандартный вывод, где данные могут быть захвачены другой программой.

Система буферизации LPRng включает простую реализацию учета ресурсов для HP; я думаю, что она опрашивает принтер используя PJL.

Большие системы

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

Права доступа на файлы

По популярному требованию, я включил ниже список прав доступа на интересующие нас файлы на моей системе. Существует несколько более лучших способов сделать это, в идеале использовать только выполнимые файлы со SGID и не делать все подряд SUID root, но это как пришло в моей системе, и это работает для меня. (Довольно откровенно, если ваш производитель даже не может сделать работающий lpd, то вы в опасной поездке).

-r-sr-sr-x   1 root     lp    /usr/bin/lpr*
-r-sr-sr-x   1 root     lp    /usr/bin/lprm*
-rwxr--r--   1 root     root  /usr/sbin/lpd*
-r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
drwxrwxr-x   4 root     lp    /var/spool/lpd/
drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

В настоящее время lpd должен быть запущен под правами администратора, так что он может быть связан с сервисным портом lp с низким номером. Он должен вероятно быть с UID lp.lp или каким-то после связывания, но я не знаю с каким.

PDQ использует отличную от других схему, не ориентированную на демонов, и поэтому у него другие программы. Только несколько программ имеют установленный бит SUID и владельца администратора, эта программы являются интерфейсом к lpd и называются lpd_cancel, lpd_print и lpd_status; эти программы имеют SUID, потому-что сервера печати Unix требуют отправки запросов с привилегированного порта. Если вам необходимо применять интерфейс bsd-lpd из поставки PDQ только для сетевых принтеров печати таких как адаптеры HP JetDirect или Lexmark MarkNet), то вам не нужно устанавливать бит suid на эти программы.

8. Где взять программное обеспечение для печати

Много написанных пакетов фильтров (и другого программного обеспечения относящегося к печати) доступно с MetaLab. Такие утилиты как psutils, a2ps, mpage, dvitodvi, flpr и т.п. все могут быть найдены там.

В настоящее время существует несколько пакетов, которые старались сделать настройку принтера более легкой. Они вероятно все еще существуют, но лучший из них и более современный это пакет APS Filter, написанный Andreas Klemm, который имеет управляемый меню настройщик printcap и обрабатывает практически любой тип вообразимого ввода. Если ваш поставщик не поставил вам хорошую утилиту настройки принтера, то APS Filter это правильный путь решения проблем.

9. Решения производителей

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

Сейчас существует несколько пакетов, которые пытаются сделать настройку принтеров для использования с lpd более легкой. Они вероятно существуют до сих пор, но лучшим из них и самым современным является пакет APS Filter, написанный Andreas Klemm, который имеет управляемую меню настройку printcapи обрабатывает почти все типы входных данных. Если производитель вашего дистрибутива не поставляет хорошую утилиту настройки принтера, то APS Filter будет хорошим выбором; несколько дистрибутивов включают apsfilter, или он легко добавляется.

9.1 Red Hat

Red Hat имеет утилиту администрирования принтера с GUI-интерфейсом называемую printtool, которая может добавлять удаленные принтера и принтера на локальных устройствах. Она позволяет вам выбрать поддерживаемый ghostscript тип принтера и устройство Unix на которое будет производиться печать, затем устанавливает очередью печати в файл /etc/printcap и для поддержки postscript и других форматов данных использует фильтр из пакета rhs-printfilters. Это решение работает довольно хорошо, и оно тривиально в установке для общих случаев.

Red Hat может дать сбой, если у вас принтер, который не поддерживается Ghostscript, который идет в его поставке, (он является GNU версией, а не версией Aladdin Ghostscript, которая поддерживает большее количество принтеров). Посмотрите список совместимости принтеров, приведенный выше (или по адресу online), в том случае если вы обнаружили, что вы не можете печатать правильно, используя программное обеспечение, предоставленное Red Hat. Если ваш принтер не поддерживается утилитами Red Hat, то вы можете установить Aladdin Ghostscript, и вероятно будет лучше, если вы будете использовать пакет apsfilter, который имеет все сведения о принтерах, поддерживаемых последними версиями Ghostscript.

В будущих версиях Red Hat программа printtool будет переделана для поддержки большего количества принтеров и будет предназначена для окончательной замены rhs-printfilters (текущий фильтр имеет трудности с поддержкой многих распространенных принтеров, таких как не-PCL DeskJet и большинство принтеров Lexmark). Также могут быть объединены некоторые разработанные в VA Linux PPD.

9.2 Debian

Debian предлагает выбор между обычным lpd и LPRng; вероятно LPRng будет наилучшим выбором. Я верю, что Debian также предлагает выбор утилит для настройки принтера; пакет apsfilter версии 5 или более поздней вероятно будет лучшим выбором, поскольку в этих версиях добавлена поддержка LPRng и драйверов uniprint Ghostscript.

9.3 SuSE

Система печати в SuSE Linux основана на apsfilter, с некоторыми расширениями; SuSE-версия программы apsfilter распознает все основные типы файлов (включая HTML, если установлена программа html2ps). Существует два способа установки принтеров в системах с SuSE:

Руководство по установке SuSE описывает обе эти процедуры настройки.

Wolf Rogner написал, что есть некоторые сложности с SuSE. Вероятно следующие ошибки могут возникнуть у вас:

9.4 Другие дистрибутивы

Пожалуйста посылайте мне информацию о том сто имеется в других дистрибутивах.

10. Ghostscript

GhostscriptЭто невероятно важная программа для печати в Linux. Большинство печатающего программного обеспечения под Unix генерирует PostScript, поддержка которого принтером обходится примерно в $100 долларов на каждый принтер. Тем не менее Ghostscript, является свободным и генерирует вывод на языке вашего принтера из PostScript. Когда он связан c описанием драйвера принтера PDQ или с входным фильтром вашего lpd, это дает вам виртуальный PostScript-принтер и значительно упрощает жизнь.

Ghostscript доступен в двух формах. Коммерческая версия Ghostscript, называемая Aladdin Ghostscript, mможет быть использована свободно для персонального использования, но не может распространяться с коммерческими дистрибутивами Linux. В общем она примерно на год впереди свободной версии Ghostscript; в настоящее время, например, она поддерживает много цветных струйных принтеров, в то время как старый Ghostscripts не делает этого.

Свободная версия Ghostscript называется GNU Ghostscript, и это просто устаревшая версия Aladdin Ghostscript любезно предоставленная для GNU. (Спасибо славному Aladdin за эту договоренность; больше производителей программного обеспечения должны поддерживать свободное программное обеспечение этим способом, если они не могут сделать распространение кода в терминах GPL).

Что бы вы не делали с gs, будьте уверены что запускаете его с опцией запрещающей доступ к файлам (-dSAFER). PostScript это полнофункциональный язык, и плохая программа на PostScript может доставить вам достаточно неприятностей.

Честно говоря разговор на PDF, (Формате Переносимого Документа Adobe) это в действительности чуть больше чем организованный PostScript в сжатом файле. Ghostscript может обрабатывать ввод в PDF также как это делает с PostScript. Так вы можете быть первым в вашем квартале с принтером имеющим возможность обработки PDF.

10.1 Обращение к Ghostscript

Обычно ghostscript будет запускаться magic-фильтром, которым вы пользуетесь (Я рекомендую пакет apsfilter, если ваш поставщик не поставил вам этот пакет), но для целей отладки очень часто удобно запускать его прямо.

gs -help даст вам коротки, информативный список опций и доступных драйверов (заметим, что этот список является списком вкомпилированных драйверов, не основным списком доступных драйверов).

Вы можете запустить gs для тестирования примерно так: gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps.

10.2 Настройка вывода Ghostscript

Существует набор вещей которые вы можете сделать если вывод gs не удовлетворителен (пожалуйста вы можете латать что угодно, поскольку вы имеете исходные тексты).

Некоторые из этих опций, и другие описанные в руководстве пользователя Ghostscript (файл Use.htm в дистрибутиве Ghostscript; в вашей системе эта документация может быть установлена в каталоги /usr/doc или /usr/share/doc) являются великолепными кандидатами для настроек драйвера в вашем объявлении драйвера PDQ.

Расположение вывода и его размер

Расположение, размер и коэффициент сжатия изображения на странице контролируются принтер-специфичным драйвером в ghostscript. Если вы обнаружили, что ваши страницы получаются слишком короткими, или слишком длинными или со слишком большим фактором увеличения, вы можете посмотреть в исходный код модуля драйвера и выровнять необходимые для вас параметры. К сожалению каждый драйвер написан по разному, так что я не могу сказать что исправлять, но большинство из них довольно неплохо описаны.

Гамма, размер точек и т.п.

Большинство не лазерных принтеров страдают от факта, что их точки немного больше. В результате картинки получаются слишком темными. Если вы страдаете от этой проблемы, то вы должны использовать свою собственную функцию переноса. Просто создайте следующий файл в директории lib ghostscript и добавьте его имя в вызов gs перед именем нужного файла. Вам может быть необходимо поиграть со значениями для настройки на ваш принтер. Более низкие значения дают более яркую печать. Особенно если ваш драйвер использует алгоритм Floyd-Steinberg для растеризации цветов, то более низкие значения (0.2 - 0.15) вероятно будут хорошим выбором.

---8<---- gamma.ps ----8<---
%!
%transfer functions for cyan magenta yellow black
{0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer
---8<------------------8<---

Также возможно чинить принтера, которые имеют некоторый сорт проблем с цветом с помощью подбора значений указанных выше. Если у вас есть такая проблема, я рекомендую вам использовать файл colorcir.ps, который идет вместе с ghostscript (в поддиректории examples/), как тестовую страницу.

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

Цветная печать в Ghostscript

Смешение по умолчанию в Ghostscript оптимизован для устройств с маленьким разрешением. Будет производится смешение с предпочтением огрубления при попытке создания вывода с качеством 60ppi (не путайте с dpi, ppi - это "видимые" цветные пикселы на дюйм, которые вы получите после смешения). Это создаст более бедный вывод на современных цветных принтерах; в частности, струйные принтера с фотобумагой могут использовать лучшие настройки ppi.

Для выравнивания этого используйте ключ Ghostscript -dDITHERPPI=x, где x это используемое значение. Таким способом вы можете или не можете добиться успеха со всеми драйверами; многие из новых драйверов реализуют свое собственное смешение и не обращают внимания на настройки. Некоторые драйвера могут использовать либо обычное смешение Ghostscript, либо реализованное в драйвере.

Это дает нам великолепный аргумент в объявлении драйвера PDQ, если это применимо.

11. Как печатать на сетевой принтер

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

11.1 На машину с Unix/lpd

Для того чтобы разрешить удаленным машинам печатать на ваш принтер используя протокол LPD, вы должны перечислить эти машины в файле /etc/hosts.equiv или /etc/hosts.lpd. (Заметим, что hosts.equiv имеет список машин несколько с другим эффектом; будьте уверены что вы знаете что вы делаете если перечисляете машины в этом файле). Вы можете разрешить только определенным пользователям на других машинах печатать на ваш принтер используя атрибут rs; читайте справочную страницу lpd для более детальной информации об этом.

Используя pdq

Используя PDQ, вы определяете принтер с типом интерфейса "bsd-lpd". Этот интерфейс берет в качестве аргумента имя удаленного сервера и имя очереди печати; помощник определения принтера запросит у вас эти параметры.

С помощью lpd

Для того чтобы печатать на другую машину вы должны сделать примерно такую запись в /etc/printcap:

# Удаленный djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :lp=/dev/null:\
        :sh:

Заметим что все равно есть директория очереди на локальной машине обслуживаемая lpd. Если удаленная машина занята или отключена, то задание с локальной машины будет находиться в очереди до тех пор пока оно не сможет быть послано.

С помощью rlpr

Вы также можете использовать rlpr для послания задания печати прямо в очередь удаленной машины без мороки с настройкой lpd для выполнения этой задачи. Это в большинстве случаев полезно в ситуациях когда вы печатаете на множество принтеров только время от времени. Из анонса rlpr:

Rlpr использует TCP/IP для посылки заданий печати на сервера с lpd, находящиеся где угодно в сети.

В отличии от lpr, он не требует чтобы удаленный принтер был явно известен машине с которой вы хотите печатать, (например в /etc/printcap) и таким образом является значительно белее гибким и требующим меньше администрирования.

rlpr может использоваться везде где мог бы использоваться традиционный lpr, и он является совместимым с традиционным BSD lpr.

Основная мощь rlpr заключается в удаленной печати откуда угодно куда угодно без учета как система на которую вы хотите печатать была настроена. Rlpr может работать как фильтр, как и традиционный lpr, так что клиенты выполняемые на удаленной машине такие как netscape, xemacs, и т.п., могут печатать на вашу локальную машину с небольшими усилиями.

Rlpr доступен с Metalab.

11.2 На принтер Win95, WinNT, LanManager, или Samba

Существует "Printing to Windows mini-HOWTO" в котором находится больше информации чем в данном документе.

Используя PDQ

Нет предопределенного интерфейса smb, что я сознаю, но он может достаточно легко создан используя модель, заданную интерфейсом appletalk на базе пакета Netatalk. Некоторые люди создали его и выслали его для включения в дистрибутив!

Прочитайте раздел о Windows/LPD в следующих разделах данного документа для дополнительных советов как сделать данный драйвер.

From LPD

Возможно перенаправить очередь lpd через программу smbclient (часть набора Samba) на основанный на TCP/IP сервис печати SMB. Samba включает скрипт называемый smbprint. Вкратце, вы помещаете конфигурационный файл для нужного принтера в его директорию спула, и устанавливаете для него скрипт smbprint как if-фильтр.

Запись в /etc/printcap выглядит примерно так:

lp|remote-smbprinter:\
    :lp=/dev/null:sh:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:

Вы должны прочитать документацию внутри скрипта smbprint для более детальной информации о настройке

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

11.3 На принтер NetWare

Набор программ ncpfs включает утилиту названную nprint, которая обеспечивает те же самые возможности как и smbprint, но для NetWare. Вы можете получить ncpfs с Metalab. Информация из записи в LSM для пакета версии 0.16:

С помощью ncpfs вы можете монтировать тома вашего сервера netware под Linux. Вы также можете печатать в очереди печати netware и перенаправлять очереди печати netware на систему печати Linux. Вам необходимо ядро версии 1.2.x или 1.3.54 и выше. ncpfs НЕ работает с любыми ядрами 1.3.x ниже 1.3.54.

From LPD

Для того чтобы заставить nprint работать через lpd, вам нужно написать маленький скрипт для печати потока стандартного ввода на принтер NetWare, и установить его как if-фильтр для очереди печати lpd. Вы получите что-то подобное этому:

sub2|remote-NWprinter:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/sub2:\
        :if=/var/spool/lpd/nprint-script:

nprint-script может выглядеть примерно так:

#! /bin/sh
# Вы должны сначала попробовать вход как guest без пароля!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -

11.4 На принтер EtherTalk (Apple)

Пакет netatalk включает что-то подобное nprint и smbclient. Другие имеют документированные процедуры для печати на и с сетей Apple много лучше чем я представлял; Смотрите Linux Netatalk-HOWTO.

Используя PDQ

PDQ включает в поставку объявление интерфейса, который называется "appletalk". Он использует пакет Netatalk для печати на подключенный к сети принтер Apple. Просто выберите этот интерфейс при использовании помощника добавления принтера в xpdq.

11.5 На HP или другой ethernet-принтер

Принтеры HP и некоторые другие принтера идут с интерфейсом на который вы можете печатать прямо, используя протокол lpd. Вы должны следовать инструкциям, которые идут с вашим принтером или его сетевым адаптером, но в главном такие принтера являются "работающим" lpd., и обеспечивают одну или более очередь на которые вы можете печатать. Например HP может работать с printcap подобным:

lj-5|remote-hplj:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lj-5:\
        :rm=printer.name.com:rp=raw:

или используя аргументы REMOTE_HOST=printer.name.com и QUEUE=raw для PDQ интерфейса bsd-lpd.

Принтера HP Laserjet с интерфейсами Jet Direct iв общем поддерживают две встроенных очереди lpd -- "raw", которая принимает PCL (и возможно Postscript) и "text", которая принимает чистый ascii (и автоматически справляется с лестничным эффектом). Если у вас JetDirect Plus3 трех-портовый принтер, то очереди называются "raw1", "text2", и так далее.

Заметим, что компания ISS обнаружила набор атак denial of service (DoS), которые могут завесить интерфейсы HP Jetdirect. Большинство из них датируется началом осени 98.

В средах большого масштаба, особенно в больших средах где некоторые принтера не поддерживают PostScript, может быть полезно создать выделенный сервер печати на который все машины будут печатать и на котором все задания ghostscript будут запущены. Это позволит вам приостанавливать очереди печати или переорганизовывать их используя команды topq и lprm.

Это также позволяет вашей машине с Linux выступать как сервер печати для принтера, так что ваши пользователи сети смогут выполнять свои задания печати быстро и справляться с работой не ожидая пока принтер печатает какое-то другое задание посланное кем-то другим. Это также предполагается, если у вас есть старые HP Jetdirects, которые невозможно исправить; это уменьшает вероятность заклинивания принтеров.

Чтобы сделать это, установить очередь на вашей машине, которая указывает на оборудованный ethernet принтер HP LJ (как показано выше). Затем укажите для всех клиентов вашей LAN, чтобы они печатали на очередь печати Linux (например lj-5 как в вышеприведенном примере).

Некоторые сетевые принтера HP по всей видимости не нуждаются в установке страницы заголовка (banner page) посылаемой клиентом; вы можете отключить внутренне генерируемую страницу заголовка зайдя на принтер с помощью telnet, нажав два раза return, набрав "banner: 0" и затем "quit". Существуют другие настройки, которые вы можете изменить тем же способом; наберите "?" для просмотра списка установок.

Полный набор установок принтера может контролироваться с помощью программного обеспечения фирмы HP WebJet. Этот пакет запускается как демон и принимает http запросы на назначенном порту. Он обслуживает формы и Java апплеты, которые могут контролировать принтера HP, работающие в сети. Теоретически, он также может контролировать очереди печати Unix, но он делает это используя сервис rexec, который полностью незащищенным. Я не советую вам использовать это свойство данного пакета.

На старые принтера HP

Некоторые принтера (и печатающие сетевые "черные ящики") поддерживают только никуда не годные маленькие непротокольные соединения включая чистые TCP соединения. Примечательными в этой категории являются ранние модели карт JetDirect (включая некоторые карты JetDirectEx). В основном для печати на принтер вы должны открыть соединение TCP на принтер на указанный порт (обычно 9100 или 9100, 9101 и 9102 для трех-портовых принтеров) и запихнуть свое задание печати в принтер. LPRng имеет встроенную поддержку для выдачи заданий печати на произвольные порты TCP, но при использовании BSD lpd это не так легко. Это может быть выполнено на Perl:

Интерфейс PDQ использующий netcat должен выглядеть примерно так:

interface tcp-port-0.1 {

   help "Это один из первых интерфейсов поддерживаемых стандартными
         сетевыми принтерами и серверами печати. Устройство просто ожидает
                 TCP-соединения на определенном порту, и посылает данные с любого
                 соединения на принтер.\nЭтот интерфейс требует наличия программы
                 netcat (\"nc\")."

   required_args "REMOTE_HOST"

   argument {
      var = "REMOTE_HOST"
      desc = "Удаленная машина"
      help = "Имя или IP-адрес сервера печати."
   }

   argument {
      var = "REMOTE_PORT"
      def_value = "9100"
      desc = "Удаленный порт"
      help = "Это номер порта TCP сервера печати, на который должно посылаться
                  задание. Большинство карт JetDirect, и их вариантов принимают
                          задания на порту 9100 (или 9101 для порта номер 2, и т.п.)."
   }

   requires "nc"

   # nc заканчивает работу после 45 секунд отсутствия сетевой активности:
   # он не завершает работу после приема EOF как мы того желаем.
   send_exec { cat $OUTPUT | nc -w 45 $REMOTE_HOST $REMOTE_PORT }

}

В случае отсутствия этой программы, она может быть реализована другими способами, например на языке Perl, используя нижеприведенную программу. Или для большей производительности используйте программу netcat ("nc"), которая выполняет то же самое. Большинство дистрибутивов должны иметь эту программу в своем составе.

#!/usr/bin/perl
# Спасибо Dan McLaughlin за написание оригинальной версии этого скрипта
# (А также Jim W. Jones за помощь мне при внесении исправлений ;)

$fileName = @ARGV[0];

open(IN,"$fileName") || die "Can't open file $fileName";

$dpi300     = "\x1B*t300R";
$dosCr      = "\x1B&k3G";
$ends = "\x0A";

$port =  9100 unless $port;
$them = "bach.sr.hp.com" unless $them;

$AF_INET = 2;
$SOCK_STREAM = 1;
$SIG{'INT'} = 'dokill';
$sockaddr = 'S n a4 x8';

chop($hostname = `hostname`);
($name,$aliases,$proto) = getprotobyname('tcp');
($name,$aliases,$port) = getservbyname($port,'tcp')
    unless $port =~ /^\d+$/;;
($name,$aliases,$type,$len,$thisaddr) =
        gethostbyname($hostname);
($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
$this = pack($sockaddr, $AF_INET, 0, $thisaddr);
$that = pack($sockaddr, $AF_INET, $port, $thataddr);

if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
#    print "socket ok\n";
}
else {
    die $!;
}
# Задать адрес сокету.
if (bind(S, $this)) {
#    print "bind ok\n";
}
else {
    die $!;
}

# Вызвать сервер.

if (connect(S,$that)) {
#    print "connect ok\n";
}
else {
    die $!;
}

# Установить буферизацию для сокета.

select(S); $| = 1; select(STDOUT);

#    print S "@PJL ECHO Hi $hostname! $ends";
#    print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends";
#    print S $dpi300;

# Избежать блокировки при fork.

if($child = fork) {
    print S $dosCr;
    print S $TimesNewR;

    while (<IN>) {
        print S;
    }
    sleep 3;
    do dokill();
} else {
    while(<S>) {
        print;
    }
}

sub dokill {
    kill 9,$child if $child;
}

11.6 Запуск if для удаленных принтеров со старыми LPD

Одна странность старых версий lpd в том что if не запускается для удаленных принтеров. (Версии после 0.43 или примерно такой имеют изменения внесенные на FreeBSD, так что они всегда работают). Если вам нужно выполнить if, вы можете сделать это установив двойную очередь и перенаправляя задание. Как пример рассмотри такой printcap:

lj-5:remote-hplj:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lj-5:\
        :if=/usr/lib/lpd/filter-lj-5:
lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\
        :rp=raw:sd=/var/spool/lpd/lj-5-raw:

в свете этого скрипт filter-lj-5 будет выглядеть так:

#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
        lpr -Plj-5-remote -U$5

Опция -U lpr работает только если lpr запущен как демон, и она правильно устанавливает имя имя автора задания при его перенаправлении. Вы должны вероятно использовать более надежный метод получения имени пользователя, так как в некоторых случаях оно не является пятым аргументом. Смотрите справочную станицу printcap.

11.7 Из Windows

Печать из под клиента Windows (или OS/2) на сервер Linux прямо поддерживается через SMB используя пакет SAMBA, который также поддерживает разделение вашей файловой системы Linux с клиентами Windows.

Samba включает в себя довольно полную документацию. Вы можете либо настроить magic-фильтр на машине с Linux и печатать на нее в формате PostScript или установить специфичные для принтера драйвера на всех машинах с Windows и обрабатывать очередь без фильтрации. Полагаясь на драйвера Windows вы можете в некоторых случаях получить более качественный вывод, но это дает больше административной нервотрепки если у вас много машин с Windows. Так что сначала попробуйте PostScript.

Используя PDQ, вы должны настроить Samba для запуска команды pdq с соответствующими аргументами вместо команды lpr, которая выполняется по умолчанию. Я верю, что Samba будет запускать pdq с правами соответствующего пользователя, так что он должен работать нормально. Существует несколько настроек Samba, которые вы должны выставить для правильной работы:

printcap

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

lp1|Printer One
lp2|Printer Two
lp3|Printer Three

Короткое имя будет использоваться как имя принтера в команде печати:

print command

Этот параметр должен быть установлен во что-нибудь подобное следующему pdq -P %p %s ; rm %s.

lprm command

Для этого параметра пока нет хорошего значения. Буферизованные задания PDQ будут сниматься после истечения времени, так что если принтер не работает, то все нормально. Но если вы просто решили отменить свое намерение, то вы можете использовать программу xpdq для отмены заданий, но это неприменимо для Windows. Просто вствьте сюда ничего не делающую команду, такую как true. Если вы используете lpd или lprng в качестве основы, то соответствующая команда lprm должна нормально работать. Я не уверен, что Samba может идентифицировать номер задания в очереди lpr для запущенных pdq заданий.

lpq command

Также PDQ не предоставаляет хорошего значения, которое можно поместить здесь. Распределенные системы не предлагают нормального решения для того, чтобы видеть очередь печати, но основанные на samba сервера должны иметь достойную схему. если вы используете lpd или lprng как основу, то соответствующая команда lpq c должна работать; вы просто не сможете увидеть задания, до того, как они будут отфильтрованы PDQ.

11.8 С Apple.

Netatalk поддерживает печать с клиентов Apple через EtherTalk. Смотрите Страницу Netatalk HOWTO для более детальной информации.

11.9 Из под Netware

Пакет ncpfs включает демона называемого pserver, который может быть использован для обеспечения сервиса очередей печати NetWare. Как я понял эта система требует основанную на Bindery систему NetWare, т.е. 2.x, 3.x, или 4.x с разрешенным доступом к bindery.

Для более детальной информации о ncpfs и ее программе pserver смотрите FTP сервер ncpfs FTP.

12. Принтера предназначенные только для Windows

Как я обсуждал ранее, некоторые принтера по определению не поддерживаются, потому-что они не умеют "говорить" на нормальном языке принтеров, вместо этого используя процессор компьютера для обработки картинки, которая передается на принтер с фиксированной скоростью. В некоторых случаях они также могут общаться на нормальных языках принтеров подобных PCL, но часто этого нет. В некоторых (действительно редких) случаях эти принтера даже не используют нормальное параллельное соединение, но полагается на поставляемый производителем драйвер для эмуляции поведения оборудования (наиболее важным является контроль потока).

В любом случае есть несколько возможных решений если у вас такой принтер с неприятными свойствами.

12.1 Ре-директор Ghostscript для Windows

В настоящее время есть драйвер для Windows (называемый mswinpr2), который пропускает задание печати через Ghostscript до окончательной печати задания. (Довольно похоже на фильтр if в LPD системе Unix). Также существует драйвер Ghostscript, который будет печатать используя вызовы Windows GDI. Совместив все вместе, это должно позволить машине под Windows печатать PostScript на принтера работающие только под Windows, используя поставляемые производителем драйвера.

Если вы заставили это работать, то затем вы должны следовать вышеприведенным инструкциям по настройке печати на Windows-принтер по сети из под Linux, чтобы позволить Unix (и другим машинам под Windows, Mac, и т.п.) печатать на ваш "неправильный" принтер.

12.2 HP Winprinters

Некоторые принтера HP используют "Printing Performance Architecture" (маркетиноговое название для "мы были слишком дешевыми чтобы реализовывать PCL). Это поддерживается обходным путем через транслятор pbm2ppa, написанный Tim Norman. Обычно вы используете ghostscript для растеризации PostScript в точечную картинку в формате pbm и затем используете pbm2ppa для ее трансляции в картинку в специфическом для принтера формате ppa, которую можно отправлять на принтер. Эта программа также поставляется сейчас в формате драйвера ghostscript.

Программное обеспечение для ppa может быть найдено на домашней странице ppa; pbm2ppa поддерживает некоторые модели HP 720, 820, и 1000; читайте документацию, которая поставляется вместе с пакетом для более детальной информации о поддержке принтеров с ppa.

12.3 Lexmark Winprinters

Большинство дешевых струйных принтеров Lexmark используют собственный язык и следовательно являются принтерами только для Windows. Однако, Henryk Paluch написал программу, которая может печатать на Lexmark 7000. Имеется надежда, что он сможет выяснить как печатать в цвете и расширит поддержку для остальных струйных принтеров Lexmark. Для дополнительной информации смотрите эту страницу.

Similarly, there are now drivers for the 5700, 1000, 1100, 2070, and others. See the supported printers listing above, and my web site, for more information on obtaining these drivers.

13. Как печатать на факс-машину

Вы можете печатать используя fax-машину, или без нее, используя модем.

13.1 Используя факс-модем

Существует некоторое количество программ для факса, которые позволят вам пересылать документы по факсу. Одна из наиболее мощных программ это HylaFax, автор Sam Leffler, доступная с ftp.sgi.com. Она поддерживает все виды вещей от множественных модемов до широковещательной передачи.

SuSE продает клиента Java HylaFax, который как утверждают работает на любых платформах с Java (включая Windows и Linux). Существует также факс-клиент не на Java для большинства платформ; Linux может обрабатывать едва ли не все потребности для работы с факсом.

Также доступна и является лучшим выбором для большинства машин с Linux efax, простая программа которая посылает факсы. Программа для getty -- mgetty может передавать факсы (и даже создавать голосовые письма на некоторых модемах!).

Посылка факсов используя PDQ

PDQ поставляется без объявления интерфейса fax, но вот простая реализация (которая только частично протестирована):

interface efax-0.1 {
   help "Этот интерфейс использует программу fax из пакета efax для посылки
         факсов. Вы должны сначала добиться выполнения \"fax send\" путем
                 редактирования файла настройки /etc/efax.rc и тестирования.
                 Подключите этот интерфейс к базовому драйверу postscript для
                 определения факс-машины \"printer\"".

   requires { "efax" "fax" }

   # Требуя наличия телефонного номера означает, что помощник добавления
   # принтера будет требовать задания номера телефона во время добавления
   # принтера. Это нежелательно, так что не обязательно требуется, хотя это
   # требуется логически. Скрипт send_exec проверяет наличие номера. Вы
   # должны отказаться от помощника, добавляя принтер вручную в файл
   # .printrc, отмечая это поле как требуемое и оно будет запрошено?
   argument {
      var = "PHONE_NUMBER"
      desc = "Номер телефона"
      help = "Номер телефонного подключения. Префиксы, такие как 9 должны быть
                  определены в вашем файле /etc/efax.rc."
   }

   option {
      var = "RESOLUTION"
      desc = "Разрешение факса"
      default_choice = "high"
      choice "low" {
         value = "-l"
         desc = "Low"
         help = "Низкое разрешение факса, равное 96lpi."
      }
      choice "high" {
         value = ""
         desc = "High"
         help = "Высокое разрешение факса, равное 192lpi."
      }
   }

   # Если вы не хотите указывать номер телефона, то задание не должно
   # работать, и единственный способ определить это, это посмотреть в
   # сообщение об ошибке в начале деталей задания.
   send_exec {
     if [ "x$PHONE_NUMBER" != "x" ]
     then
          fax send $RESOLUTION $PHONE_NUMBER $INPUT
     else
          echo 'Вы должны указать номер телефона!'
          false
     fi
   }

}

13.2 Используя удаленный сервис печати

Существует экспериментальный сервис, который позволит вам послать сообщение по электронной почте в котором находится что-то что вы хотите напечатать, так что содержимое этого письма появится на факс-машине в другом месте. Поддерживаются форматы подобные postscript, так что даже если глобальный охват является неоднородным, то, это все равно может быть очень полезным сервисом. Для более детальной информации о печати через сервис удаленной печати, смотрите Remote Printing WWW Site.

14. Как генерировать что-то стоящее печати

Здесь мы перейдем к реальному программному обеспечению. По существу Linux может запускать много типов исполнимых файлов с разной степенью удачи: Linux/x86, Linux/Alpha, Linux/Sparc, Linux/foo, iBCS, Win16/Win32s (при помощи dosemu и, иногда, с Wine), Mac/68k (через Executor), я Java. Я буду просто обсуждать родное для Linux и общее для Unix программное обеспечение.

Для самого Linux, выбор довольно ограничен теми продуктами доступными в общем для Unix:

14.1 Языки разметки

Большинство языков разметки лучше подходят для больших или повторяющихся проектов, где вы хотите чтобы компьютер контролировал компоновку текста, чтобы сделать ее единой.

nroff

Этот один из первых языков разметки Unix. Справочные страницы -- это наиболее общий пример вещей отформатированных с использованием макросов *roff; много людей "ругаются" на нем, но nroff имеет, по крайней мере для меня, более тайный синтаксис чем необходимо, и вероятно делает бедный выбор для новых работ. Это стоящее знание, хотя вы можете печатать справочные страницы прямо в postscript с помощью groff. Большинство команд man будут делать это для вас с помощью man -t foo | lpr.

TeX

TeX, и макро-пакет LaTeX, это один из наиболее широко применяемых языков разметки в Unix. Технические работы часто написаны в LaTeX, потому-что он сильно упрощает создание компановки и это все еще одна из нескольких систем обработки текста, которая поддерживает математику и хорошо и полностью. Выходной формат TeX это dvi, и он конвертируется в PostScript или Hewlett Packard PCL при помощи dvips или dvilj. Если вы желаете установить TeX или LaTeX, установите всю группу пакетов teTeX; они содержат все необходимое. Недавние версии TeX включают в себя pdfTeX и pdfLaTeX, которые сразу могут создавать файлы Adobe PDF. Доступны команды создания ссылок и возможностей навигации в файле PDF.

SGML

Существует по крайней мере один свободный обработчик (parser) sgml доступный для Unix и Linux; его форма это основа системы документации Linuxdoc-SGML. Он может также поддерживать другие DTD, из которых самым примечательным является DocBook.

HTML

Некоторые люди предполагают, что для отдельных проектов может быть достаточно писать их в HTML и печатать используя Netscape. Я не согласен с этим, но это YMMV.

14.2 Текстовые процессоры с WYSIWYG

В настоящее время больше нет недостатка в WYSIWYG программном обеспечении для обработки текстов. Доступно несколько полных офисных наборов, включая один, который свободен для персонального использования (StarOffice).

StarOffice

Sun Microsystems свободно распространяет по сети StarOffice для Linux. Полный офисный набор имеет все возможности которые вы ожидаете и вы можете не беспокоится об оплате. Существует mini-HOWTO, где описывается как получить и установить этот пакет. Он генерирует на выходе PostScript или PCL, так что он должен работать с большинством принтеров в Linux; это вероятно два равноправных факта!

WordPerfect

Компания Corel свободно распространяет базовую версию Word Perfect 8 для Linux, и предполагается, что компания также будет распространять Corel Draw и Quattro Pro, когда они будут перенесены под linux. Вероятно это наилучший выбор, если у вас ARM машина; Corel делает основанные на ARM компьютеры Netwinder Linux и и почти всегда предлагает ARM Linux версии всех своих продуктов. Вы можете также купить полную версию программ и поддержку этих программ, вместе или по отдельности. Страница Шрифты и принтера для Linux WordPerfect имеет информацию о настройке WordPerfect для использования либо Ghostscript либо его встроенных драйверов принтеров (которые очевидно похожи на драйвера принтеров DOS WordPerfect, в том случае если драйвер вашего принтера не включен в дистрибутив WP8).

Applix

Applix это многоплатформенный оффисный набор (например, разные типы юниксов, Windows и другие платформы), продаваемый фирмой Applix. Red Hat и SuSE продавали их, когда это было лишь "игрой в города"; сейчас продажу опять осуществляет Applix.

AbiWord

AbiWord является одной из нескольких GPL проектов по созданию WYSIWYG текстового процессора; этот проект создал очень хороший текстовый процессор, основанный на формате XML и с возможностями импорта файлов Word. (Но у него пока проблемы с русским языком, в том числе и с импортом русских файлов Word. прим. переводчика).

LyX

LyX это надстройка для LaTeX, которая выглядит очень многообещающей. Смотрите Домашнюю страницу LyX для более детальной информации. Также существует версия LyX сделанная в стиле KDE, она называется Klyx; автор LyX и зачинщик проекта KDE -- это одна и та же персона.

Maxwell

Maxwell это простой текстовый процессор, базирующийся на формате MS RTF, который был начат как коммерческий продукт, но сейчас распространяется под действием лицензии GPL.

The Andrew User Interface System (Система пользовательского интерфейса Andrew)

AUIS включает ez, редактор WYSIWYG-стиля с основными возможностями систем обработки текста, возможностями для работы с HTML и полную поддержку MIME электронной почты и групп новостей. К сожалению AUIS больше не сопровождается.

Koffice

Проект KDE работает в направлении полного набора офисных программ. Я думаю, что он не будет готов в ближайшее время. Текстовый процессор несомненно будет потомком программы LyX.

GNOME

Проект GNOME также работает в направлении создания офисных программ лицензированных по лицензии GNU. Хотя еще ничего не доступно.

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

14.3 Печать фотографий

Существует много деталей для получения нормального вывода фотографий с распространенных принтеров.

Ghostscript и фотографии

Ghostscript имеет некоторые затруднения при рендеринге фотографий на большинстве драйверов. Существует несколько проблем:

У вас должна быть возможность исправления некоторых из этих проблем путем настройки Ghostscript; для получения информации о том как это сделать смотрите раздел о Ghostscript данного документа. Работать с ключами Ghostscript намного легче, если вы объявите их как ключи в объявлении драйвера PDQ.

Было сказано, что очевидным решением будет использование не-Ghostscript программного обеспечения для печати фотографий и в самом деле такие вещи существуют.Главным соперником является модуль печати в Gimp, который поддерживает пиксел-в-пиксел печать на принтерах Epson Stylus и принтерах, поддерживающих Postscript (с базовой поддержкой PPD). Скоро этот драйвер также будет доступен для Ghostcript. Также возможно для этой цели использовать разные внешние программы pnm-в-foo, используемые для печати на таких принтерах, как например дешевые модели Lexmark; они печатают битовые карты пиксел-в-пиксел. Ключ print-via-filter не так сложно добавить в Gimp.

Конечно Наилучшим решением будет покупка принтера, понимающего Postscript; такие принтера обычно могут полностью контролироваться доступным свободным программным обеспечением, и будут использовать все возможности принтера.

Бумага

Цветные струйные принтера сильно зависимы от качества бумаги для получения хорошего качества вывода. Дорогая глянцевая бумага с покрытием, для струйных принтеров позволит вам добиться печати с близким к фотографии качеством, в то время как обычная бумага станет причиной тусклых красок и неясных деталей. Не-глянцевая бумага с покрытием позволит вам получить вывод среднего качества и вероятно лучше всего подходит для печати текста. Негибкая глянцевая бумага с покрытием позволит получить результат, сходный с более легкой глянцевой бумагой, но будет выглядеть как обычная фотография.

Настройка принтера

Для вывода с фото-качеством на большинство цветных струйных принтеров, вы должны использовать высоко-строчный (и самый медленный) режим печати; иначе сплошные области могут иметь полосы или плохие цвета. При работе с Ghostscript это можно сделать, выбрав самое большое разрешение. На Postscript-принтерах, вам может быть будет нужно добавить код в пролог базирующийся на настройках доступных в файле PPD. Поддержка PPD в Gimp не включает в себя настройку качества печати, но я добавил ее сам для моего личного использования; если вы хотите сделать то же самое, то свяжитесь со мной. Если вы используете PDQ, то вы можете легко добавить все настройки принтера, в которых в нуждаетесь в файл объявления драйвера; для принтеров понимающих PJL это достаточно легко, а для Postscript-принтеров может помочь моя утилита ppdtopdq.

Долговечность печати

Результат печати на цветных струйных принтерах теряет четкость всего после нескольких лет, особенно если подвергается длительному воздействию света и воздуха; это происходит и-за чернил. Для принтеров у которых расходными материалами являются только чернила, таких как принтера Epson и Canon, можно купить архивные чернила, которые в меньшей степени подвержены данной проблеме.

Условно-свободное и коммерческое программное обеспечение

Существует программа, названная xwtools, которая поддерживает фото-печать со всеми звоночками и свистелками на ряде принтеров Epson, HP и Canon. К сожалению она была написана под действием NDA, так что поставляется без исходных текстов. За исключением ее использования для Epson Stylus Color 300 на Linux x86, она стоит 15 евро для персонального использования; коммерческая цена неизвестна.

Пакет ESP Print Pro компании Easy Software поддерживает много принтеров, которые иначе не поддерживаются. К сожалению поскольку этот пакет базируется на Ghostscript 4.03, я не ожидаю от него хороших результатов при печати фотографий. Но кто-нибудь должен попробовать.

15. Экранный просмотр файлов для печати

Почти все что вы можете напечатать вы также можете просмотреть на экране.

15.1 PostScript

Ghostscript имеет драйвер для X11, который лучше всего используется под управлением просмотрщика PostScript, называемого Ghostview. Последние версии этих программ также должны уметь просматривать файлы PDF. Заметим, что gv заменил более старый просмотрщик "Ghostview"; новый интерфейс пользователя более приятный и функциональный чем линейный интерфейс ghostview на основе старого Athena gui.

15.2 TeX dvi

Независящие от устройства (DeVice Independant) файлы TeX могут быть просмотрены под X11 с помощью xdvi. Современные версии xdvi вызывают ghostscript для обработки специальных вставок PostScript.

Также существует драйвер VT100. Он называется dgvt. Tmview работает с Linux и svgalib, если надо вы можете работать с ним.

15.3 Adobe PDF

Adobe Acrobat Reader доступен для Linux; просто загрузите его с сервера фирмы http://www.adobe.com/.

Вы также можете использовать xpdf, который является freeware и идет с исходными текстами, и я думаю сейчас Ghostview поддерживает просмотр файлов PDF при помощи gs под X11.

16. Последовательные принтера под управлением lpd

Последовательные принтера редко используются с lpd.

16.1 Настройка printcap

Lpd обеспечивает пять атрибутов, которые вы можете установить в /etc/printcap для контроля всех установок принтера на последовательном порту. Читайте справочную страницу printcap и отметьте значение атрибутов br#, fc#, xc#, fs# and xs#. Последние четыре из этих атрибутов являются битовыми картами показывающими установки для использования портом. Атрибут br# это просто скорость передачи в бодах, например `br#9600'.

Очень легко переводить из установок stty в установки флагов printcap. Если вам необходимо, то смотрите справочную страницу stty.

Используйте stty для настройки порта принтера, так что вы сможете выполнить копирование файла на него и получить правильно напечатанный файл. Здесь приводятся данные того, что `stty -a' показывает для моего принтерного порта.

dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase
-tostop -echoprt -echoctl -echoke

Разница между этим и тем способом которым порт инициализируется при загрузке во флагах -clocal, -crtscts, and ixon. Настройки вашего порта могут отличаться в зависимости от того как ваш принтер делает контроль потока.

В действительности вы используете stty странным способом. Так stty работает с терминалами, подключенными к его стандартному вводу, вы используете его для манипуляций с заданным последовательным портом используя символ `<' как показано выше.

После того как вы правильно установили настройки stty, так что `cat file > /dev/ttyS2' (в моем случае) посылает файл на принтер, посмотрите в файл /usr/src/linux/include/asm-i386/termbits.h. Этот файл содержит некоторое количество #defines и несколько структур (вы можете захотеть напечатать этот файл на принтере (он у вас работает, не так ли?) и использовать его как черновик). Перейдите в раздел который начинается с:

/* c_cflag bit meaning */
#define CBAUD   0000017

Этот раздел перечисляет значение битов fc# и fs#. Вы будете уведомлены, что имена здесь (после скорости передачи) соответствуют одной из строк вывода stty. Не я ли сказал что все будет легко?

Заметим какая из этих настроек начинается с a -- в вашем выводе stty. Просуммируем все эти числа (они в восьмеричном представлении). Это представляет собой биты которые вы хотите очистить, так что результатом будет ваше свойство fc#. Конечно помните что вы будете устанавливать биты прямо после очистки, так что вы можете просто использовать `fc#0177777' (я так делаю).

Теперь сделаем это для тех установок (перечисленных в этом разделе) которые не имеют a в начале -- в вашем выводе stty. В моем примере самые важные это CS8 (0000060), HUPCL (0002000), и CREAD (0000200). также заметим флаги для вашей скорости передачи (мои равны 0000015). Сложим их все, и в моем примере получим 0002275. Это идет как ваше свойство fs# (`fs#02275' великолепно работает в моем примере).

Сделайте тоже самое с установкой и очисткой для следующего раздела включаемого файла, "c_lflag bits". В моем случае я не устанавливал ничего, так что я просто использовал `xc#0157777' и `xs#0'.

16.2 Старые последовательные принтера и потеря символов

Jon Luckey указал, что некоторые старые последовательные принтера с десятицентовым последовательным интерфейсом и маленькими буферами действительно останавливаются когда используется контроль потока. Он нашел, что запрещение FIFO для последовательного порта 16550 его Linux-машины с помощью setserial исправило проблему потерянных символов (вы по всей видимости можете просто указать тип uart как 8250 чтобы сделать это).

17. Credits

Специальная благодарность Jacob Langford, автору pdq, кто дал нам нечто лучшее, чем небольшое число скриптов, сгруппированных вокруг программы контроля линейной печати.

Информация о smbprint из статьи Marcel Roelofs <[email protected]>.

Информация о nprint для использования принтеров Netware была дана Michael Smith <[email protected]>.

Раздел о последовательных принтерах под lpd от Andrew Tefft <[email protected]>.

Данные о гаммах и прочих вещах для gs были посланы Andreas <[email protected]>.

Два параграфа о о 30-ти секундной задержке (closing_wait) последовательного драйвера были присланы Cris Johnson <[email protected]>.

Robert Hart послал несколько великолепных параграфов об установке сервера печати на сетевых принтерах HP, которые я использовал без изменений.

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