点阵打印机上 Linux 中的 Java 打印质量
Posted
技术标签:
【中文标题】点阵打印机上 Linux 中的 Java 打印质量【英文标题】:Java printing quality in Linux on dot-matrix printer 【发布时间】:2012-01-23 10:04:20 【问题描述】:我需要将报告从 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')可能存在问题。
这是输出示例(对不起“移动”质量的照片):
我只是不知道发生了什么,请帮帮我。
-- 附:我的最终解决方案是使用“ESCPrinter.java”开源类,为其添加根据 Epson 文档打印图像的功能。
【问题讨论】:
【参考方案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;
【讨论】:
谢谢!我会在星期一试试。我没有旋转输出,只是重新使用同一张纸进行测试,并且纸有时会以某个角度滑出。【参考方案2】:根据我的经验,这可能是因为 Java 无法识别字体,并且默认为其他标准字体。
您需要将 ttf 文件放入 $JAVA_HOME/jre/lib/font
目录
也许java fonts 和physical fonts 上的这些文章可能会更有帮助
【讨论】:
感谢您的评论!我正在使用列出 Java 的所有可用字体的代码。字体与 Windows 中的字体外观相同,除了丑陋的无提示形状。此外,当我从任何应用程序打印任何 PDF 时,都会创建相同的无提示形状字体,所以我最终认为 Ghostscript 光栅化的某个地方存在这个问题。【参考方案3】:[ tl;dr:这几乎是不可能的。使用另一台打印机或切换到文本模式。 ]
点阵打印机,尤其是 9 针品种(例如 Epson 的 LX 系列),或多或少都针对文本打印进行了优化。虽然可以打印图形,但它们的分辨率非常低,远低于当今的标准打印机。在过去,您必须优化输出,例如从打印输出中获得最大保真度;没有人会尝试在这些打印机上以图形模式打印文本,这实际上保证了不可读的输出。打印机的内置字体已针对可读性进行了优化,但如果由打印机驱动程序完成光栅化而不考虑打印机的特殊性,则结果必须不太理想。
9 针打印机(例如 Epson 的 LX 系列)的分辨率太低了。除非您以文本模式打印(如果您自己没有构建该报告应用程序,那几乎是不可能的),您不会得到更好的结果。 24 针打印机将有足够的“储备”,仍然可以为您提供足够体面的打印输出,但 9 针打印机已经在其极限范围内运行。
无论您使用字体提示或其他什么技巧,除非您使用非常大的字体(字体大到足以抵消打印机的低分辨率),否则您无能为力,只能使用另一台打印机。问题在于光栅化,它无法适应打印机的物理限制。
( 在点阵打印机上做报告的“正确”方法是打印任何可能的“纯”文本,利用各种 ESC/P 格式化命令,例如粗体、下划线等。如果您需要图形,您将进入该特定图形的图形模式,然后在文本模式下继续。考虑到打印机操作方式的限制,打印机的内置字体经过优化,尽可能易读,尽管这是可能的定义你自己的。)
这是经验之谈:我仍然拥有一台 9 针打印机和几台 24 针打印机(都是 Epsons),并且主要以文本模式驱动它们。我可以(并且确实)将 24 针打印机用作通用 Windows(或其他)打印机,但对于 9 针打印机,这实际上是不可行的。但经过一番思考,我可以从中得到相当不错的结果,这需要在更“现代”的打印机上做更多的工作。
【讨论】:
以上是关于点阵打印机上 Linux 中的 Java 打印质量的主要内容,如果未能解决你的问题,请参考以下文章