Печать по русски из-под Linux.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Печать по русски из-под Linux.

Сообщение yuri » 22.01.2007 15:53:12

Пытаюсь печатать русский текст следующим способом:
Код: Выделить всё
if PrintDialog1.Execute then
if FontDialog1.Execute then
  begin
    Printer.BeginDoc;
    Printer.Canvas.Font:=FontDialog1.Font;
    Printer.Canvas.TextOut(40,40,'Привет, всем!');
    Printer.EndDoc;
  end;           

Принтер подключен к виндовой станции. Если программа компилится под Lazarus-win, то русский текст печатется нормально. При попытке откомпилить и выполнить программу в Linux, на принтер выводятся кракозябры. В linux локаль koi8r.

Кто может помочь в этой проблеме?
yuri
незнакомец
 
Сообщения: 2
Зарегистрирован: 22.01.2007 15:46:50

Сообщение SergKam » 22.01.2007 16:36:01

У шрифта есть свойство локаль(чарсет) его сначала установить надо.
SergKam
постоялец
 
Сообщения: 251
Зарегистрирован: 16.11.2005 21:31:11
Откуда: Украина,Харьков

Сообщение yuri » 22.01.2007 18:41:46

Пробовал. Ноль реакции. Никаких изменений. Кто-нибудь реально печатал в лазарусе под линуксом русский текст?
yuri
незнакомец
 
Сообщения: 2
Зарегистрирован: 22.01.2007 15:46:50

Сообщение alexs » 24.01.2007 11:43:44

Как я понял - там надо править модуль OSPrinter в части печти под Linux - там жёстко прошиты шрифты с европейской кодировкой.
Народ - есть кто нибудь, хорошо разбирающийся в PostScrip и в его применении в CUPS? там именно в это направлении надо покопать.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение konst » 12.02.2007 10:33:18

если интересует решение этой проблемы для Linux, пишите на konstj@mail.ru, если коротко: суть в "переделке" файла lazarus-a postscriptcanvas.pas для использования "правильных" шрифтов
konst
незнакомец
 
Сообщения: 8
Зарегистрирован: 12.02.2007 10:17:01

Сообщение Romtek » 12.02.2007 11:19:24

konst, а почему бы не выдать сюда diff - файл изменений, проделанных над исходным файлом утилитой diff?
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение alexs » 12.02.2007 11:24:10

А ты решил эту проблему?
давай делись со всеми - это будет полезно всем

кстати
Если кому нужно - могу поделиться решением печати из FastReport 2.5 под Linux из Wine. У меня это было единственная проблема которая не давала перевести сущесвующий проект на Delphy без переписывания в Linux
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение konst » 12.02.2007 12:29:28

немного теории:
для печати из проектов Лазаря используется postscript файл, сгенерированный модулем postscriptcanvas.pas.
структура *.ps файла не очень сложная и все выводимые на печать шрифты сводятся к трем: arial, times и courier.
Причем не инкапсулированных в ps файл, как в большинстве приложений Linux, а внешними и еще к тому же "перекодированными" самим Лазарем.
В конечном итоге даже правильно настроенный Ghostscript не печатает кириллицу, из Лазаря. :-(.

решение:
1. более правильное, но немного трудоемкое - инкапсулировать нужные шрифты в ps файл
2. более простое - использовать шрифты с правильно расположенными кирилическими глифами с соответствующей настройкой ghostscpipt и небольшой правкой postsciptcanvas.pas и как следствие необходимой пересборкой Лазаря.

теперь подробнее

1. коммандой gs -h смотрим пути, по которым Ghostscript "ищет" свои библиотеки и шрифты. Запоминаем
2. убеждаемся, что по одному из путей есть шрифты с кириллицей в той же локали, что и система (у меня н-р cp1251). Обязательно должен присутствовать файл Fontmap, с псевдонимами этих шрифтов!!! (я брал шрифты M$)
3. вписываем вместо имеющихся в postscriptcavas.pas названий шрифтов, те, что имеем в Fontmap.
4. в директории Лазаря делаем make clean all, чтобы изменения вступили в силу.

в общих чертах все.

по поводу diff и пр. немного позже подготовлю всю инф., включая свой Fontmap

есть решение и по первому пункту, если кого интересует...
konst
незнакомец
 
Сообщения: 8
Зарегистрирован: 12.02.2007 10:17:01

Сообщение konst » 12.02.2007 13:32:38

diff:
//----------------------------------------------------------------------

651a652
> if Font.Size < 0 then Font.Size := Font.Size * (0-1);
664c665,666
< Result:='HelveticaISO';
---
> Result:='Arial';
>
666,672c668,676
< Result:='TimesISO';
< if LowerCase(Font.Name)='monospaced' then
< Result:='CourierISO';
< if LowerCase(Font.Name)='serif' then
< Result:='TimesISO';
< if LowerCase(Font.Name)='sansserif' then
< Result:='HelveticaISO';
---
> Result:='TimesNewRomanPS';
> if LowerCase(Font.Name)='times new roman' then
> Result:='TimesNewRomanPS';
>
> if LowerCase(Font.Name)='courier' then
> Result:='CourierNewPS';
> if LowerCase(Font.Name)='courier new' then
> Result:='CourierNewPS';
>
676,683c680,694
< if (fsItalic in Font.Style) and ((Pos('Courier',Result)=1) or (Pos('Helvetica',Result)=1)) then
< Atr:=Atr+'-Oblique';
< if (fsItalic in Font.Style) and (Pos('Times',Result)=1) then
< Atr:=Atr+'-Italic';
< if (fsBold in Font.Style) and ((Pos('Courier',Result)=1) or (Pos('Helvetica',Result)=1) or (Pos('Times',Result)=1)) then
< Atr:=Atr+'-Bold';
< if (Result+Atr='Times') or (Result+Atr='TimesISO') then
< Result:='RomanISO';
---
> if (fsItalic in Font.Style) {and ((Pos('CourierNewPS',Result)=1) or (Pos('Arial',Result)=1))} then
> Atr:={Atr+}'-Italic';
>
>
> if (fsBold in Font.Style) {and ((Pos('CourierNewPS',Result)=1) or (Pos('Arial',Result)=1) or (Pos('TimesNewRoman',Result)=1))} then
> Atr:={Atr+}'-Bold';
>
>
> if (fsBold in Font.Style) and (fsItalic in Font.Style)
> {and (Pos('TimesNewRomanPS',Result)=1)} then
> Atr:={Atr+}'-BoldItalic';
>
>
> //if (Result+Atr='TimesNewRoman') or (Result+Atr='TimesISO') then
> // Result:='RomanISO';
687c698
< Result:=Result+Atr;
---
> Result:=Result+Atr + 'MT';

//---------------------------------------------------------------------------------

Fontmap:

//--------------------------------------------------------------------------------
/ArialMT (arial.pfb) ;
/Arial-BoldMT (arialbd.pfb) ;
/Arial-BoldItalicMT (arialbi.pfb) ;
/Arial-ItalicMT (ariali.pfb) ;
/Arial-Black (ariblk.pfb) ;
/CourierNewPSMT (cour.pfb) ;
/CourierNewPS-BoldMT (courbd.pfb) ;
/CourierNewPS-BoldItalicMT (courbi.pfb) ;
/CourierNewPS-ItalicMT (couri.pfb) ;
/Tahoma (tahoma.pfb) ;
/Tahoma-Bold (tahomabd.pfb) ;
/TimesNewRomanPSMT (times.pfb) ;
/TimesNewRomanPS-BoldMT (timesbd.pfb) ;
/TimesNewRomanPS-BoldItalicMT (timesbi.pfb) ;
/TimesNewRomanPS-ItalicMT (timesi.pfb) ;
/Verdana (verdana.pfb) ;
/Verdana-Bold (verdanab.pfb) ;
/Verdana-Italic (verdanai.pfb) ;
/Verdana-BoldItalic (verdanaz.pfb) ;

//-----------------------------------------------------------------------
PS: повторюсь, что у меня локаль cp1251, на других не проверял
вроде ничего не забыл...
konst
незнакомец
 
Сообщения: 8
Зарегистрирован: 12.02.2007 10:17:01

Сообщение alexs » 12.02.2007 14:48:09

буду пробовать - сенькс
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Attid » 21.05.2007 12:53:28

Код: Выделить всё
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    Printer.Canvas.TextOut(40,40,'hello word');
    Printer.EndDoc;
  end;


а у меня под вендой такой код падает =(
что-то поломали или одно из двух ?

кста решение под линукс с шрифтами, что мне прийдется потом на клиентских машинах настраивать ?
как то муторно все это.

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

посмотрел
c:\lazarus\examples\postscript\samplepostscriptcanvas.lpr
во первых там ошибка =)
во вторых русский тоже в кракозяки там =(
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение debi12345 » 21.05.2007 13:13:03

c:\lazarus\examples\postscript\samplepostscriptcanvas.lpr
во первых там ошибка =)
во вторых русский тоже в кракозяки там =(

Пинайте команду - до победного конца (и полной ясности - что и как делать ) !
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение alexs » 22.05.2007 01:38:47

нужен человек-эксперт в PostScrip - который сможет объяснить как оно там всё работает
если всё доходчиво расскажут (в плане теории работы со шрифтами) - то рализовать можно будет
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение debi12345 » 22.05.2007 08:04:31

нужен человек-эксперт в PostScrip - который сможет объяснить как оно там всё работает
если всё доходчиво расскажут (в плане теории работы со шрифтами) - то рализовать можно будет

Туториал ("persons" в MSEgui) содержит в себе приличные наработки и подробные объяснения, и даже BASH-скрипт для генерации "Fontmap.GS" по текущим X-вым шрифтам, с учетом FontConfig. А акцентом на TrueType-шрифтах.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Lisolog » 14.01.2008 15:39:56

Сори, но такое впечатление что тема закрылась +)
Если можно, обрисуйте ситуацию доступнее.
Вариант:
Mandriva 2008, Лазарь 0.9.24 бета. UTF-8
Всякие TimesNewROman, Arial и тд отсутствуют.
Есть например Liberation, DejaVu...

Делаем
Код: Выделить всё
    printer.begindoc;
    printer.canvas.font.name:='Liberation Sans';
    printer.canvas.Font.CharSet:=204;
    тыры-пыры...

На выходе - краказябы +)

Заране пасиба за разжевывание для тех, кто в танке (т.е. меня)
Lisolog
новенький
 
Сообщения: 39
Зарегистрирован: 13.12.2007 14:24:08
Откуда: Russia, SPb

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru