首页 文章

Linux上点阵打印机的Java打印质量

提问于
浏览
4

我需要将报告从Java桌面应用程序打印到点阵打印机(Epson LX-300 II) . 报告包含文字和一些图形 . 打印机通过USB连接,我正在使用CUPS进行打印 . 我正在使用Printable接口进行打印(在Java中非常标准) .

我的问题:

每个打印机分辨率(60x60,120x60,120x72)的文本打印质量都非常低 . 似乎某些打印机驱动程序中没有字体提示 . 信件看起来很难看 . 我不能使用直接文本输出端口(它看起来很棒),因为我还需要在同一页面上打印图形 .

似乎问题不在Java中,导致相同的应用程序在Windows中打印出高质量的文本和图形 . 此外,似乎问题不在CUPS系统中,因为OpenOffice或Abiword使用相同的字体打印相同的文本,质量非常好(比在Windows中更差但仍然很好) .

问题也不在于字体:我从Windows尝试了Tahoma字体,它也是这样:在java / linux中打印时质量低 .

问题不在于X.Org中的BCI提示,在屏幕上显示效果很好 .

当我将任何文档从OpenOffice导出到PDF并打印该PDF时,我得到了同样的效果 - 纸上的丑陋的未提示字体 . 如果从Office打印同一文档,一切正常 .

我尝试了不同的Linux(KUbuntu 10.04,Puppy 2,Puppy 4.3.1),我在任何Linux上都有同样的效果 .

也许问题出在Ghostscript中,我在Puppy上获得了9.x版本,但仍然是相同的 . 或者我认为CUPS光栅化器('rastertoepson'或'foomatic-rip')可能存在问题 .

这是输出的例子(对不起“移动” - 质量照片):

enter image description here

我不知道发生了什么事,请帮帮我 .

  • P.S.我的最终解决方案是使用'ESCPrinter.java'开源类,根据Epson文档添加打印图像的功能 .

3 回答

  • 0

    你可以试试 setRenderingHint ;将一些调用复制在一起以便于输入 . 也许它是TEXT_ANTIALIASING,但我不会排除其他人 .

    另一个想法是,某个地方的屏幕分辨率会缩放到打印分辨率;一个小的Java应用程序与自己动手打印将显示 .

    你没有做 rotate ,是吗? (只是看到照片) .

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        Graphics2D g = (Graphics2D) graphics;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
        return Printable.PAGE_EXISTS;
    }
    
  • 0

    从我的经验来看,这可能是因为Java无法识别字体,并且它默认为其他标准字体 .

    您需要将ttf文件放入 $JAVA_HOME/jre/lib/font 目录

    也许java fontsphysical fonts上的这些文章可能更有帮助

  • 1

    [tl;博士:这几乎是不可能的 . 使用其他打印机或切换到文本模式 . ]

    点阵式打印机,尤其是9针式打印机(如Epson的LX系列),或多或少地针对文本打印进行了优化 . 虽然可以打印图形,但它们的分辨率非常低,比现在低得多's standard printers. In times past, you had to optimise your output such as to get maximum fidelity from your printout; nobody in their right mind would have tried to print text in graphics mode on those printers, which practically guarantees an unreadable output. The printer' s内置字体针对可读性进行了优化,但如果光栅化是由打印机驱动程序完成的,而不考虑打印机的特性,结果必须不太理想 .

    爱普生LX系列等9针打印机的分辨率太低了 . 除非你以文本模式打印(如果你自己没有构建那个报告应用程序,那几乎是不可能的),你将无法获得更好的结果 . 24针打印机有足够的“储备”,仍然可以让你得到足够的打印输出,但9针打印机已经在其极限运行 .

    无论你使用字体提示还是其他任何技巧,除非你使用非常大的字体(字体足够大以抵消打印机的低分辨率),除了使用另一台打印机之外,你无能为力 . 问题是光栅化,这不符合打印机的物理限制 .

    ('correct'在点阵打印机上做报告的方法是打印任何可能的'pure'文本,利用各种ESC / P格式化命令,如粗体,下划线等 . 如果你需要图形,你会进入图形模式对于那个特定的图形,然后继续在文本模式 . 打印机的内置字体被优化为尽可能可读,考虑到打印机操作方式的限制,虽然可以定义自己的 . )

    这是来自经验:我仍然拥有一个9针和几个24针打印机(所有Epsons),并且主要是在文本模式下驱动它们 . 我可以(并且确实)将24针打印机用作通用Windows(或其他)打印机,但使用9针打印机,这实际上是不可行的 . 但是有了一些想法,我可以从中获得相当不错的结果,这需要在更“现代”的打印机上做更多的工作 .

相关问题