2013-08-07 2 views
4

Я печатаю ряд прямоугольников, которые я рисую на экране. Прямоугольники перекрываются так, что они выглядят как сетка строк и столбцов. На экране все выглядит так, как ожидалось.Java Printing Graphics Uniformity

Я пробовал различные способы печати (внедрение печати), но я не могу получить то же качество.

  • Использование метода печати JComponents является зернистым (даже при буферизации).
  • Перерисовывание непосредственно на метод печати Графический объект вызывает более темные линии, где перекрываются прямоугольники, и более легкие линии там, где они отсутствуют (независимо от альфа-композита). Я пробовал различные методы рендеринга с помощью этого метода.
  • Печать сконфигурированного буферизованного изображения непосредственно на графике печати обеспечивает неизменное качество, но некоторые линии кажутся толще других, так что целая колонка или ряд будет иметь одну плотную границу вдоль одной стороны. Кто-нибудь знает, почему это может случиться?

 

@Override 
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) 
     throws PrinterException { 
    if(pageIndex > 2) { 
     return Printable.NO_SUCH_PAGE; 
    } 

    RepaintManager currentManager = RepaintManager.currentManager(this); 
    currentManager.setDoubleBufferingEnabled(false); 

    Graphics2D g2d = (Graphics2D) graphics; 
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
      RenderingHints.VALUE_RENDER_QUALITY); 
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
      RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, 
      RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, 
      RenderingHints.VALUE_DITHER_ENABLE); 
    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 
      RenderingHints.VALUE_STROKE_NORMALIZE); 
    g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
           RenderingHints.VALUE_FRACTIONALMETRICS_ON);  

    g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
    g2d.scale(.5, .5);  
    if(pageIndex == 0) { 
     this.paint(g2d); 
    } else if(pageIndex == 1) { 
     g2d.drawImage(onScreenBuffer, null, 0, 0); 
    } else { 
     g2d.setColor(new Color(51, 98, 140)); 
     g2d.setStroke(new BasicStroke(1f)); 
     //GridCell inherits from Rectangle2D.Double 
     for (final GridCell cell : model.getCells()) { 
      g2d.draw(cell); 
     } 
    } 
    return Printable.PAGE_EXISTS; 
} 
+0

Проверьте, как вы построение буферизованного изображения, особенно любое DrawLine или методов FillRect. Как вы говорите, построение собственного буферизованного изображения даст самые последовательные результаты печати. –

+0

пожалуйста, почему currentManager.setDoubleBufferingEnabled (false); – mKorbel

+0

@mrKorbel - Я читал, что двойная буферизация JComponents может негативно повлиять на печать при вызове JComponent.print(). – Dodd10x

ответ

1

У меня было довольно много с той же проблемой. Невозможно вспомнить все детали, но главным вопросом является печать DPI. Вам необходимо убедиться, что вы печатаете с использованием максимально возможного DPI, но не DPI по умолчанию, который по умолчанию.

(BTW, вам нужно будет сгенерировать свою графику с большим разрешением DPI).

Существует javax.print.attribute.standard.PrinterResolution:

Класс PrinterResolution является классом атрибута печати, который определяет точное разрешение, поддерживаемое принтером или использоваться для печати работы. Этот атрибут предполагает, что принтеры имеют небольшой набор устройств , на которых они могут работать, а не континуум. не

PrinterResolution используется несколько способов:

  1. пропускается
  2. Когда клиент должен напечатать задание с использованием нужного разрешения клиента точно (не больше, не меньше), клиент не указует экземпляра класса PrinterResolution как атрибут задания печати. Это не удастся, если задание на печать не поддерживает это точное разрешение, и Fidelity установлено равным true.

Есть много примеров, доступных, например: Printing to Hard-Printer in java with 300dpi