首页 文章

Linux下的Ghostscript:时间太广了

提问于
浏览
2

如何让时代在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 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/

我在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后记代码:

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 <=> cups连接器中 .

==================“相同的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 . PostScript很可能是由你的Java applet生成的,而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 回答

  • 1

    从我在截图中看到的,你的Win < - > Lin打印差异......

    • ...做 NOT 源于Times < - > TimesNewRomanPSMT的差异,

    • ...而是来自[SomeTimes] < - > [SomeTimesBold] 2 PostScript输出中的差异

    每个打印机队列消耗的(在Linux上很可能涉及Ghostscript安装) . (顺便说一下,你在Windows上使用Ghostscript,还是你在那里打印本机打印机驱动程序?)

    所以它本身并不是一个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 ...


    Update 2 (taking into account the updated problem description):

    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中的实际文件差异存在问题 . 从那里开始,应该很容易继续分析 .

    不幸的是,现在我不能自己运行测试 .


    Update 3:

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

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

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

    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在这里和那里的几个像素的顺序相比可能会略有差异,但在测试字符串的 tracking 中却是 NOT .

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

相关问题