Почему Мозилла печатает вместо русских букв пустые квадраты, хотя в PrintPreview все нормально? Версия для печати   


Дело в том, что отображением на экране и печатью в Линуксе управляют две совершенно разные программы - Xserver и ghostscript соответственно. А они настроены у вас таким образом, что они используют разные шрифты. Это подразумевает еще две достаточно неприятные вещи -

1. Для одного и того-же документа вам приходится держать на диске два набора шрифтов (один для печати, а другой для экрана)

2. Никакого WYSIWYG - при такой настройке у вас нет
Рецепт решения очевиден - сделать так чтобы Xserver и ghostscript использовали одни и те же шрифты.

Xserver
Сам по себе может использовать только bitmapped шрифты (файлы с расширением *.pcf). Они быстро обрабатываются, но выглядят, мягко говоря, так себе. Лучше использовать масштабируемые truetype (*.ttf) или type1 (*.pfb, *.pfa ) шрифты. На их отрисовку требуется больше времени (тк файл шрифтов представляет из себя набор узлов, через которые, при отрисовке, проводятся кубический - для type1-или квадратичный - для ttf - сплайн), но для современных компьютеров скорость не проблема. Чтобы подключить к Xservery type1 или truetype шрифты, нужно указать в XF86Config

Section "Modules"
...
Load "type1"
Load "freetype"
#Для truetype есть альтернативный модуль xtt, 
но мне freetype больше нравится.
...
EndSection

, а в Section "Files" прописать пути к папкам где лежат эти шрифты. Если вы хотите использовать truetype шрифты от Microsoft, то вам нужно создать в директории с этими шрифтами файл fonts.dir (это текстовый файл - база данных по которой Xserver находит нужный шрифт, где прописано соответствие между именем фонта и его файлом, например
times.ttf -monotype-Times New Roman-medium-r-normal--0-0-0-0-p-0-koi8-r
arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-koi8-r

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

ghostscript
По умолчанию ghostscript умеет работать с bitmapped (*.gsf)
и type1 (*.pfb) шрифтами. Если он скомпилирован с опцией
ttfont (./configure --enable-package-ttfont, в современных
дистрибутивах например Слакваре8.1 - это так), то он понимает
и truetype шрифты. Точно так же, как и Xserver, ghostscript
поддерживает свою собственную базу шрифтов, которая хранится
в файле GSROOT/ghostscript/GSVERSION/lib/Fontmap.GS
(у меня GSROOT = /usr/share, GSVERSION =7.05). Этот файл
содержит соответствия между постскриптовским именем фонта
и его файлом, например
/NimbusRomNo9L-Regu (n021003l.pfb) ;

и alias-ов -
/Times-Roman /NimbusRomNo9L-Regu ;

Если вы хотите посмотреть как выглядит тот или иной фонт
в ghostscripte вот примитивный fontviewer - cd GSROOT/ghostscript/GSVERSION/lib/,
введите команду gs и в промпте наберите
(prfont.ps) run 
/Times-Roman DoFont


Вернемся к нашим баранам - скрещиваем Мозиллу и ghostscript
Используйте одни и те же шрифты в Мозилле и ghostscript. Из
написанного выше ясно, что это может быть либо *.pfb или
*.ttf шрифты. Я советую truetype, не потому что он лучше,
а так уж исторически сложилось, что у нас легче найти русские
truetype шрифты, причем за небольшую цену на Митинском рынке.

Чтобы сделать их доступными для ghostscripta отредактируйте
Fontmap.GS, например вот так
/Courier   (cour.ttf) ; 
/Courier-Oblique  (couri.ttf) ; 
/Courier-Bold   (courbd.ttf) ;
/Courier-BoldOblique  (courbi.ttf) ;
/Helvetica   (arial.ttf) ; 
/Helvetica-Oblique  (ariali.ttf) ; 
/Helvetica-Bold   (arialbd.ttf); 
/Helvetica-BoldOblique  (arialbi.ttf);
/Times-Roman   (times.ttf) ; 
/Times-Italic   (timesi.ttf) ;
/Times-Bold   (timesbd.ttf) ; 
/Times-BoldItalic  (timesbi.ttf) ;

( в оригинальном Fontmap.GS это все alias-ы ) и положите
линки на соответствующие файлы в директорию, где ghostscript
сможет их найти - GSROOT/ghostscript/fonts (можно изменить
FontPath для ghostscripta, но на мой взгляд это сложнее,
все желающие могут прочитать в Документации ghostscript
как это сделать).

Теперь возьмемся за Мозиллу. Menu Edit->Preferences->Appearence->Fonts
и для кириллических шрифтов выберем те Х-овые имена шрифтов,
файлы которых те же самые, что мы указали для ghostscriptа.
Т.е. скажем для Serif фонта мы должны выбрать -monotype-Times
New Roman-medium-r-normal--0-0-0-0-p-0-koi8-r (если воспользоваться
примерами приведенными в этом тексте).

Теперь все должно печататься правильно.

Замечу еще, что это не решает проблему полного WYSIWYGa.
Дело в том, что соответствие между именами шрифтов в Xserverе
и ghostscriptе нигде не указано и отдается на усмотрение
разработчику программы. Та-же мозилла, например, при печати
serifed фонта она будет использовать фонт /Times-Roman, не
вникая в детали того, какой фонт она использует при выводе
на Xserver. Скажем если вы укажете в Edit->Preferences->Appearence->Fonts
шрифт -monotype-Arial-medium-r-normal--0-0-0-0-p-0-koi8-r
для serifed фонта, то документ в PrintPreview и в получившемся
постскрипт файле будет очень сильно различаться.

CopyLeft geekkoo

Опубликовал: geekkoo
Дата: 18.08.2003
постоянный адрес статьи: http://linuxportal.ru/entry.php/P494_0_3_0/