linux下的Ghostscript:时间太宽了

时间:2011-06-10 07:55:37

标签: linux printing ghostscript cups

如何让Times在linux下打印? 我安装了debian wheezy linux,ghostscript,cups,mscorefonts。 但是当我打印时,我得到的时间太宽了,相比窗户,单字母间距太宽了。

有什么方法可以解决这个问题?

从同一Java小程序和Win和Lin上完成打印。 来自Lin变种的Postscript使用Times字体,来自Win变体的postscript使用TimesNewRomanPSMT字体。 只需更换字体名称即可更改它,但不会更改输出中的任何内容。

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

Debian Wheezy,Debian Squeeze,Ubuntu Natty检查为linux。 大多数支票都在Debian Wheezy。

的ghostscript:   安装:9.02~dfsg-2 太阳的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;"

打印结果Comparsion:http://piccy.info/code2/1652248/4b2c3b10f5316f9836496af5501892d1/

我在Linux系统上有Times New Roman字体!用于Windows的PDF是在linux上生成的,其中linux ghostscript来自windows机器上生成的postscript源。

例如,看一下右上角,写入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

如您所见,它选择大小为10.0的字体#29。字体#29是     / Times-Bold ISOF

而且,最糟糕的是,它已经写了两行 - 所以问题出现在java&lt; =&gt; cups connector中。

================== “相同的Java Applet”是互联网银行应用程序iBank2。

“时代”被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   ;
  

(顺便说一下,你在Windows上使用Ghostscript,还是你在那里打印本机打印机驱动程序?)   在Windows上我打印到PostScript本机驱动程序到.ps文件。

     

因此,它本身并不是Ghostscript问题......但它可能源自Win / Lin系统上的不同Java版本+配置。   它看起来像java中的打印问题,但这不依赖于java版本 - 都安装了最新的java6。

     

最有可能由您的Java小程序生成的PostScript,Ghostscript只是打印过程中的消费者。   通常,我只是想确保它为Times One使用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 applet在打印时发现字体太宽,并在生成时拆分......所以问题是 - 如何在系统中替换Times字体那个java打印会找到TimesNewRoman而不是Nimbus,并生成正确的输出吗?

1 个答案:

答案 0 :(得分:1)

根据我在屏幕截图中看到的, Win&lt; - &gt;林印刷差异......

  • ... NOT 来自 Times&lt; - &gt; TimesNewRomanPSMT 差异,
  • ...而是来自 [SomeTimes]&lt; - &gt; [SomeTimesBold] 2 PostScript输出中的差异
每个打印机队列(在Linux上很可能涉及Ghostscript安装)消耗的

。 (顺便说一下,你在Windows上使用Ghostscript,还是你在那里打印本机打印机驱动程序?)

所以它本身就是 NOT 一个Ghostscript问题......但它可能源于你的Win / Lin系统上不同的Java版本+配置。

您的Linux PostScript代码似乎使用/Times-Bold (ISOF????)字体这一事实超出了Ghostscript的职责范围。 PostScript很可能是由Java applet生成的,而Ghostscript只是在打印过程中的消费者。

我认为你提到的这个不祥的ISOF不是fontname的一部分,而是PostScript程序,必须在PostScript文件的其他地方预先定义并应用于/Times-Bold字体。它可能是一个将原始字体重新编码为ISOLatin1Encoding ...

的过程

您说您可以访问这两种字体文件(Windows上的 TimesNewRomanPS-BoldMT 和Linux上的 Times-Bold )。如果是这样,则将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(Times-fontfile-sample.pdf)将表示字体文件中包含的每个字形的表格样本,这些字形将映射到相应的Unicode代码点部分。

您可以使用这些PDF来显示两种字体之间的最小视觉差异(但我敢打赌,您的差异会相当明显)。

如果你的Debian中没有安装pdfoutlinefntsample,只需运行sudo apt-get install fntsample ...


更新2(考虑更新的问题说明):

datacompboy现在提供了一个包含这4个文件的tarball:

-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可以在Linux Ghostscript上运行Windows生成的PS文件,如下所示:

gs winout.ps

如果它呈现OK(即:与winout.pdf相同),那么GS字体映射没有问题,但是winout / linout.ps中的实际文件差异存在问题。从那里开始,应该很容易继续分析。

不幸的是,现在我无法自己运行测试。


更新3:

datacompboy的PDF文件linout.pdfwinout.pdf有一个巨大的区别:Linux版本没有嵌入字体,而Windows版本有......结果是任何后方消费者{ {1}}在显示,打印,转换或处理与该字体有关的文件时会产生相当随意的结果。

所以这是另一个我能想到的测试。它检查用于linout.pdf(由Ghostscript替换为真实/Times-Bold)和/ TimesNewRomanPS-BoldMT`的字体的Linux版本在字体度量方面有多大差异。

使用这些Ghostscript命令行创建三个不同的PDF:

<强> a.pdf:

/NimbusRomNo9L-Medi

<强> b.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"

<强> C.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"

gs \ -o c.pdf \ -sDEVICE=pdfwrite \ -dPDFSETTINGS=/prepress \ -c "100 700 moveto \ /Times-Bold findfont \ 12 scalefont \ setfont \ (0401060 0401060 0401060 0401060) show \ showpage" 参数应强制将字体嵌入到输出PDF中。 (这很重要,否则观众可以使用任意替换字体来显示PDF。)

-dPDFSETTINGS=/prepress参数后面是一个为PDF页面提供内容的小PostScript代码段。

文件'a.pdf'和'b.pdf'不应该有所不同。他们只测试-c/TimesNewRoman,Bold之间的字体别名是否确实按预期工作。

文件'c.pdf'与 a.pdf b.pdf 在这里和那里按几个像素的顺序显示略有差异,但<测试字符串的 跟踪 中的strong> NOT

如果此测试按预期进行,则不同的字体文件,Fontmap.GS和Ghostscript本身都可以。那么问题只在于Linux Java applet产生输出的方式(PS或PDF)。