Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Мы учим летать сам олеты или об опыте PS печати ANSI файлов

4 views
Skip to first unread message

Valentin Likoum

unread,
Mar 24, 2005, 6:25:12 AM3/24/05
to
Излагаю свой опыт укрощения DCPS [чайником] на тот случай, если
кому (такому же чайнику) понадобится.
Задача: печатать плоские ASCII-файлы (в первую очередь) и PS файлы
(опционно) на [лазерный] PS-принтер.
Имеем: DCPS (в моеме случае v2.2), PS-принтер (опробовано на
HP2200 и OKIPAGE 14i). Кодировка на хосте - КОИ8 (предполагаю, что
не проблема и ISO8859-5, если найти в сети фонты под эту кодировку).
Решение:
1. Тащим кириллические фонты:
http://www.ibiblio.org/pub/academic/russian-studies/Software/PS/CyrPS.tar.gz

2. Фонты(*.pfa), которыми собираемся печатать помещаем в persistent
resourses (как, см. DSPS мануал), чтобы не грузить их на каждом джобе.
3. С этого момента можно спокойно печатать PS, применяя загруженные
шрифты. Но нам нужно печатать еше и ASCII файлы, так что идем дальше.
4. создаем модуль следующего содержания:

TRN$XLATE_DICT begin
/TRN$ANSI_BOX_0
{ /CourierCyrPS findfont [1000 0 0 -1000 0 0] makefont setfont } def
% повторить предыдущие две строки
% для /TRN$ANSI_BOX_1 .. /TRN$ANSI_BOX_7 - сдесь они исключены
% для краткости. Всместо CourierCyrPS можно использовать другой
% шрифт фиксированной ширины из числа загруженных на шаге 2.
% здесь задается шрифт в 10 пойнтов (1000 centipoints) - можно
% поменять при желании
end

и вставляем его в библиотеку DCPS$DEVCTL.TLB или другую. В
последнем случае нужно модифицировать лог.имя DCPS_LIB.
Переопределив таким образом все TRN$ANSI_BOX_x, мы теряем
возможность печатать другими шрифтами (bold, italic, ...) меняя их
ESC-командами. Можно поиграться и выяснить, какой ANSI_BOX за какой
стиль отвечает и закрепить за ним правильный фонт, но нам не до жиру.
5. Печатаем print/setup=<имя модуля из п.4> или заводим форму с
упомянутым setup-модулем и печатаем print/form= или ставим этот
модуль setup-модулем в форму DCPS$DEFAULT.
6. Здесь приятное заканчивается и начинаются проблемы. DCPS-ский
конвертер ANSI->PS конвертит кириллические буквы в код вида \xxxx,
где xxx - восьмеричный код буквы. Конвертит он их в соответствии с
установленным чарсетом (по умолчанию - ISO Latin-1), в котором нет
символов с кодами 0xD0, 0xDE, 0xF0, 0xFE. Так что в напечатанном
тексте у нас не будет букв 'П' и 'Ч' (КОИ8). В принципе текущий
чарсет можно поменять ESC-последовательностью в начале файла, но
этот конвертер-скотина не знает ни одного русского чарсета. Мне
удалось найти единственный чарсет в котором присутствуют все буквы с
0xC0 по 0xFE. Это - DEC Technical. Ставим в начало печатаемого файла
ESC-последовательность для переключения на данный чарсет: <ESC>)><ESC>~
Подобный обман не проходит даром - весьма криво выводятся пробелы.
Если кто подскажет, как отучить конвертер превращать буквы в
восьмеричный коды или научить его хотя бы превращать их as-is, или
как переключиться на нормальный чарсет - буду очень благодарен.

--
Best regards,
Valentin
valentin.likoum at ncc dot volga dot ru

0 new messages