Discussion:
печать в среде windows, Michael Schwartz
(слишком старое сообщение для ответа)
Kirill Frolov
2007-01-16 14:07:21 UTC
Permalink
Немедленно нажми на RESET, All!

Решений для печати непосредственно из Tcl-программы в
среде windows и средствами windows, без использования, например,
стороннего postscript интерпретатора, не много вобщем-то.
Если откинуть те, что предлагают распечатку растра (bitmap),
то остаётся одно: http://www.du.edu/%7Emschwart/.

При его использовании была обнаружена несколько специфическая
проблема... Русский текст выводимый некоторыми шрифтами, в частности
"Times New Roman", нормально воспроизводился на дешёвых "винпринтерах",
но выводился символами из HEWBREW_CHARSET на PCL-принтерах и некоторых
PostScript-принтерах (по-моему это зависит от драйвера). Рассмотрение
получаемых PostScript файлов показало, что виндовс (или драйвер)
добавляет туда, да именно его, еврейский шрифт (шрифт принтера не
используется!). Вместо русского. Почему так происходит так и осталось не
понятым. Факты таковы:

* При установке поля lfCharSet в значение DEFAULT_CHARSET структуры
LOGFONT, используемой функцией CreateFontIndirect, возникает
описанная выше ситуация, видимо, как указывается в ремарке к
документации, из MSDN, "устанавливается шрифт из *any* *charset*
если не найден требуемый"... Ремарка, правда, относительно поведения
Widnows-98, для NT прописано локале-зависимое поведение (пробовалось
всё, естесственно на NT).

* При установке того же поля в RUSSIAN_CHARSET текст выводится
правильно.

* При отключении "оптимизации печати" (картинка растеризуется
драйвером?) -- результат тоже правильный.

Видимо, во втором случае подходящий шрифт *для* *принтера* (т.е.
Type-1, например -- интересно вообще откуда они берутся в windows --
преобразуются из TTF?) находится всё-таки, а в первом подставляется
из *any* *charset* (меня больше всего радует слово *any*). Для
винпринтеров, понятно, драйвер всегда растеризует виндовыми шрифтами.

Имеется патч:

--- gdi.c.orig 2002-10-20 16:10:20.000000000 +0400
+++ gdi.c 2007-01-16 16:08:34.000000000 +0300
@@ -394,6 +394,37 @@
"\thdc parameters can be generated by the
printer extension";
static char msgbuf[1024];

+/* fk0: need to compile under MINGW */
+#define strcmpi strcasecmp
+#define strncmpi strncasecmp
+
+/* fk0 patch: select RUSSIAN_CHARSET instead of DEFAULT_CHARSET for
+ * some cyrillic-based languages (only for ex-USSR countries) */
+static BYTE DefaultCharset(void)
+{
+BYTE charset;
+LCID lcid = GetThreadLocale();
+ switch (PRIMARYLANGID(lcid)) {
+ case LANG_BELARUSIAN:
+ case LANG_RUSSIAN: case LANG_TATAR:
+ case LANG_UKRAINIAN:
+ charset=RUSSIAN_CHARSET;
+ break;
+
+ case LANG_UZBEK: if (SUBLANGID(lcid) ==
SUBLANG_UZBEK_CYRILLIC)
+ charset=RUSSIAN_CHARSET;
+ break;
+
+ case LANG_AZERI: if (SUBLANGID(lcid) ==
SUBLANG_AZERI_CYRILLIC)
+ charset=RUSSIAN_CHARSET;
+ break;
+
+ default: charset=DEFAULT_CHARSET;
+ }
+ return charset;
+}
+
+
/****************************************************************
** This is the top-level routine for the GDI command
** It strips off the first word of the command (gdi) and
@@ -2875,7 +2906,7 @@
/* Set up defaults for logical font */
memset (lf,0, sizeof(*lf));
lf->lfWeight = FW_NORMAL;
- lf->lfCharSet = DEFAULT_CHARSET;
+ lf->lfCharSet = DefaultCharset();
lf->lfOutPrecision = OUT_DEFAULT_PRECIS;
lf->lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf->lfQuality = DEFAULT_QUALITY;


Видно, что для ряда языков использующих кириллицу насильственно
подсовывается RUSSIAN_CHARSET. Хотя он, никакой, к чёрту, не RUSSIAN...
Выбор charset'ов из структуры LOGFONT явно не кореллирует с возможными
локалями принятыми в среде Windows. Как тут правильно подставить нужный
charset я понять не могу. Кроме того, такое насилие вызывает другую
проблему: GetThreadLocale может дать русскую локаль при нерусской в
самом тикле (ввиду того, что он парсит getenv("LANG")) и при этом
возможна ситуация распечатки чего-либо нерусского с RUSSIAN_CHARSET.
Как обрабатывать такую ситуацию? Одни вопросы...
Ilya Anfimov
2007-01-16 20:58:17 UTC
Permalink
Post by Kirill Frolov
Немедленно нажми на RESET, All!
Решений для печати непосредственно из Tcl-программы в
среде windows и средствами windows, без использования, например,
стороннего postscript интерпретатора, не много вобщем-то.
Если откинуть те, что предлагают распечатку растра (bitmap),
то остаётся одно: http://www.du.edu/%7Emschwart/.
[skipped]
Post by Kirill Frolov
* При отключении "оптимизации печати" (картинка растеризуется
драйвером?) -- результат тоже правильный.
Вообще -- спасибо. Но без отключения вот этого -- много
где начинают иногда вылезать косяки. Так что отключить
и не париться.

Loading...