Некоторые аспекты русификации принтеров

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

Формирование изображения на бумаге

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

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

Вот так выглядит буква "A" для 9-игольчатого матричного принтера Star-NX1500. Как видно, матрица символа имеет размер 6x9 ячеек, при этом точки могут быть расположены не только внутри ячеек, но и между ними. Высота матрицы совпадает с количеством игл принтера, что позволяет печатать одну строку символов за один проход печатающей головки. Соответственно, для 24-игольчатых принтеров матрица имеет высоту в 24 ячейки, что позволяет улучшить изображение символов.

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

Каждому символу, хранящемуся в ПЗУ принтера, присвоен уникальный номер или, иначе говоря, код. Например, латинской букве "A" соответствует код 65. Для печати символа прикладной программе необходимо послать на принтер нужный код. Совокупность символов и их кодов образует таблицу символов или кодовую таблицу. Принтер выбирает из таблицы символов его описание (матрицу) и генерирует изображение на бумаге.

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

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

Способы русификации принтеров

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

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

Для каждой страны и каждого языка существует своя кодовая таблица, для некоторых языков даже несколько таблиц, в которых одни и те символы кодируются по разному, а одним и тем же кодам соответствуют разные буквы. Ситуация усугубляется различием кодировок в разных операционных системах. В русской версии MS-DOS используется кодовая таблица (code page, CP) с номером 866, а в русифицированной системе Windows — таблица 1251. В системе Unix и в компьютерах Macintosh — свои кодировки. Лучшее, что можно обещать, это что коды латинских букв будут одинаковы везде.

Русификация принтера означает, что принтер имеет "прошитые" русские буквы, которые программа не должна "рисовать" сама, и что встроенная в принтер кодовая таблица совпадает с таблицей компьютера. Таким образом, для нормальной печати русских текстов из MS-DOS принтер должен быть русифицирован согласно CP866, а для печати из Windows — согласно CP1251.

До недавнего времени принтеры русифицировались только для использования в MS-DOS, но в последнее время все больше принтеров, поддерживающих и кодировку русской версии Windows, и даже русскую кодировку системы Unix — KOI8-R. Тем не менее, печать из Windows обычно происходит в графическом режиме, поэтому русификация принтера для Windows-программ не является необходимой.

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

Аппаратно русифицированный принтер

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

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

Русифицированный в другой кодировке

Все еще попадаются принтеры, имеющие "прошитые" русские шрифты, но кодировка которых отличается от CP866. В среде MS-DOS такой принтер можно использовать, если достать или написать самому простой резидентный перекодировщик. В частности, таким образом можно печатать на многих АЦПУ, изначально не рассчитанных на подключение к персональным компьютерам.

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

Принтер позволяет загрузить шрифты в специальный буфер

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

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

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

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

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

Нерусифицированный без возможности загрузки шрифтов

Если принтер нерусифицирован аппаратно и не имеет буфера для загрузки русских шрифтов, то он никаким образом не позволит печатать по-русски кодами. Единственный вариант печати на таком принтере — в графическом режиме. А нерусифицированное АЦПУ можно просто выбросить (если у вас нет барабана с русскими буквами).

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

Для Windows этот вариант ничего необычного не представляет - как вы помните, Windows все равно обычно печатает в графике. Здесь необходимо отметить, что за последние несколько лет появилось множество моделей принтеров, ориентированных именно на печать из Windows и только из Windows. Обычно они называются Windows-принтерами или GDI-принтерами. Многие из них не позволяют печатать в кодах вообще. Поэтому вывести что либо на такой принтер из "чистого" DOS невозможно, а из DOS-сеанса Windows — хоть иногда и получается, но результат не всегда соответствует ожиданиям.

Дополнительные требования к принтерам



Грамотная русификация подразумевает не только сам факт наличия у принтера русских шрифтов в нужной кодировке, но также поддержку нескольких стандартных размеров и вариантов начертаний шрифта. Кроме того, хотя это уже не относится к собственно русификации, принтер должен обеспечивать ряд режимов, ставших стандартом de-facto. Ниже в таблице сведены основные требования, которым должен соответствовать правильно русифицированный принтер, а рисунок рядом показывает стандартные типы шрифтов, взятые из "Руководства по эксплуатации принтера Epson-NX1500".

Обозначения: А — АЦПУ, М — матричный принтер, С - струйный принтер, Л — лазерный принтер, + — должно присутствовать, — неприменимо, О — необязательно, но желательно.

ПараметрЗначениеАМСЛ
Длина листа, дюймов11, 12++++
Число строк на дюйм,  (LPI)6, 8++++
Число строк на страницеНе менее 66 для режима 6LPI, не менее 88 для режима 8LPI++++
Ширина символов (символов на дюйм, CPI)10, 12, 17, 20-+++
Число символов размером 10CPI в строке 80 для "узких" (A4) принтеров, 136 для "широких" (A3) принтеров++++
Управление отступом и полями
С помощью символов табуляции++++
Точным позиционированиемO+++
Дополнительные возможности
Черновой и чистовой режимы-ООО
Печать в альбомном режиме (поперек страницы)-ОО+
Пропуск перфорации (линии отрыва)++О-
  • Число строк на странице приведено для листа высотой 11 дюймов, для листа в 12 дюймов эти значения выше, однако большинство программ для MS-DOS рассчитаны на приведенные значения независимо от высоты листа.
  • Число символов в строке широких принтеров заметно меньше за счет припуска на перфорацию и механизм подачи. Но современные принтеры позволяют даже на перфорированной бумаге получить в строке до 156 символов размером 10CPI, и полновесные 160 символов на бумаге без перфорации.
  • Если принтер позволяет печатать на рулонной/перфорированной бумаге, то он может делать пропуск линии отрыва. Чем меньше этот интервал, тем больше строк принтер может распечатать. Это значение обычно составляет 0.7-1 дюйм на страницу (верний и нижний отступы), то есть приводит к потере до 6 строк в режиме 6LPI.
  • Многие лазерные принтеры требуют дополнительного отступа от края листа, обычно до 0,5 см с каждой стороны, что сокращает число символов в строке и число строк на листе.

Печать из Windows

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

Для проверки того, как Windows печатает в кодах, нужно установить драйвер матричного принтера и сделать его текущим. После этого, запустив текстовый редактор, скажем MS Word, можно заметить, что в списке шрифтов появились неизвестные шрифты, типа Courier10, Roman12 или Draft20, помеченные слева специальным значком в виде принтера. То есть Word, а точнее Windows, знает о существовании "прошитых" в принтер шрифтов, об их начертании и размере.

Однако система и понятия не имеет, что принтер может быть русифицирован. Наберите текст русскими буквами и отформатируйте его "встроенным" шрифтом — вы увидите привычные глазу греческие буквы. Но это еще не самое страшное. В конце концов нам на эти буквы не смотреть надо, а печатать, а коды-то у них наши, русские. Как бы не так! Windows выводит текст, и при этом весьма быстро, используя кодировку Windows — 1251, а принтеры обычно русифицируются в кодировке 866, поэтому хотя на бумаге и будут русские буквы, но ничего членораздельного прочесть не удастся.

Этот факт подтверждает, что:

  • система Windows так и не была русифицирована до конца и по отношению к российским пользователям допущена существенная дискриминация;
  • аппаратная русификация принтера в DOS-кодировке ничего не дает пользователю Windows.

Исходя из сказанного, при печати из Windows можно забыть об использовании встроенных русских шрифтов вашего старенького матричного принтера. Никогда не форматируйте текст "прошитыми" шрифтами, если вы используете матричный принтер — вместо текста будет напечатана абракадабра. Используйте шрифты TrueType, которые печатаются в графике. Так хоть и дольше, зато по-русски.

Так как разработчики Windows отказались от использования DOS-русифицированных принтеров, то создателям принтеров приходится теперь обеспечивать русификацию своей продукции не только в кодировке CP866, но и в CP1251. На сегодняшний момент существует уже множество моделей принтеров, аппаратно русифицированных для печати в кодах именно из Windows. К сожалению, я не обладаю опытом использования такого принтера, поэтому ничего конкретного сказать не могу. Вероятно, матричные принтеры, русифицированные специально для Windows, позволяют печатать так же быстро, как это было в DOS.

Я послал запрос в российские представительства фирм HP, Epson, Canon, Citizen и Lexmark с просьбой выслать список русифицированных моделей принтеров и способы их русификации. Ниже приведены полученные ответы.

Lexmark

  • Все лазерные принтеры и сетевые струйные принтеры русифицированы аппаратно.
  • Струйные принтеры серии Z являются Windows-принтерами и из чистого DOS не печатают (но печатают по-русски из DOS-окна Windows).
  • Поддерживают CP866, CP1251, а также украинские и латвийские кодовые страницы.

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

Hewlett Packard

  • Модели лазерных принтеров 2100, 4000, 4050, 5000, 8000, 8100 имеют аппаратную русификацию. В этих принтерах имеются различные масштабируемые русские шрифты всех кодировок (DOS CP866, WIN1251, KOI8-R), по умолчанию выбран моноширинный шрифт Courier, 10 символов на дюйм.
  • Принтеры 6L, 1100 русифицируются программно (специальная программа помещает масштабируемый шрифт Courier в оперативную память принтера).
  • Серии струйных принтеров: 8XX (кроме 820), 2X00, 670, 69X русифицированы аппаратно. Доступные гарнитуры и размеры для каждого принтера приведены в руководстве пользователя. Серия 7X0, 820 из DOS не печатают. Для этих моделей существует возможность печатать из DOS-сеанса в Windows 95, 98.
  • Принтер DeskJet 610C по-русски из DOS не печатает.

Игорь Шабанов, инженер центра технической поддержки HP

Tally

  • Принтеры фирмы Tally имеют аппаратную русификацию как в CP866, так и в CP1251.

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

Немного о системах команд

Так как АЦПУ имеют символы только одного начертания, для них актуальна лишь проблема соответствия кодовых таблиц принтера и компьютера. Никакой системы команд у АЦПУ нет. Более "продвинутые" принтеры, которые умеют печатать несколькими шрифтами, позволяют это делать посредством специальных команд.

На сегодня существует три наиболее распространенных системы команд принтеров: фирм Epson, IBM и HP.

Система команд фирмы Epson

Эта система команд называется ESC/P или, в расширенном варианте, ESC/P2. Другие фирмы, например Canon, называют ее LQ. Ее поддерживают все принтеры Epson, даже лазерные (по крайней мере старые модели), и многие модели других фирм, прежде всего матричные и струйные. Эта система команд является стандартом де-факто для DOS-программ.

Система команд фирмы IBM

Эта система команд называется IBM Proprinter, она же X24 (с вариациями), она же BJ. Ее поддерживают матричные принтеры IBM/Lexmark и многие модели других фирм, прежде всего матричные и струйные, в частности, Canon. Эта система команд во многом совпадает с системой ESC/P.

Система команд фирмы Hewlett Packard

Эта система команд называется PCL (Printer Control Language), сейчас используются версии PCL3 (для струйных принтеров) и PCL5/PCL6 для лазерных принтеров . Язык PCL поддерживают практически все лазерные принтеры любых производителей, а также многие струйные принтеры.

Несколько рекомендаций пользователям

Позволю себе дать несколько советов.

Если вы планируете работать с DOS-программами, подойдите к выбору принтера со всей ответственностью, поинтересуйтесь у производителя программы, с какими принтерами его программа работает лучше всего, узнайте типичное количество строк в странице и символов в строке в выходных документах. В общем случае, идеальным вариантом будет аппаратно русифицированный принтер в кодировке 866 и системе команд Epson/IBM. Проверьте наличие шрифтов всех стандартных размеров, максимальное число строк на странице и минимальные отступы от края листа.

Не выбрасывайте имеющееся у вас АЦПУ, если к нему можно достать расходники и запчасти. Это дешевое и надежное средство печати огромных объемов текста.

Наибольшая разница в скорости печати в режиме кодов и графическом режиме проявляется у матричных принтеров. Если вы страдаете нервными расстройствами, не используйте DOS-русифицированный матричный принтер для печати из Windows. Приобретите принтер, русифицированный специально для Windows, а еще лучше — купите струйный принтер, он работает тише и быстрее. При этом струйный принтер достаточно быстро работает и в графическом режиме.

Не покупайте GDI-принтер (принтер, который может печатать только из Windows), если только вы не очень стеснены в средствах. GDI-принтер печатает медленнее любого типичного PCL-принтера хотя бы потому, что у него нет буфера для хранения шрифтов. Кроме того, на таком принтере нельзя печатать из DOS.

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

Пожелание изготовителям принтеров и драйверов

Еще недавно у меня была заветная мечта — печатать из Windows на матричном или струйном принтере, используя встроенные шрифты. Отсюда и пожелание: встроить поддержку CP1251 в принтер, либо модифицировать драйверы, чтобы можно было печатать на принтерах, русифицированных согласно CP866.

То ли производители принтеров прислушались к моему мнению, то ли просто я угадал направление в развитии принтеров, но сегодня уже многие принтеры русифицированы для печати из Windows. К сожалению, печатать в кодах на старых DOS-русифицированных принтерах по прежнему невозможно.

А жаль, какая была бы радость пользователям, у которых осталось огромное количество матричных принтеров и которые вынуждены печатать на них из Word, не имея средств (или желания) приобрести "нормальный" лазерный принтер.

Полезные ссылки на русском языке

Многие производители принтеров уже имеют российские сайты в Интернете. Рекомендую посетить узлы фирм Canon, Citizen, Epson, Hewlett Packard, Lexmark. На них можно найти информацию по текущим моделям, некоторые их характеристики и новые драйверы.

Ну а тем, кто интересуется заменой своих устаревших АЦПУ, полезно будет посетить сайты фирм и их дилеров Genicom, Printronix. и Tally и ознакомиться с технологией линейно-матричной печати.

Дополнение

Печать из Windows с использованием драйвера "Общий/Только текст"

В ответ на первый вариант статьи я получил несколько писем, в которых их авторы советовали мне использовать для печати из Windows на DOS-русифицированном матричном принтере драйвер "Только текст". Честно говоря, я никогда не пользовался этим драйвером, доверившись его простому названию. Однако, как выяснилось, этот драйвер позволяет указать управляющие последовательности для выбора ширины символов (10, 12 и 17 CPI), включения и отключения режимов подчеркивания, полужирной печати и уширенных символов, а самое главное, позволяет указать способ перекодировки символов Windows в символы конкретного принтера.

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

  • Выбор драйвера "Только текст" моментально приводит к тому, что набранный в Word текст становится абсолютно нечитабельным (по крайней мере, на моей системе), и даже форматирование этого текста "прошитым" шрифтом, например Roman10, не помогает. Эффект в точности аналогичен тому, как если бы вы открыли текст, в котором текст отформатирован отсутствующем на вашем компьютере шрифтом. Но в данном-то случае Windows может понять, что используется драйвер "Только текст" с моноширинным шрифтом и подставить, например, Courier New. К сожалению, этого не происходит. Попытка в лоб записать в секцию [Font Substitutes] файла win.ini что-нибудь типа Roman10=Courier New Cyr также ни к чему не приводит. То есть здесь наблюдается классический случай, когда правая рука не ведает, что творит левая. К счастью, если правильно указать порядок перекодировки, печатается текст нормально.
  • Даже правильно указанные управляющие последовательности могут вызвать различные побочные эффекты. Например, на моем Epson-совместимом принтере Star NX-1500 после каждой подчеркнутой строчки прогоняется лишняя пустая строка. То есть воспользоваться на этом принтере режимом подчеркивания я не могу.
  • В русифицированной Windows есть только три стандартных способа перекодировки, ни один из которых не учитывает русскую CP866. Поэтому, если вы хотите печатать по-русски на своем аппаратно русифицированном принтере, вам сначала вручную придется заполнить таблицу перекодировки. Не очень-то удачный подход в русской, заметьте, версии Windows.

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

Как пользоваться драйвером "Общий/Только текст"

  1. Установить драйвер "Только текст" (для Windows95) или "Общий" (для Windows98).
  2. Кнопкой "Новая модель" создать новый профиль печати (можно этого не делать, если у вас только одна модель принтера).
  3. В разделе "Таблица соответствия расширенных символов" сопоставьте каждому символу Windows символ, печатаемый на принтере. Для этого по очереди выбирайте из списка "На экране" символы в кодировке 1251 и в поле "На принтере" вводите код из таблицы 866. Посмотреть коды символов для CP866 можно с помощью утилиты "Таблица символов", выбрав шрифт Terminal.
  4. В поле "Начало печати" полезно указать команду сброса текущего состояния принтера.
  5. На вкладке "Шрифты" заполните нужные вам поля командами вашего принтера.
  6. После этого сделайте этот драйвер текущим, отформатируйте текст нужным шрифтом (Roman10, Roman12 или Roman17) и печатайте. Жирный и подчеркнутый шрифт устанавливается стандартным способом.

Настройки для принтеров Epson/IBM

Ниже приводятся настройки, которые я использовал для Epson-совместимого принтера Star NX-1500

Название поляСодержание
Начало печати@
10 симв/дюйм^RPFH
12 симв/дюйм^RFHM
17 симв/дюйм^OPFH
Полужирный вкл.G
Полужирный выкл.H
Подчеркнутый вкл.-1
Подчеркнутый выкл.-0

Примечания.

  • Кобинация вводится простым нажатием клавиши Esc, числовой код — с помощью малой цифровой клавиатуры (держать Alt и вводить число обязательно из трех цифр, при необходимости ввести лидирующие нули), комбинация типа ^R вводится, удерживая клавишу Ctrl и нажимая R.
  • @ означает сброс принтера. Очень полезно выполнять перед началом печати.
  • ^R, она же chr(18), она же DC2, означает прекращение сжатой печати.
  • ^O, она же chr(15), она же SI, означает включить режим сжатой печати.
  • P означает режим 10CPI ("Пайка").
  • F означает прекратить уширенный режим.
  • H означает прекратить двухударную печать.
  • M означает переход в режим 12CPI ("Элита").

Все буквы в указанных комбинациях должны быть заглавными.

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




14 декабря 1999 Г.

Некоторые аспекты русификации принтеров

Некоторые аспекты русификации принтеров

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

Формирование изображения на бумаге

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

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

Вот так выглядит буква "A" для 9-игольчатого матричного принтера Star-NX1500. Как видно, матрица символа имеет размер 6x9 ячеек, при этом точки могут быть расположены не только внутри ячеек, но и между ними. Высота матрицы совпадает с количеством игл принтера, что позволяет печатать одну строку символов за один проход печатающей головки. Соответственно, для 24-игольчатых принтеров матрица имеет высоту в 24 ячейки, что позволяет улучшить изображение символов.

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

Каждому символу, хранящемуся в ПЗУ принтера, присвоен уникальный номер или, иначе говоря, код. Например, латинской букве "A" соответствует код 65. Для печати символа прикладной программе необходимо послать на принтер нужный код. Совокупность символов и их кодов образует таблицу символов или кодовую таблицу. Принтер выбирает из таблицы символов его описание (матрицу) и генерирует изображение на бумаге.

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

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

Способы русификации принтеров

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

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

Для каждой страны и каждого языка существует своя кодовая таблица, для некоторых языков даже несколько таблиц, в которых одни и те символы кодируются по разному, а одним и тем же кодам соответствуют разные буквы. Ситуация усугубляется различием кодировок в разных операционных системах. В русской версии MS-DOS используется кодовая таблица (code page, CP) с номером 866, а в русифицированной системе Windows — таблица 1251. В системе Unix и в компьютерах Macintosh — свои кодировки. Лучшее, что можно обещать, это что коды латинских букв будут одинаковы везде.

Русификация принтера означает, что принтер имеет "прошитые" русские буквы, которые программа не должна "рисовать" сама, и что встроенная в принтер кодовая таблица совпадает с таблицей компьютера. Таким образом, для нормальной печати русских текстов из MS-DOS принтер должен быть русифицирован согласно CP866, а для печати из Windows — согласно CP1251.

До недавнего времени принтеры русифицировались только для использования в MS-DOS, но в последнее время все больше принтеров, поддерживающих и кодировку русской версии Windows, и даже русскую кодировку системы Unix — KOI8-R. Тем не менее, печать из Windows обычно происходит в графическом режиме, поэтому русификация принтера для Windows-программ не является необходимой.

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

Аппаратно русифицированный принтер

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

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

Русифицированный в другой кодировке

Все еще попадаются принтеры, имеющие "прошитые" русские шрифты, но кодировка которых отличается от CP866. В среде MS-DOS такой принтер можно использовать, если достать или написать самому простой резидентный перекодировщик. В частности, таким образом можно печатать на многих АЦПУ, изначально не рассчитанных на подключение к персональным компьютерам.

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

Принтер позволяет загрузить шрифты в специальный буфер

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

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

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

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

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

Нерусифицированный без возможности загрузки шрифтов

Если принтер нерусифицирован аппаратно и не имеет буфера для загрузки русских шрифтов, то он никаким образом не позволит печатать по-русски кодами. Единственный вариант печати на таком принтере — в графическом режиме. А нерусифицированное АЦПУ можно просто выбросить (если у вас нет барабана с русскими буквами).

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

Для Windows этот вариант ничего необычного не представляет - как вы помните, Windows все равно обычно печатает в графике. Здесь необходимо отметить, что за последние несколько лет появилось множество моделей принтеров, ориентированных именно на печать из Windows и только из Windows. Обычно они называются Windows-принтерами или GDI-принтерами. Многие из них не позволяют печатать в кодах вообще. Поэтому вывести что либо на такой принтер из "чистого" DOS невозможно, а из DOS-сеанса Windows — хоть иногда и получается, но результат не всегда соответствует ожиданиям.

Дополнительные требования к принтерам



Грамотная русификация подразумевает не только сам факт наличия у принтера русских шрифтов в нужной кодировке, но также поддержку нескольких стандартных размеров и вариантов начертаний шрифта. Кроме того, хотя это уже не относится к собственно русификации, принтер должен обеспечивать ряд режимов, ставших стандартом de-facto. Ниже в таблице сведены основные требования, которым должен соответствовать правильно русифицированный принтер, а рисунок рядом показывает стандартные типы шрифтов, взятые из "Руководства по эксплуатации принтера Epson-NX1500".

Обозначения: А — АЦПУ, М — матричный принтер, С - струйный принтер, Л — лазерный принтер, + — должно присутствовать, — неприменимо, О — необязательно, но желательно.

Параметр Значение А М С Л
Длина листа, дюймов 11, 12 + + + +
Число строк на дюйм,  (LPI) 6, 8 + + + +
Число строк на странице Не менее 66 для режима 6LPI, не менее 88 для режима 8LPI + + + +
Ширина символов (символов на дюйм, CPI) 10, 12, 17, 20 - + + +
Число символов размером 10CPI в строке 80 для "узких" (A4) принтеров, 136 для "широких" (A3) принтеров + + + +
Управление отступом и полями
С помощью символов табуляции + + + +
Точным позиционированием O + + +
Дополнительные возможности
Черновой и чистовой режимы - О О О
Печать в альбомном режиме (поперек страницы) - О О +
Пропуск перфорации (линии отрыва) + + О -
  • Число строк на странице приведено для листа высотой 11 дюймов, для листа в 12 дюймов эти значения выше, однако большинство программ для MS-DOS рассчитаны на приведенные значения независимо от высоты листа.
  • Число символов в строке широких принтеров заметно меньше за счет припуска на перфорацию и механизм подачи. Но современные принтеры позволяют даже на перфорированной бумаге получить в строке до 156 символов размером 10CPI, и полновесные 160 символов на бумаге без перфорации.
  • Если принтер позволяет печатать на рулонной/перфорированной бумаге, то он может делать пропуск линии отрыва. Чем меньше этот интервал, тем больше строк принтер может распечатать. Это значение обычно составляет 0.7-1 дюйм на страницу (верний и нижний отступы), то есть приводит к потере до 6 строк в режиме 6LPI.
  • Многие лазерные принтеры требуют дополнительного отступа от края листа, обычно до 0,5 см с каждой стороны, что сокращает число символов в строке и число строк на листе.

Печать из Windows

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

Для проверки того, как Windows печатает в кодах, нужно установить драйвер матричного принтера и сделать его текущим. После этого, запустив текстовый редактор, скажем MS Word, можно заметить, что в списке шрифтов появились неизвестные шрифты, типа Courier10, Roman12 или Draft20, помеченные слева специальным значком в виде принтера. То есть Word, а точнее Windows, знает о существовании "прошитых" в принтер шрифтов, об их начертании и размере.

Однако система и понятия не имеет, что принтер может быть русифицирован. Наберите текст русскими буквами и отформатируйте его "встроенным" шрифтом — вы увидите привычные глазу греческие буквы. Но это еще не самое страшное. В конце концов нам на эти буквы не смотреть надо, а печатать, а коды-то у них наши, русские. Как бы не так! Windows выводит текст, и при этом весьма быстро, используя кодировку Windows — 1251, а принтеры обычно русифицируются в кодировке 866, поэтому хотя на бумаге и будут русские буквы, но ничего членораздельного прочесть не удастся.

Этот факт подтверждает, что:

  • система Windows так и не была русифицирована до конца и по отношению к российским пользователям допущена существенная дискриминация;
  • аппаратная русификация принтера в DOS-кодировке ничего не дает пользователю Windows.

Исходя из сказанного, при печати из Windows можно забыть об использовании встроенных русских шрифтов вашего старенького матричного принтера. Никогда не форматируйте текст "прошитыми" шрифтами, если вы используете матричный принтер — вместо текста будет напечатана абракадабра. Используйте шрифты TrueType, которые печатаются в графике. Так хоть и дольше, зато по-русски.

Так как разработчики Windows отказались от использования DOS-русифицированных принтеров, то создателям принтеров приходится теперь обеспечивать русификацию своей продукции не только в кодировке CP866, но и в CP1251. На сегодняшний момент существует уже множество моделей принтеров, аппаратно русифицированных для печати в кодах именно из Windows. К сожалению, я не обладаю опытом использования такого принтера, поэтому ничего конкретного сказать не могу. Вероятно, матричные принтеры, русифицированные специально для Windows, позволяют печатать так же быстро, как это было в DOS.

Я послал запрос в российские представительства фирм HP, Epson, Canon, Citizen и Lexmark с просьбой выслать список русифицированных моделей принтеров и способы их русификации. Ниже приведены полученные ответы.

Lexmark

  • Все лазерные принтеры и сетевые струйные принтеры русифицированы аппаратно.
  • Струйные принтеры серии Z являются Windows-принтерами и из чистого DOS не печатают (но печатают по-русски из DOS-окна Windows).
  • Поддерживают CP866, CP1251, а также украинские и латвийские кодовые страницы.

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

Hewlett Packard

  • Модели лазерных принтеров 2100, 4000, 4050, 5000, 8000, 8100 имеют аппаратную русификацию. В этих принтерах имеются различные масштабируемые русские шрифты всех кодировок (DOS CP866, WIN1251, KOI8-R), по умолчанию выбран моноширинный шрифт Courier, 10 символов на дюйм.
  • Принтеры 6L, 1100 русифицируются программно (специальная программа помещает масштабируемый шрифт Courier в оперативную память принтера).
  • Серии струйных принтеров: 8XX (кроме 820), 2X00, 670, 69X русифицированы аппаратно. Доступные гарнитуры и размеры для каждого принтера приведены в руководстве пользователя. Серия 7X0, 820 из DOS не печатают. Для этих моделей существует возможность печатать из DOS-сеанса в Windows 95, 98.
  • Принтер DeskJet 610C по-русски из DOS не печатает.

Игорь Шабанов, инженер центра технической поддержки HP

Tally

  • Принтеры фирмы Tally имеют аппаратную русификацию как в CP866, так и в CP1251.

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

Немного о системах команд

Так как АЦПУ имеют символы только одного начертания, для них актуальна лишь проблема соответствия кодовых таблиц принтера и компьютера. Никакой системы команд у АЦПУ нет. Более "продвинутые" принтеры, которые умеют печатать несколькими шрифтами, позволяют это делать посредством специальных команд.

На сегодня существует три наиболее распространенных системы команд принтеров: фирм Epson, IBM и HP.

Система команд фирмы Epson

Эта система команд называется ESC/P или, в расширенном варианте, ESC/P2. Другие фирмы, например Canon, называют ее LQ. Ее поддерживают все принтеры Epson, даже лазерные (по крайней мере старые модели), и многие модели других фирм, прежде всего матричные и струйные. Эта система команд является стандартом де-факто для DOS-программ.

Система команд фирмы IBM

Эта система команд называется IBM Proprinter, она же X24 (с вариациями), она же BJ. Ее поддерживают матричные принтеры IBM/Lexmark и многие модели других фирм, прежде всего матричные и струйные, в частности, Canon. Эта система команд во многом совпадает с системой ESC/P.

Система команд фирмы Hewlett Packard

Эта система команд называется PCL (Printer Control Language), сейчас используются версии PCL3 (для струйных принтеров) и PCL5/PCL6 для лазерных принтеров . Язык PCL поддерживают практически все лазерные принтеры любых производителей, а также многие струйные принтеры.

Несколько рекомендаций пользователям

Позволю себе дать несколько советов.

Если вы планируете работать с DOS-программами, подойдите к выбору принтера со всей ответственностью, поинтересуйтесь у производителя программы, с какими принтерами его программа работает лучше всего, узнайте типичное количество строк в странице и символов в строке в выходных документах. В общем случае, идеальным вариантом будет аппаратно русифицированный принтер в кодировке 866 и системе команд Epson/IBM. Проверьте наличие шрифтов всех стандартных размеров, максимальное число строк на странице и минимальные отступы от края листа.

Не выбрасывайте имеющееся у вас АЦПУ, если к нему можно достать расходники и запчасти. Это дешевое и надежное средство печати огромных объемов текста.

Наибольшая разница в скорости печати в режиме кодов и графическом режиме проявляется у матричных принтеров. Если вы страдаете нервными расстройствами, не используйте DOS-русифицированный матричный принтер для печати из Windows. Приобретите принтер, русифицированный специально для Windows, а еще лучше — купите струйный принтер, он работает тише и быстрее. При этом струйный принтер достаточно быстро работает и в графическом режиме.

Не покупайте GDI-принтер (принтер, который может печатать только из Windows), если только вы не очень стеснены в средствах. GDI-принтер печатает медленнее любого типичного PCL-принтера хотя бы потому, что у него нет буфера для хранения шрифтов. Кроме того, на таком принтере нельзя печатать из DOS.

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

Пожелание изготовителям принтеров и драйверов

Еще недавно у меня была заветная мечта — печатать из Windows на матричном или струйном принтере, используя встроенные шрифты. Отсюда и пожелание: встроить поддержку CP1251 в принтер, либо модифицировать драйверы, чтобы можно было печатать на принтерах, русифицированных согласно CP866.

То ли производители принтеров прислушались к моему мнению, то ли просто я угадал направление в развитии принтеров, но сегодня уже многие принтеры русифицированы для печати из Windows. К сожалению, печатать в кодах на старых DOS-русифицированных принтерах по прежнему невозможно.

А жаль, какая была бы радость пользователям, у которых осталось огромное количество матричных принтеров и которые вынуждены печатать на них из Word, не имея средств (или желания) приобрести "нормальный" лазерный принтер.

Полезные ссылки на русском языке

Многие производители принтеров уже имеют российские сайты в Интернете. Рекомендую посетить узлы фирм Canon, Citizen, Epson, Hewlett Packard, Lexmark. На них можно найти информацию по текущим моделям, некоторые их характеристики и новые драйверы.

Ну а тем, кто интересуется заменой своих устаревших АЦПУ, полезно будет посетить сайты фирм и их дилеров Genicom, Printronix. и Tally и ознакомиться с технологией линейно-матричной печати.

Дополнение

Печать из Windows с использованием драйвера "Общий/Только текст"

В ответ на первый вариант статьи я получил несколько писем, в которых их авторы советовали мне использовать для печати из Windows на DOS-русифицированном матричном принтере драйвер "Только текст". Честно говоря, я никогда не пользовался этим драйвером, доверившись его простому названию. Однако, как выяснилось, этот драйвер позволяет указать управляющие последовательности для выбора ширины символов (10, 12 и 17 CPI), включения и отключения режимов подчеркивания, полужирной печати и уширенных символов, а самое главное, позволяет указать способ перекодировки символов Windows в символы конкретного принтера.

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

  • Выбор драйвера "Только текст" моментально приводит к тому, что набранный в Word текст становится абсолютно нечитабельным (по крайней мере, на моей системе), и даже форматирование этого текста "прошитым" шрифтом, например Roman10, не помогает. Эффект в точности аналогичен тому, как если бы вы открыли текст, в котором текст отформатирован отсутствующем на вашем компьютере шрифтом. Но в данном-то случае Windows может понять, что используется драйвер "Только текст" с моноширинным шрифтом и подставить, например, Courier New. К сожалению, этого не происходит. Попытка в лоб записать в секцию [Font Substitutes] файла win.ini что-нибудь типа Roman10=Courier New Cyr также ни к чему не приводит. То есть здесь наблюдается классический случай, когда правая рука не ведает, что творит левая. К счастью, если правильно указать порядок перекодировки, печатается текст нормально.
  • Даже правильно указанные управляющие последовательности могут вызвать различные побочные эффекты. Например, на моем Epson-совместимом принтере Star NX-1500 после каждой подчеркнутой строчки прогоняется лишняя пустая строка. То есть воспользоваться на этом принтере режимом подчеркивания я не могу.
  • В русифицированной Windows есть только три стандартных способа перекодировки, ни один из которых не учитывает русскую CP866. Поэтому, если вы хотите печатать по-русски на своем аппаратно русифицированном принтере, вам сначала вручную придется заполнить таблицу перекодировки. Не очень-то удачный подход в русской, заметьте, версии Windows.

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

Как пользоваться драйвером "Общий/Только текст"

  1. Установить драйвер "Только текст" (для Windows95) или "Общий" (для Windows98).
  2. Кнопкой "Новая модель" создать новый профиль печати (можно этого не делать, если у вас только одна модель принтера).
  3. В разделе "Таблица соответствия расширенных символов" сопоставьте каждому символу Windows символ, печатаемый на принтере. Для этого по очереди выбирайте из списка "На экране" символы в кодировке 1251 и в поле "На принтере" вводите код из таблицы 866. Посмотреть коды символов для CP866 можно с помощью утилиты "Таблица символов", выбрав шрифт Terminal.
  4. В поле "Начало печати" полезно указать команду сброса текущего состояния принтера.
  5. На вкладке "Шрифты" заполните нужные вам поля командами вашего принтера.
  6. После этого сделайте этот драйвер текущим, отформатируйте текст нужным шрифтом (Roman10, Roman12 или Roman17) и печатайте. Жирный и подчеркнутый шрифт устанавливается стандартным способом.

Настройки для принтеров Epson/IBM

Ниже приводятся настройки, которые я использовал для Epson-совместимого принтера Star NX-1500

Название поля Содержание
Начало печати <Esc>@
10 симв/дюйм ^R<Esc>P<Esc>F<Esc>H
12 симв/дюйм ^R<Esc>F<Esc>H<Esc>M
17 симв/дюйм ^O<Esc>P<Esc>F<Esc>H
Полужирный вкл. <Esc>G
Полужирный выкл. <Esc>H
Подчеркнутый вкл. <Esc>-1
Подчеркнутый выкл. <Esc>-0

Примечания.

  • Кобинация <Esc> вводится простым нажатием клавиши Esc, числовой код — с помощью малой цифровой клавиатуры (держать Alt и вводить число обязательно из трех цифр, при необходимости ввести лидирующие нули), комбинация типа ^R вводится, удерживая клавишу Ctrl и нажимая R.
  • <Esc>@ означает сброс принтера. Очень полезно выполнять перед началом печати.
  • ^R, она же chr(18), она же DC2, означает прекращение сжатой печати.
  • ^O, она же chr(15), она же SI, означает включить режим сжатой печати.
  • <Esc>P означает режим 10CPI ("Пайка").
  • <Esc>F означает прекратить уширенный режим.
  • <Esc>H означает прекратить двухударную печать.
  • <Esc>M означает переход в режим 12CPI ("Элита").

Все буквы в указанных комбинациях должны быть заглавными.

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