Ghostscript под Linux: слишком широкий диапазон

#linux #printing #ghostscript #cups

#linux #печать #ghostscript #cups

Вопрос:

Как сделать так, чтобы время печати под Linux работало? У меня установлен debian wheezy linux, ghostscript, cups, mscorefonts. Но когда я печатаю, я получаю слишком большие значения по сравнению с Windows one — интервал между буквами слишком большой.

Есть способ решить эту проблему?

Печать выполняется из одного и того же Java-апплета и на Win, и на Lin. В Postscript из варианта Lin используются шрифты Times, в postscript из варианта Win используется шрифт TimesNewRomanPSMT. Просто замена названия шрифта изменяет его, но ничего не меняет в выводе.

=================

Debian Wheezy, Debian Squeeze, Ubuntu Natty проверены как linux. Большинство проверок было в Debian Wheezy.

ghostscript: Установлен: 9.02 ~ dfsg-2 sun-java6-jre: Установлен: 6.26-1 cups-pdf printer.

PPD — это PDF.ppd:

 *PCFileName:    "CUPS-PDF.PPD"
*Manufacturer:  "Generic"
*Product:   "(CUPS v1.1)"
*ModelName:     "Generic CUPS-PDF Printer"
*ShortNickName: "Generic CUPS-PDF Printer"
*NickName:      "Generic CUPS-PDF Printer"
*1284DeviceID:  "MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:POSTSCRIPT;"
  

Сравнение результатов печати:http://piccy.info/code2/1652248/4b2c3b10f5316f9836496af5501892d1

У меня есть шрифт Times New Roman в системе Linux! PDF для Windows был создан в Linux с помощью Linux ghostscript из исходного кода postscript, созданного на компьютере с Windows.

Например, взгляните в правый верхний угол, где написано 0401060. Код Windows postscript:

 %%IncludeResource: font TimesNewRomanPS-BoldMT
F /F1 0 /256 T /TimesNewRomanPS-BoldMT mF 
/F1S53 F1 [83 0 0 -83 0 0 ] mFS
F1S53 Ji 
4292 333 M (0401060)[42 42 42 42 42 42  0]xS 
N 367 367 M 1192 367 I K 
N 1667 367 M 2492 367 I K 
51282 VM?
  

linux postscript-код:

 10.0 29 F
<303430313036> 37.44 526.0 52.0 S
10.0 29 F
<30> 6.24 541.0 62.0 S
N
  

как вы можете видеть, он выбирает шрифт # 29 размером 10.0. Шрифт # 29 — это
/Раз-Выделенный жирным шрифтом ISOF

и, что хуже всего, он уже записывает две строки — значит, проблема где-то в java<=> cups connector.

================== » Тот же Java-апплет» является приложением интернет-банка iBank2.

«Times» заменяется Ghostscript на Nimbus, а не на TimesNewRoman:

 ./Init/Fontmap.GS:/Times-Roman          /NimbusRomNo9L-Regu ;
./Init/Fontmap.GS:/Times-Italic         /NimbusRomNo9L-ReguItal ;
./Init/Fontmap.GS:/Times-Bold           /NimbusRomNo9L-Medi ;
./Init/Fontmap.GS:/Times-BoldItalic     /NimbusRomNo9L-MediItal ;
./Init/Fontmap.GS:/TimesNewRoman                /TimesNewRomanPSMT      ;
./Init/Fontmap.GS:/TimesNewRoman,Bold           /TimesNewRomanPS-BoldMT     ;
./Init/Fontmap.GS:/TimesNewRoman,Italic         /TimesNewRomanPS-ItalicMT   ;
./Init/Fontmap.GS:/TimesNewRoman,BoldItalic     /TimesNewRomanPS-BoldItalicMT   ;
  

(Кстати, вы вообще используете Ghostscript в Windows, или ваша печать там выполняется через собственный драйвер принтера?)
В Windows я печатаю в собственном драйвере PostScript для файла .ps.

Так что это НЕ проблема Ghostscript как таковая… но, возможно, это происходит из разных версий Java конфигураций в ваших системах Win / Lin. Похоже, что проблема в java при печати, но это не зависит от версии java — у обоих установлена последняя версия java6.

Этот PostScript, скорее всего, генерируется вашим Java-апплетом, и Ghostscript является его потребителем только в процессе печати. Обычно я просто хочу убедиться, что он использует шрифт TimesNewRoman для Times one, а не Nimbus. И мне не удалось это сделать.

Макрос ISOF, созданный при печати, является:

 /ISOF {
     dup findfont dup length 1 add dict begin {
             1 index /FID eq {pop pop} {D} ifelse
     } forall /Encoding ISOLatin1Encoding D
     currentdict end definefont
} BD
  

Вот вырезка начальных файлов и сгенерированный результирующий PDF: http://datacompboy.ru/u/smpl.tar.bz2

Если это так, то скопируйте файл Windows fontfile в Linux.

это уже копия файла Windows. msttcorefonts идентичны одному, распространяемому с Windows.

Поскольку в сгенерированном файле postscript уже 0401060 разделен на две строки, это означает, что Java-апплет при печати обнаружил, что шрифт слишком широкий, и разделил его при генерации… Итак, вопрос — как заменить шрифт Times в системе, чтобы java printing находил TimesNewRoman вместо Nimbus и генерировал правильный вывод?

Комментарии:

1. @datacompboy: Какую версию Linux вы используете? Какая версия Ghostscript установлена? Какая версия Java? На какой модели принтера вы печатаете? Какой «драйвер» (== PPD-файл) ваш CUPS использует для этого принтера? Можете ли вы предоставить скриншоты двух отличающихся результатов? Что именно представляет собой «какой-то Java-апплет, из которого вы печатаете? — Не могли бы вы, пожалуйста, быть так любезны и отредактировать свой вопрос, чтобы добавить эту информацию?

2. я добавил ответы на ваш вопрос.

3. Я рекомендую использовать чисто Java-решение: посмотрите на iText. Он генерирует PDF с гораздо более высоким уровнем контроля и является более переносимым, чем postscript и cups.

4. @datacompboy: Из того, что я вижу на скриншоте, ваши различия в печати Win <—> Lin не связаны с различиями Times <—> TimesNewRomanPSMT, а скорее с [иногда] <—> [иногда в разы] различиями. Так что это НЕ проблема Ghostscript как таковая…

5. @Pindatjuh извините, но я не управляющий апплет — его сторонний банковский клиент.

Ответ №1:

Из того, что я вижу на скриншоте, ваши различия в печати Win <—> Lin

  • не возникают в Times <—> TimesNewRomanPSMT различия,
  • … но скорее происходит из [иногда] <—> [иногда много] различий в двух выходных данных PostScript

это потребляется каждой очередью принтеров (что в Linux, скорее всего, связано с установкой Ghostscript). (Кстати, вы вообще используете Ghostscript в Windows, или ваша печать там выполняется через собственный драйвер принтера?)

Так что это НЕ проблема Ghostscript как таковая… но это, возможно, происходит из разных версий Java конфигураций в ваших системах Win / Lin.

Тот факт, что в вашем коде Linux PostScript, похоже, используется /Times-Bold (ISOF????) шрифт, выходит за рамки ответственности Ghostscript. Этот PostScript, скорее всего, генерируется вашим Java-апплетом, и Ghostscript является его потребителем только в процессе печати.

Мне кажется, что это зловещее, ISOF о котором вы упомянули, не является частью fontname, а процедурой PostScript, которая должна быть предварительно определена в другом месте файла PostScript и применяется к /Times-Bold шрифту. Вероятно, это процедура, которая перекодирует исходный шрифт в ISOLatin1Encoding…

Вы говорите, что у вас есть доступ к обоим файлам шрифтов (TimesNewRomanPS-BoldMT в Windows и Times-Bold в Linux). Если это так, то скопируйте файл Windows fontfile в Linux. Затем, чтобы проверить визуальные различия между двумя шрифтами, выполните эти две команды для каждого из файлов шрифтов:

 fntsample 
   -f /path/to/Times-fontfile.suffix 
   -o Times-fontfile.suffix.pdf 
   -l 
    > Times-fontfile.suffix.txt
  

и затем

 pdfoutline 
   Times-fontfile.suffix.pdf 
   Times-fontfile.suffix.txt 
   Times-fontfile-sample.pdf
  

Результирующие PDF-файлы, Times-fontfile-sample.pdf, будут представлять собой табличный образец каждого глифа, содержащегося в файлах шрифтов, и они будут сопоставлены с соответствующими разделами кодовых точек Unicode.

Вы можете использовать эти PDF-файлы, чтобы выявить даже минимальные визуальные различия между двумя шрифтами (но я уверен, что ваши различия будут довольно вопиющими).

В случае, если у вас не установлен pdfoutline и fntsample в вашем Debian, просто запустите sudo apt-get install fntsample


Обновление 2 (с учетом обновленного описания проблемы):

datacompboy теперь предоставил архив, содержащий эти 4 файла:

 -rw-r--r-- datacompboy/datacompboy 37722 2011-06-22 08:54 smpl/linout.ps
-rw-r--r-- datacompboy/datacompboy 15324 2011-06-22 08:54 smpl/linout.pdf
-rw-r--r-- datacompboy/datacompboy 54422 2011-06-22 08:57 smpl/winout.pdf
-rw-r--r-- datacompboy/datacompboy 99099 2011-06-22 08:56 smpl/winout.ps
  

С помощью этих файлов должно быть очень легко определить причину проблемы. Если datacompboy может запустить PS-файл, сгенерированный Windows, в Linux Ghostscript, вот так:

 gs winout.ps
  

и если он отображается нормально (т. Е. Так же, как winout.pdf), то проблем с отображением шрифтов GS нет, но проблема с фактическими различиями файлов в winout / linout.ps. Оттуда должно быть довольно легко продолжить анализ.

К сожалению, прямо сейчас я не могу запустить тест самостоятельно.


Обновление 3:

PDF-файлы datacompboy linout.pdf и winout.pdf имеют одно огромное отличие: в версии Linux шрифт не встроен, в то время как в версии Windows он есть… Следствием этого является то, что любой последующий пользователь linout.pdf будет выдавать довольно произвольные результаты при отображении, печати, преобразовании или обработке этого файла в отношении шрифта.

Итак, вот еще один тест, который я могу придумать. Проверяется, насколько версии шрифтов для Linux, используемые для /Times-Bold (которые заменяются Ghostscript на real /NimbusRomNo9L-Medi ) и /TimesNewRomanPS-BoldMT`, отличаются в своих показателях шрифта.

Создайте три разных PDF-файла с помощью этих командных строк Ghostscript:

a.pdf:

 gs 
 -o a.pdf 
 -sDEVICE=pdfwrite 
 -dPDFSETTINGS=/prepress 
 -c "100 700 moveto 
     /TimesNewRoman,Bold findfont 
     12 scalefont 
     setfont 
     (0401060 0401060 0401060 0401060) show 
     showpage"
  

b.pdf:

 gs 
 -o b.pdf 
 -sDEVICE=pdfwrite 
 -dPDFSETTINGS=/prepress 
 -c "100 700 moveto 
     /TimesNewRomanPS-BoldMT findfont 
     12 scalefont 
     setfont 
     (0401060 0401060 0401060 0401060) show 
     showpage"
  

c.pdf:

 gs 
 -o c.pdf 
 -sDEVICE=pdfwrite 
 -dPDFSETTINGS=/prepress 
 -c "100 700 moveto 
     /Times-Bold findfont 
     12 scalefont 
     setfont 
     (0401060 0401060 0401060 0401060) show 
     showpage"
  

-dPDFSETTINGS=/prepress Параметр должен обеспечивать внедрение шрифта в выходные PDF-файлы. (Это важно, иначе программа просмотра могла бы использовать произвольный заменяющий шрифт для отображения PDF.)

За -c параметром следует небольшой фрагмент PostScript, который предоставляет содержимое для страницы PDF.

Файлы ‘a.pdf’ и ‘b.pdf’ не должны отличаться. Они только проверяют, действительно ли псевдоним шрифта между /TimesNewRoman,Bold и /TimesNewRomanPS-BoldMT работает так, как ожидалось.

Файл ‘c.pdf’ может иметь небольшие отличия по сравнению с a.pdf и b.pdf порядка нескольких пикселей здесь и там, но НЕ в отслеживании тестируемой строки.

Если этот тест проходит так, как предсказывалось, разные файлы шрифтов, карта шрифтов.С GS и самим Ghostscript все в порядке. Тогда проблема заключается только в том, как Java-апплет Linux выдает свои выходные данные (PS или PDF).

Комментарии:

1. Я добавил ответ в основной вопрос

2. Создание.pdf: Загрузка нового шрифта ROMANPS-BoldMT из /usr/share/fonts/truetype/msttcorefonts/timesbd.ttf … 3915624 2328392 2502500 1171333 1 выполнено. Генерация b.pdf: Загрузка нового шрифта ROMANPS-BoldMT из /usr/share/fonts/truetype/msttcorefonts/timesbd.ttf … 3915624 2328392 2502500 1171241 1 выполнено. Создание c.pdf: Загрузка шрифта NimbusRomNo9L-Medi из /usr/share/ghostscript/9.02/Resource/Font/NimbusRomNo9L-Medi … 3957592 2476560 1889592 600136 1 выполнено.

3. Отображаются PDF-файлы: IDRQJP TimesNewRoman, шрифт TrueType, выделенный жирным шрифтом, да, да 8 0 IDRQJP TimesNewRomanPS-шрифт TrueType, выделенный жирным шрифтом, да, да 8 0 IDRQJP Times-шрифт, выделенный жирным шрифтом, 1C да, да нет 8 0

4. a.pdf, b.pdf, c.pdf отличаются (20100, 20108, 3655 байт). визуально они выглядят близко друг к другу. И они отличаются от того, который сгенерирован при печати

5. datacompboy.ru/u/pdfs.tar.bz2 — здесь сгенерированные файлы. итак, есть ли способ переопределить системные шрифты, чтобы java видела правильный для печати? похоже, что он использует что-то не так, игнорируя системные шрифты и в результате .ps содержит ссылку на системный шрифт, но результат странный и широкий