2013-08-07 81 views
4

我正在打印一些在屏幕上繪製的矩形。矩形重疊,看起來像一個行和列的網格。一切都如預期般出現在屏幕上。Java打印圖形的均勻性

我試過各種方式來打印(實現打印),但我無法獲得相同的質量。

  • 使用JComponents打印方法很有顆粒感(即使有緩衝關閉)。
  • 直接重繪到打印方法圖形對象會導致矩形重疊處的較暗線條,以及它們不會重合的較淺線條(無論是否使用Alpha合成)。我用這種方法嘗試了各種RenderingHints。
  • 將構造好的緩衝圖像直接打印到打印圖形可以提供一致的質量,但某些線條比其他線條顯得更粗,因此整個列或行將沿着一條邊有一個厚邊框。有誰知道爲什麼會發生這種情況?

 

@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屏幕。

(順便說一下,您需要生成帶有更大DPI的圖形)。

javax.print.attribute.standard.PrinterResolution

類PrinterResolution是打印屬性類,指定 通過打印機或用於打印 工作支持的精確分辨率。此屬性假設打印機有一小部分設備可以運行,而不是連續運行。

PrinterResolution用於以多種方式:

  1. 跳過
  2. 當一個客戶端需要使用客戶端的期望 分辨率正好打印作業(無多,不會少),客戶端指定的 實例PrinterResolution類作爲Print Job的一個屬性。 如果打印作業不支持該確切分辨率,則此操作將失敗, 且Fidelity設置爲true。

有很多可用的例子,例如:Printing to Hard-Printer in java with 300dpi