2013-07-19 86 views
0

我正在使用JasperReports從我的Java應用程序進行打印。對於所有的顧客來說,所有的打印件都可以使用很長時間,但是最近我們已經安裝了適合所有柯尼卡美能達PagePro 1200或1350W打印機的顧客的軟件。所有這些客戶都會得到相同的結果 - 印刷是「延伸」 - 就像我在A5紙上打印A4報告一樣。除了我在A4上打印A4以及在所有其他打印機上打印效果良好。在Konica-Minolta PagePro打印機上展開Java打印

有沒有人有任何想法可能是什麼原因?

這個問題似乎與https://stackoverflow.com/questions/15854722/jasper-report-printing-stretched類似,但在那裏提出的解決方法(與打印機紙張大小等相關)並未達到預期結果。

這裏是打印的例子:

Example print

這是打印應該是什麼樣子(有slighlty不同的數據,但我想這個問題是清楚的)

Desired print

感謝您的任何建議。

編輯:

這個問題可以用一個簡單的直接調用打印API被複制:

import java.awt.*; 
import java.awt.print.Book; 
import java.awt.print.PageFormat; 
import java.awt.print.Paper; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 

/** 
* 
* @author MaCe 
*/ 
public class PrintTest { 

    static Printable printable = new Printable() { 
     @Override 
     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 
      Graphics2D grx = (Graphics2D)graphics; 
      grx.drawLine(20,20, getPageWidth()/2, 20); 
      return Printable.PAGE_EXISTS; 
     } 

    }; 
    protected static int getPageWidth() { 
     //width of A4 in 1/72 of inches 
     return 595; 
    } 

    protected static int getPageHeight() { 
     //height of A4 in 1/72 of inches 
     return 842; 
    } 

    public static void main(String args[]) throws PrinterException { 
     Frame f = new Frame(); 
     f.show(); 

     //Build a buggy print job using PrinterJob class 
     PrinterJob printJob = PrinterJob.getPrinterJob(); 

     /** 
    * Fix for bug ID 6255588 from Sun bug database 
    */ 
     try { 
      printJob.setPrintService(printJob.getPrintService()); 
     } catch (PrinterException e) { 
     } 

     PageFormat pageFormat = printJob.defaultPage(); 
     Paper paper = pageFormat.getPaper(); 

     printJob.setJobName("Buggy output"); 

     pageFormat.setOrientation(PageFormat.PORTRAIT); 
     paper.setSize(getPageWidth() , getPageHeight()); 
     paper.setImageableArea(
       0, 
       0, getPageWidth(), getPageHeight()); 

     pageFormat.setPaper(paper); 

     Book book = new Book(); 
     book.append(printable, pageFormat, 1); 
     printJob.setPageable(book); 

     if (printJob.printDialog()) { 
      printJob.print(); 
     } 

     //Build a good print job using PrintJob class 
     PrintJob pjob = f.getToolkit().getPrintJob(f, "Good output", null); 
     if (pjob!=null) { 
      Graphics g = pjob.getGraphics(); 
      g.drawLine(20, 20, pjob.getPageDimension().width/2, 20); 
      pjob.end(); 
     } 

     System.exit(0); 
    } 
} 

下面這段代碼生成兩個打印,在大多數打印機無論是從左上角打印一行的紙張放在紙張的中間。然而,在上述打印機中,第一張打印紙在整個紙張上產生粗線(200%比例) - 即使在Minolta打印機上,第二種打印機也可以。

看起來像一個Java錯誤,因爲所有其他程序都能正常打印打印機。該錯誤被Sun接受,但由於無法在正確的打印機上執行操作而關閉(https://bugs.openjdk.java.net/browse/JDK-804159

回答

0

我找到了解決問題的方法。解決方案是在打印之前將圖形縮放到一半。這對於JasperReports來說並不容易,因爲圖形對象不會暴露在任何地方。然而,我的應用程序使用@AspectJ,所以我設法通過自定義方面擺弄圖形:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.print.PageFormat; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 


@Aspect 
public class JRMinoltaAspect {   

    @Before("execution(int net.sf.jasperreports.engine.print.JRPrinterAWT.print(java.awt.Graphics, java.awt.print.PageFormat , int)) && args(g, pf, ..)") 
    public void scalePrint(Graphics g, PageFormat pf){ 
     if(pf.getOrientation() == PageFormat.LANDSCAPE){ 
      g.translate(0, (int)pf.getHeight()/2); 
     } 
     ((Graphics2D)g).scale(0.5, 0.5);   
    } 

} 
0

是您的平臺windows/mac/linux?

當打印作業的介質提示未完全與驅動程序進行通信時,使用標籤打印機進行打印時遇到問題。它其實非常類似於你的問題,拉伸打印,跳頁等。

我不知道你是否有代碼修改,但我們不得不切換到系統打印,而不是Java打印。然後用系統打印設置(在我的情況下是Windows spooler),我必須創建一個打印機,其中包含正確打印所需的確切驅動程序設置。它很少能夠在JasperReports中真正做的任何事情,而不是指定寬度/高度/方向。

我假設您的報告在保存爲PDF格式時正常打印,然後從PDF查看器打印。

+0

是的,保存爲PDF然後打印效果很好。請您詳細說明「切換到系統打印到Java打印」是什麼意思?谷歌搜索沒有透露任何相關信息......該平臺是Windows(包括7和XP)。 –