Ghostscript под Linux: времена слишком широкие - PullRequest
2 голосов
/ 10 июня 2011

Как заставить Times работать на печать под linux?У меня установлены Debian Wheezy Linux, Ghostscript, чашки, Mscorefonts.Но когда я печатаю, я получаю слишком широкое Времена по сравнению с односимвольными интервалами в окнах.

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

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

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

Debian Wheezy, Debian Squeeze, UbuntuНатти проверил как 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.PostScript-код Windows:

%%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 - это / Times-Bold ISOF

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

================== "Тот же 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 - только его потребителькогда это проходит процесс печати.Обычно я просто хочу убедиться, что для Times используется шрифт TimesNewRoman, а не 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 в Linux.

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

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

1 Ответ

1 голос
/ 21 июня 2011

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

  • ... do NOT происходят из Times <-> TimesNewRomanPSMT различия,
  • ... а скорее из [SomeTimes] <-> [SomeTimesBold] различия в 2 выходных данных PostScript

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

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

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

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

Вы говорите, что у вас есть доступ к обоим файлам шрифтов ( TimesNewRomanPS-BoldMT в Windows и Times-Полужирный в Linux).Если это так, скопируйте файл шрифтов Windows в 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-файлы, время-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 может запустить сгенерированный Windows файл PS на Linux Ghostscript, например:

gs winout.ps

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

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


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

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

Итак, вот еще один тест, о котором я могу подумать.Он проверяет, насколько версии Linux для шрифтов, используемых для /Times-Bold (который заменяется Ghostscript на реальный /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 в порядке нескольких пикселей здесь и там, но НЕ в отслеживании изпроверенная строка.

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

...