Качество печати Java в Linux на матричном принтере - PullRequest
4 голосов
/ 23 января 2012

Мне нужно распечатать отчет из настольного Java-приложения на матричном принтере (Epson LX-300 II). Отчет состоит из текста и графики. Принтер подключен через USB, и я использую CUPS для печати. Я печатаю, используя интерфейс Printable (довольно стандартный в Java).

Моя проблема:

Качество печати текста очень низкое на всех разрешениях принтера (60x60, 120x60, 120x72). Кажется, что в каком-то драйвере принтера вообще нет намека на шрифт. Письма выглядят очень некрасиво. Я не могу использовать прямой вывод текста в порт (он выглядит великолепно), потому что мне нужно также печатать графику на той же странице.

Кажется, что проблема не в Java, потому что одно и то же приложение печатает высококачественный текст и графику в Windows. Также кажется, что проблема не в системе CUPS, потому что OpenOffice или Abiword печатает один и тот же текст с теми же шрифтами с очень хорошим качеством (хуже, чем в Windows, но все же хорошо).

Также проблема не в шрифтах: я пробовал шрифт Tahoma из Windows, и он делает то же самое: низкое качество при печати в java / linux.

Проблема не в BCI-хинтинге в X.Org, а отображение на экране выглядит великолепно.

Когда я экспортирую любой документ из OpenOffice в PDF и распечатываю этот PDF, я получаю тот же эффект - уродливые не намекающие шрифты на бумаге. Если тот же документ напечатан из Office, все в порядке.

Я пробовал разные Linux (KUbuntu 10.04, Puppy 2, Puppy 4.3.1), и я получил тот же эффект на любом Linux.

Возможно, проблема в Ghostscript, у меня есть версия 9.x на Puppy и все та же. Или также я думаю, что может быть проблема с растеризатором CUPS ('rastertoepson' или 'foomatic-rip').

Это пример вывода (извините за качественное фото с мобильного телефона):

enter image description here

Я просто понятия не имею, что происходит, помогите мне, пожалуйста.

- Постскриптум Мое окончательное решение - использовать класс с открытым исходным кодом ESCPrinter.java, добавив к нему возможность печати изображений в соответствии с документацией Epson.

Ответы [ 3 ]

1 голос
/ 28 января 2012

Вы можете попробовать 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 голосов
/ 22 декабря 2013

[tl; dr: это практически невозможно. Используйте другой принтер или переключитесь в текстовый режим. ]

Матричные принтеры, особенно 9-контактные (например, серия Epson LX), более или менее оптимизированы для печати текста. Хотя позволяет печатать графику, их разрешение действительно низкое, намного ниже, чем у современных стандартных принтеров. В прошлом вам приходилось оптимизировать вывод, чтобы получить максимальную точность от распечатки; никто в здравом уме не пытался бы печатать текст в графическом режиме на этих принтерах, что практически гарантирует нечитаемый вывод. Встроенные в принтер шрифты оптимизированы для удобочитаемости, но если растеризация выполняется драйвером принтера без учета особенностей принтера, результат должен быть менее оптимальным.

Разрешение 9-контактных принтеров, таких как серия Epson LX, слишком низкое для этого. Если вы не печатаете в текстовом режиме (что, если вы сами не создавали это приложение для составления отчетов, практически невозможно), вы не получите лучшего результата. У 24-контактного принтера будет достаточно «резерва», чтобы вы могли получить достаточно приличную распечатку, но 9-контактный принтер уже работает на пределе своих возможностей.

Независимо от того, что вы делаете с подсказками шрифтов или чем-то еще, если только вы не используете действительно большие шрифты (где шрифт достаточно большой, чтобы компенсировать низкое разрешение принтера), вы ничего не можете сделать, кроме использования другого принтера. Проблема заключается в растеризации, которая не может соответствовать физическим ограничениям принтера.

( «Правильный» способ создания отчетов на матричном принтере состоит в том, чтобы печатать все, что возможно, в виде «чистого» текста, используя различные команды форматирования ESC / P, такие как жирный шрифт, подчеркивание и т. Д. Если вам нужна графика, вы должны войти в графический режим для этой конкретной графики, а затем продолжить в текстовом режиме. Встроенные шрифты принтера оптимизированы для максимально удобного чтения, учитывая ограничения работы принтера, хотя это возможно определить свой собственный. )

Это из опыта: у меня все еще есть 9-контактный и несколько 24-контактных принтеров (все Epsons), и я в основном использую их в текстовом режиме. Я могу (и могу) использовать 24-контактный принтер в качестве обычного принтера для Windows (или любого другого), но с 9-контактным принтером это практически невозможно. Но, подумав, я могу получить из них довольно хорошие результаты, которые потребуют гораздо больше работы над более «современными» принтерами.

0 голосов
/ 23 января 2012

Насколько я знаю, это может быть из-за того, что шрифты не распознаются Java, и по умолчанию используются другие стандартные шрифты.

Вам нужно поместить файлы ttf в каталог $JAVA_HOME/jre/lib/font * 1004.*

Возможно, эти статьи о java-шрифтах и физических шрифтах могли бы помочь

...