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')可能存在问题。

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

在此处输入图像描述

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

-- PS 我的最终解决方案是使用“ESCPrinter.java”开源类,根据爱普生文档添加打印图像的能力。

4

3 回答 3

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;
}
于 2012-01-28T04:20:24.580 回答
0

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

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

爱普生LX系列等9针打印机的分辨率太低了。除非您以文本模式打印(如果您自己没有构建该报告应用程序,那几乎是不可能的),您不会得到更好的结果。一台 24 针打印机将有足够的“储备”来为您提供足够体面的打印输出,但一台 9 针打印机已经在其极限范围内运行。

无论您使用字体提示或其他什么技巧,除非您使用非常大的字体(字体大到足以抵消打印机的低分辨率),否则您无能为力,除非使用另一台打印机。问题是光栅化,它不能满足打印机的物理限制。

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

这是来自经验:我仍然拥有一台 9 针打印机和几台 24 针打印机(都是爱普生),并且大多以文本模式驱动它们。我可以(并且确实)将 24 针打印机用作通用 Windows(或其他)打印机,但对于 9 针打印机,这实际上是不可行的。但是经过一番思考,我可以从中得到相当不错的结果,这需要在更“现代”的打印机上做更多的工作。

于 2013-12-22T00:00:19.397 回答
0

根据我的经验,这可能是因为 Java 无法识别字体,并且默认为其他标准字体。

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

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

于 2012-01-23T13:27:51.297 回答