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

我需要将报告从Java桌面应用程序打印点阵打印机(Epson LX-300 II)。 报告由一些graphics组成。 打印机通过USB连接,我正在使用CUPS进行打印。 我使用Printable接口进行打印(在Java中是非常标准的)。

我的问题:

每台打印机的分辨率(60×60,120×60,120×72)都使文本打印质量非常低。 在某些打印机驱动程序中似乎没有任何字体暗示。 信件看起来非常丑陋。 我不能使用直接的文本输出(它看起来不错),因为我也需要在同一页上打印graphics。

似乎问题不在于Java,导致同一应用程序在Windows中打印高质量的文本和graphics。 此外,似乎问题不在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')可能存在问题。

这是输出的例子(抱歉的“移动” – 质量的照片):

在这里输入图像说明

我只是不知道发生了什么,请帮助我。

– PS我最后的解决scheme是使用“ESCPrinter.java”开放源代码类,并增加了根据Epson文档打印图像的function。

Solutions Collecting From Web of "在点阵式打印机上的Linux的Java打印质量"

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

从我的经验来看,这可能是因为字体不能被Java识别,并且默认为其他标准字体。

你需要把ttf文件放到$JAVA_HOME/jre/lib/font目录下

也许这些关于java字体和物理字体的文章可能会更有帮助

博士:这实际上是不可能的。 使用另一台打印机或切换到文本模式。 ]

点阵打印机,尤其是9针品种(如爱普生的LX系列),或多或少地针对文本打印进行了优化。 尽管可以打印图形,但其分辨率却非常低,比现在的标准打印机低得多。 在过去,您必须优化您的输出,以便从打印输出中获得最大的保真度; 没有一个人在正确的思维中试图在这些打印机上以图形模式打印文本,这实际上保证了不可读的输出。 打印机的内置字体经过优化以提高可读性,但是如果打印机驱动程序完成光栅化处理而不考虑打印机的特殊性,则结果必须不太理想。

像Epson的LX系列这样的9针打印机的分辨率就太低了。 除非以文本模式打印(如果您没有自己编写报告应用程序,这几乎是不可能的),否则您将无法获得更好的结果。 一个24针打印机将有足够的“保留”,仍然让你体面足够的打印输出,但9针打印机已经在其极限运行。

无论你使用字体暗示或其他任何技巧,除非你使用真正的大字体(字体足够大,以抵消打印机的低分辨率),否则就没有办法使用另一台打印机。 问题是光栅化,不能适应打印机的物理限制。

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

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