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

时间:2012-01-23 10:04:20

标签: java linux printing ghostscript dot-matrix

我需要将报告从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

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

- 附:我的最终解决方案是使用'ESCPrinter.java'开源类,根据Epson文档为其添加打印图像的功能。

3 个答案:

答案 0 :(得分:1)

你可以试试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;
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

点阵式打印机,尤其是9针式打印机(如Epson的LX系列),或多或少地针对文本打印进行了优化。虽然 可以打印图形,但它们的分辨率非常低, 低于今天的标准打印机。过去,您必须优化输出,以便从打印输出中获得最大保真度;在他们正确的思想中没有人试图在这些打印机上以图形模式打印文本,这实际上保证了不可读的输出。打印机的内置字体针对可读性进行了优化,但如果光栅化是由打印机驱动程序完成的,而不考虑打印机的特殊性,则结果必须不太理想。

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

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

在点阵打印机上进行报告的'正确'方法是将任何可能的打印作为'纯'文本,利用各种ESC / P格式化命令,如粗体,下划线等。如果你需要图形,你将进入该特定图形的图形模式,然后继续在文本模式。打印机的内置字体被优化为尽可能可读,考虑到打印机操作方式的限制,尽管它是可能的定义你自己的。

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