Re: [Bug 449255] Re: cups with ttf-mscorefonts does not print capital Й
To: Saha
Я тоже не вполне понимаю в чем именно корень проблемы. Это может быть и некоторая некорректность в структуре самого шрифта или такая его особенность, которая не вполне корректно обрабатывается postscript генератором OOo. Или такая особенность генерируемого postscript файла, которую цепочка фильтров cups обрабатывает не вполне корректно.
Насколько я понял, начиная с одной из под-версий cups 1.3.*, в организацию конвейера обработки документа для печати вносятся изменения, чтобы сделать его не postscript-ориентированным, каким он был ранее, а pdf-ориентированным. Раньше, если грубо, цепочка обработки была такова: OOo генерирует свой postscript файл (со встроенными шрифтами), cups пропускает его через комплект postscript фильтров, который, в общем, зависит от входного файла и цели преобразования (принтера, например), преобразованный cups postscript отправляется на принтер. Теперь в ходе преобразований cups есть этап конвертации в pdf, зетем обработки в pdf-е, затем обратно в postscript, подготовка его для принтера, отправка на принтер. Если в cups включить отладочные сообщения, то по протоколу можно как-то восстановить эту цепочку. Можно часть преобразований цепочки повторить вручную, анализируя, на сколько это возможно, текущий результат. У меня вышло, что проблема проявляется после преобразования входного OOo postscript в pdf: Если сохранить OOo postscript в файл (опция «печать в файл»), затем прогнать его через ps2pdf конвертер, то в результирующем файле проблема уже будет иметь место.
Пробовал устанавливать разные версии cups, от Carmic (тут Jaunty), собранные из исходников разных версий с сайта cups, ни в одном из вариантов все проявления проблемы не уходили. А именно, «Й» в Arial, Courier New, Times New Roman, установленных пакетом mscorefonts и «б» из казалось бы родного в линуксе DejaVu Sans. Случаи с другими шрифтами, которые я разбирал, были вызваны подстановкой одного из перечисленных. Например «б» испорченная в Arial, оказалась таковой потому, что Arial нет и был подставлен DejaVu Sans.
Ковырялся в Arial в шрифтовом редакторе (FontForge, древняя и огромная в смысле функций софтина), на сколько я могу судить, «Й» в Arial как-бы составлена из двух глифов: «И» и этого самого смайла сверху. Может это и есть причина? Но тогда не понятно что с «б», там смайлов нет. Если Arial просто сохранить в FontForge, то получившийся шрифт печатается нормально. Но все же шрифты не переправишь, да и гарантии нет, что просто сохранение везде поможет.
То решение, которое работает сейчас у нас, по сути, изменяет (дополняет) цепочку фильтров cups, приближая ее, как я подозреваю, к тому, что было в более ранних версиях. Благо, там все настраивается:
В /etc/cups/oopstops.types добавлена строка:
application/oo3.postscript string(0,%!) + contains(0,1024,"%%Creator: (OpenOffice.org 3.")
теперь postscript, приходящий из OOo 3.*, будет не просто postscript, а «oo3.postscript»
В /etc/cups/oopstops.convs добавлена строка:
application/oo3.postscript application/postscript 33 oo3-pstops
которая сообщает cups, что для преобразования «oo3.postscript» в обыкновенный нужно использовать фильтр oo3-pstops.
И, наконец, в /usr/lib/cups/filter, где cups ищет свои фильтры, добавлен скрипт oo3-pstops, который по сути прогоняет OOo postscript файл через утилиту ps2ps — «Ghostscript PostScript "distiller"», как сказано в man, т.е. конвртер из postscript в postscript. Файл получается в результате этой дистилляции другой. Совсем.
Если есть желание посмотреть, как cups преобразует многострадальный документ для печати: в /etc/cups/cupsd.conf установить параметр:
LogLevel debug
Трассировку смотреть в /var/log/cups/error_log
Пользователь решил продолжить мысль 19 Ноября 2009, 16:19:10:
P.S.
После изменения конфигурации, чтобы изменения вступили в силу, cups нужно хорошенько "испугать", например:
sudo invoke-rc.d cups restart