# Немного теории: &CUPS;, IPP, &PostScript; и Ghostscript

Цель этой главы - введение в основы печати в целом и особенно в &CUPS;. Если вам это не нужно, то имеет смысл пропустить эту главу и сразу перейти к следующей. Вероятность того, что вы вернётесь обратно к этой главе, всё-таки существует, потому что иногда без дополнительных знаний не получается решить практическую проблему.

## Основы печати

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

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

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

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

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

Одним из этих достижений явился &PostScript;, созданный Adobe. Это означало, что программист мог сосредоточить усилия на написании программы, генерирующей языковое описание &PostScript; страницы, отправляемой на печать этой программой, в то время как разработчики устройств могли уже создавать устройства, понимающие &PostScript;.

Конечно, со временем появились и другие методы описания. Самыеважные соперники &PostScript; - это PCL (язык управления печатью), созданный &Hewlett-Packard;, ESC/P от Epson и GDI, графический интерфейс устройств от &Microsoft;.

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

### &PostScript; в памяти - битовый рисунок на бумаге

&PostScript; больше всего используется в профессиональной печатной среде, такой как PrePress и др. В &UNIX; и &Linux; &PostScript; - преобладающий стандарт PDL. Почти каждая программа генерирует &PostScript;-образ страниц, когда вы нажимаете кнопку Печать. Давайте взглянем на простой пример (самодельного) кода &PostScript;. Ниже приведены описания двух простых рисунков.

#### Код &PostScript;

    %!PS
    100 100 moveto
    0 50 rlineto
    50 0 rlineto
    0 -50 rlineto
    closepath
    .7 setgray fill
    % first box over; next
    160 100 moveto
    0 60 rlineto
    45 10 rlineto
    0 -40 rlineto
    closepath
    .2 setgray fill

Это команды, управляющие воображаемым &PostScript;-пером: провести линию определенной формы и заполнить фигуру разными оттенками серого. Первая часть переводится в на более понятный язык так: Перейти к координате (100,100), нарисовать линию вверх, длиной 50, затем оттуда направо, потом вниз, и закрыть оставшуюся часть. Теперь заполнить нарисованную фигуру 70% серым цветом.

#### Отрисованный &PostScript;

рисунок данного примера

Конечно, &PostScript; намного сложнее, чем этот простенький пример. Это развитой язык со множеством операторов и функций. Вы можете даже заставить программы на &PostScript; сосчитать число пи, отформатировать жесткий диск или сделать запись в файл. Однако главная ценность и сила &PostScript; - это описание расположения графических объектов на странице. Он также может масштабировать, зеркально отразить, перевести, трансформировать, повернуть и исказить всё что вы можете себе представить на кусочке бумаги - символы разных шрифтов, фигуры, контуры, тени, цвета, линии, точки, растровые изображения...

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

### Растровые изображения на бумаге

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

Разные принтеры создают разные растровые рисунки. Если говорить про струйные принтеры, то, в зависимости от разрешения, количества используемых чернил (а хорошим принтерам надо семь разных цветов чернил, в то время как более дешевые обходятся только тремя), количества доступных форсунок (на некоторых головках их может быть более 100!), распыляющих чернила одновременно, алгоритма размытия и многих других факторов, конкретный формат растра и порядок передачи на картридж очень сильно зависит от конкретной модели используемого принтера.

Во времена LPD принтеры были аппаратами, которые отбивали ряды ASCII текста на длинной бумажной ленте, сложенной в зигзагообразную змею, которую принтер вытягивал из коробки под столом. Как все изменилось!

### RIP: от &PostScript; к растру

Перед тем, как окончательные растровые изображения лягут на бумагу, они высчитываются из абстрактного представления &PostScript;. Этот процесс требует значительных компьютерных вычислений и называется растрированием, Raster Imaging Process, или RIP.

При работе с &PostScript;-принтерами растрирование осуществляется самим устройством. Вы просто посылаете ему файл, а RIP-процессор принтера отвечает за правильное преобразование &PostScript;-описаний страниц и нанесение их растровых изображений на бумагу.

Небольшие &PostScript;-устройства имеют встроенный RIP-процессор, выполненный на специальном чипе. Часто в больших профессиональных принтерах есть RIP, реализованный программно внутри быстрой машины на основе Unix, обычно это машины на базе Sun SPARC Solaris или &SGI; &IRIX;.

### Ghostscript как программный эмулятор RIP

Но что будет, если у вас нет &PostScript;-принтера?

Перед тем как посылать данные на печатающее устройство, вам надо будет сделать растрирование самим. При этом надо будет преобразовать &PostScript;, сгенерированный вашей программой, в формат растра принтера. Для этого надо знать точный формат растра принтера, на котором вы собираетесь печатать.

Другими словами, вы не можете положиться на принтер в преобразовании &PostScript;, и обработка становится более сложной. Для решения этой задачи вам нужно иметь программное обеспечение.

Именно этим и занимается пакет &ghostscript;, который присутствует на всех машинах с &Linux;, *BSD и другими &UNIX;, которые должны печатать на принтеры, не поддерживающие &PostScript;: &ghostscript; - это интерпретатор &PostScript;, программный RIP-эмулятор, способный осуществлять преобразование для различных устройств.

### О драйверах и фильтрах

Для создания растровых рисунков из &PostScript; &ghostscript; использует так называемые фильтры. Таких фильтров существует уже довольно много, причём некоторые из них cпециально сделаны для конкретных моделей принтеров.Фильтр, специализирующийся на конкретном устройстве, часто развивался безсогласия или поддержки изготовителя. Не имея доступа к техническимтребованиям и документации, это было сделать довольно сложно, требовалось заново воспроизвести протоколы и форматы данных.

Не все фильтры &ghostscript; работают одинаково хорошо для своих принтеров. Всё же некоторые из более новых, подобно фильтру stp из проекта печати Gimp, дают превосходные результаты, приводящие к фотографическому качеству на одном уровне или даже лучшему, чем их аналоги - драйверы . &Windows; &Microsoft;

&PostScript; - это вывод большинства прикладных программ для печати в &UNIX; и &Linux;. Фильтры-это настоящие рабочие лошадки в любой системе печати. По существу они создают правильные растровые рисунки из любого ввода для не-&PostScript; принтеров и других устройств.

### Драйверы, фильтры и движки в CUPS

&CUPS; использует собственные фильтры, хотя они в целом основаны на ghostscript. Именно, фильтры pstoraster и imagetoraster прямо опираются на код из ghostscript. Все части этого старого кода в &CUPS; были реорганизованы в стройную систему модулей.

Следующий рисунок (сделанный при помощи &kivio;) дает общий обзор фильтров и движков в &CUPS;. Пройдёмся по нему снизу вверх. Движки - это особые фильтры, они не преобразуют данные в другие форматы, а посылают готовые файлы на принтер. Для разных низкоуровневых протоколов существуют соответственно разные движки.

Диалог &kprinter; (рисунок &kivio;)
Диалог &kprinter; (рисунок &kivio;)

### Спулеры и демоны печати

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

Этот демон следит за порядком: он также контролирует исполнение заданий: даёт право пользователям отменить, остановить, перезапустить свои задания (но не задания других пользователей) и так далее.

## Как CUPS использует мощь файлов &PPD;

Теперь, когда вы знаете как язык &PostScript; (который описывает вёрстку страниц независимым от конечного устройства способом) преобразуется в растровый рисунок, вы можете спросить: Устройства растрового вывода могут очень сильно отличаться друг от друга: бумага бывает разных размеров, есть много украшений печати - заголовки, двусторонняя печать, поля и пр. Как это подходит к вашей модели принтеро-независимого &PostScript;?

Ответ идет вместе с так называемым файлом &PostScript; PrinterDescription (&PPD;). Файл &PPD; описывает все возможности, зависящие от устройства, которые могут использоваться определенной моделью принтера. Он также содержит кодированные команды, которые должны быть использованы для вызова конкретных возможностей аппарата. Но &PPD; - не тайные книги, это простые текстовые файлы.

&PPD; были придуманы фирмой Adobe для того, чтобы производителям было легче реализовывать свои собственные возможности &PostScript;-принтеров, и в то же время придерживаться стандартных путей их создания. Формат &PPD; очень хорошо документирован и описан фирмой Adobe. Их спецификация фактически является открытым стандартом.

### Возможности печати, зависящие от устройств

Вспомним, что расширенная печать &PostScript; была первоначально разработана для использования только на системах &Microsoft; &Windows; и Apple &Mac;. В течение длительного времени все возможности расширенной печати на современных принтерах были в принципе недоступны для &Linux; и &UNIX;. Использование &CUPS; всё изменило. &CUPS; связан с &PPD;, и поэтому существующие &PPD; могут быть приспособлены для всех систем, работающих при помощи &CUPS;.

Используя &PPD;, изготовители принтеров имели возможность вставить в свою продукцию такие аппаратно-зависимые возможности, как дуплексную печать, брошюрование, поля и т. д. Драйверы подгружают этот файл &PPD; просто как дополнительный конфигурационный файл. Таким образом, драйвер принтера узнаёт про доступные возможности устройства, и знает, как их вызывать. Драйвер также предоставляет их пользователю в графическом интерфейсе. Этот метод позволяет печатать аппаратно-независимые &PostScript;-файлы и указывать возможности, доступные конкретному устройству при выводе на печать.

### Где взять файлы &PPD; для &PostScript;-принтеров

&PPD; первоначально не предполагались к использованию в &UNIX; и &Linux;-системах. Сами разработчики и не предполагали, что они будут использоваться в других системах, кроме как в системах, для которых они были разработаны: &Microsoft; &Windows; и &MacOS;. Но благодаря блестящему решению по полной поддержке существующей спецификации &PPD; &CUPS; сейчас позволяет пользователям &Linux; и других &Linux;-подобных систем использовать все возможности современных принтеров. Система печати KDE делает это использование даже более удобным, чем предполагали сами разработчики &CUPS;.

&CUPS; может использовать родные &PPD; для &Windows;, прилагаемые при покупке &PostScript;-принтеров. Обычно за это платить не надо, и они (&PPD;) могут быть переписаны из любого компьютера с Windows, с предустановленным &PostScript; драйвером для конкретной модели принтера, или с диска, который поставляется с принтером. Также есть несколько мест в Интернете, откуда их можно скачать.

### Почему эти &PPD; полезны даже для не &PostScript;-принтеров.

Теперь вы знаете, как &PostScript;-принтеры могут использовать &PPD;. Но как обстоит дело с не &PostScript;-принтерами? В &CUPS; есть такая особенность: используя тот же формат и структуру данных как в &PPD; в сфере &PostScript;, она может описывать доступные опции заданий печати и для не -&PostScript; принтеров. Для собственных целей добавлено несколько специальных опций (а именно строка, определяющая фильтр, который нужно использовать для дальнейшей обработки &PostScript;-файла).

Поэтому разработчики могли использовать те же программные решения для обработки файлов PPD для всех моделей принтеров. Конечно, авторы &CUPS; не могли полагаться на то, что все производители не &PostScript;-принтеров вдруг выпустят файлы &PPD;. Им пришлось проделать огромную работу по написанию многих из этих файлов с нуля. Более тысячи таких файлов доступны в коммерческой версии &CUPS;, называемой ESP PrintPro.

Так или иначе, есть много специально сделанных для &CUPS; файлов &PPD;. Даже сейчас большинство этих файлов идёт не от производителей принтеров, а от разработчиков свободного программного обеспечения. &CUPS; проложила дорогу, и по ней пошли: если пару лет назад печать в &Linux; и &UNIX; была камнем преткновения, то теперь поддерживается широкий диапазон принтеров, включая 7-цветные струйники для высококачественной фотопечати.

### Разные способы получить &PPD; для не &PostScript; принтеров.

Вы можете найти &PPD; для работы с &CUPS; и не &PostScript; принтерами в Интернете:

- Во-первых, зайдите на www.linuxprinting.org, где прямо в онлайне вы сможете сгенерировать &PPD; для любого принтера, поддерживаемого &ghostscript;. Тем самым вы сможете перейти на &CUPS; с минимальными усилиями. Если ваш принтер и так уже хорошо работал с печатью из &ghostscript;, то вы сможете подключить этот драйвер к &CUPS; и взять лучшее из обеих систем.

- во-вторых, существуют &CUPS; &PPD; более чем для 120 моделей принтеров, которыми может управлять новый универсальный драйвер stp. (происходит от Stylus Photo). Он сейчас разрабатывается проектом gimp-печати, его основал Майк Свит, ведущий разработчик &CUPS;. Сейчас он доступен на gimp-print.sourceforge.net. Этот драйвер создает полноценное фотокачество на многих современных струйных принтерах, и может быть сконфигурирован на создание 120 &CUPS;-&PPD; при компиляции. Поддерживаются модели &HP; Laser- и DeskJet, Epson Stylus и Photo Color, а также Canon и Lexmark.

- в третьих, есть и коммерческая версия &CUPS; от авторов &CUPS;: ESP PrintPro - вместе более чем с 2.300 драйверами принтеров. В неё входят и улучшенные фильтры imagetoraster и pstoraster.

&CUPS; позволяет производителям легко и недорого поддерживать их принтеры в &Linux; и &UNIX;. Модульная структура &CUPS; позволяет просто подключать дополнительный фильтры и использовать всю мощь &CUPS;.

Подробнее о всех возможностях &CUPS; можно прочитать в документации &CUPS; на http://www.cups.org/documentation.html и http://www.danka.de/printpro/faq.html. Страницы http://www.linuxprinting.org/ - это универсальный ключ ко всем вопросам печати в &Linux; и &UNIX;.

## Как поддержка &IPP; делает &CUPS; лучшим выбором из всех доступных?

### LPD Must Die!

В течение долгого времени у разработчиков копилось неудовольствие на старый добрый LPD. Поэтому, чтобы его улучшить, возникло несколько новых проектов, среди которых самую большую известность завоевал LPRng. Из прочих стоит отметить PDQ, PPR, PLP, GNUlpr и RLPR. Но ни один из этих проектов не смог добиться чего-то заметного; большинство их воплощали возможности того же LPD с некоторыми расширениями, и все они были несовместимы друг с другом.

Пресытившись развитием этих отголосков почтенного BSD-шного LPD, Грант Тэйлор, автор Linux Printing HOWTO, в конце концов воскликнул: LPD Must Die! в своей кампании по искоренению LPD.

### Как возник &IPP;

Со стороны компаний также предпринимались попытки преодолеть хорошо известные слабости LPD. Начали возникать расширения LPD, и дело дошло до того, что &Hewlett-Packard; попытался придать своему детищу &HP; JetDirect статус нового стандарта протокола печати. Результатом явились новые несовместимости.

В конце концов обрела форму инициатива определения нового стандарта, общего для промышленности и IETF. Рабочая группа по печати, включившая в себя представителей производителей оборудования, поставщиков программного обеспечения и операционных систем, подготовила проект Internet Printing Protocol, &IPP;. &IPP; версии 1.1 теперь утвержден как стандарт IETF и пользуется единодушной поддержкой компаний Европы, США и Японии. Большинство современных моделей принтеров имеют встроенную поддержку &IPP; в добавление к обычным протоколам печати LPR/LPD или JetDirect.

### Почему &IPP; позволяет решить много проблем?

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

Создавая единый набор запросов передачи файлов и управления заданиями печати для принтеров и серверов, поддерживающих &IPP;, &IPP; является кроссплатформенным протоколом для всех ОС. Его внедрение, конечно, потребует времени, так как всё ещё в работе остаётся много старых принтеров. Поэтому в &IPP; предусмотрена обратная совместимость со всеми реализациями &IPP;. &CUPS; обеспечивает удобство печати по &IPP; во всех средах.

Особенно впечатляет его интеграция с другими проверенными протоколами IP. Будучи фактически расширением протокола HTTP 1.1 применительно к задачам печати, он очень легко встраивается в другие ныне развиваемые стандарты:

- Аутентификация типа Basic, Digest и на основе сертификатов для пользователей сервисов печати.

- Шифрование SSL3 и TLS для отправки данных.

- Двунаправленное сообщение клиентов с устройствами печати с помощью запросов HTTP/&IPP; `GET` и `POST`.

- Сервис каталогов LDAP для поддержания единой базы данных доступных принтеров, их возможностей и стоимости печати, а также доступа по паролю или по спискам доступа и т. д.

- Печать по способу Pull (в отличие от обычного - Push), когда серверу или принтеру нужно лишь сообщить ссылку &URL; на документ, после чего тот автоматически скачивается из сети и печатается.

### Доступ клиентов к принтерам - Plug'n'Play

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

Допустим, что вы, сисадмин, поставили и настроили машину у себя в сети с &kde; и &CUPS;, прицепив на неё дюжину принтеров и настроив их: &PostScript;, лазерных, струйных и прочих. Пользователи &kde; на этой машине очень довольны, они могут печатать в своё удовольствие, выжимая всё возможное из каждого принтера. Вы потратили два часа на настройку, чтобы всё заработало... и осталось ещё удовлетворить сотню прочих пользователей вашей сети. По два часа на машину? И так до следующего Нового года?

Нет. Отметьте один флажок в настройках машины с &CUPS;, чтобы она работала как сервер. Установите &CUPS; на всех остальных машинах как клиентов. К тому времени, когда вы вернётесь к первой машине, пользователи уже будут играть с настройками вашей дюжины принтеров на сервере. Все эти принтеры волшебным образом стали доступны клиентам на всех машинах.

Пользователи печатают, и при этом ни на одной машине не пришлось устанавливать драйверы и настраивать очереди печати.

Как же всё это так хорошо работает?

### Почему видны принтеры, не установленные локально?

Ответ совсем простой.

Сервер &CUPS; отправляет в сеть широковещательные извещения имен всех доступных принтеров по протоколу UDP на 631 порт. Порт 631 включен в число портов, зарезервированных IANA (Internet Assigning Numbers Authority) для &IPP;. Все клиенты &CUPS; слушают сеть на 631 порту, поэтому они узнают о доступных принтерах и путях к этим принтерам.

Используя &IPP;, по сути - расширение HTTP версии 1.1, &CUPS; способна находить все объекты системы печати по их адресам - Universal Resource Locators или URL. Задания печати можно удалять или перезапускать, можно опрашивать принтеры, выполнять административные задачи на сервере. С помощью &IPP; &CUPS; обращается ко всем объектам по их адресам URL. Очень многое в &CUPS; доступно через веб-интерфейс, например, через &konqueror;.

### Печать без установки драйвера

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

Клиенты могут печатать, даже если нужный принтер или драйвер не установлены локально.

Как это возможно? Если клиент хочет использовать опции, специфичные для данного принтера, он отправляет запрос `CUPS-get-ppd` на сервер. Сервер возвращает все сведения о данном принтере, прочитанные из &PPD;-файла, хранящегося на сервере. Пользователь видит эти опции и выбирает нужные ему. Затем он отправляет файл для печати, как правило, это сырой &PostScript;, приправленный специфичными опциями данного принтера. При этом используется &IPP; как транспортный протокол. Вся дальнейшая обработка, в особенности фильтрование для подготовки файла в формате принтера, осуществляется сервером. Все необходимые программы для этого - драйверы и фильтры - на сервере имеются.

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

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

### Нулевое администрирование, перераспределение нагрузки и переключение при отказе

Среди дополнительных возможностей &CUPS; стоит отметить способность перераспределения нагрузки.

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