2013-07-31 272 views
2

我用下面的代碼來打印80毫米捲紙熱敏打印機上的一些文字上:打印的熱敏打印機的Java

public class printnow { 

    public static void printCard(final String bill) { 
     final PrinterJob job = PrinterJob.getPrinterJob(); 

     Printable contentToPrint = new Printable() { 
      @Override 
      public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 
       Graphics2D g2d = (Graphics2D) graphics; 
       g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
       g2d.setFont(new Font("Monospaced", Font.BOLD, 7)); 
       pageFormat.setOrientation(PageFormat.PORTRAIT); 

       Paper pPaper = pageFormat.getPaper(); 
       pPaper.setImageableArea(0, 0, pPaper.getWidth() , pPaper.getHeight() -2); 
       pageFormat.setPaper(pPaper); 

       if (pageIndex > 0) 
        return NO_SUCH_PAGE; //Only one page 

       String Bill [] = bill.split(";"); 
       int y = 0; 
       for (int i = 0; i < Bill.length; i++) { 
        g2d.drawString(Bill[i], 0, y); 
        y = y + 15; 
       } 

       return PAGE_EXISTS; 
      } 
     }; 

     boolean don = job.printDialog(); 

     job.setPrintable(contentToPrint); 

     try { 
      job.print(); 
     } catch (PrinterException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

這是打印極其精細,是正是我想要的。但是,當我刪除以下行來禁用打印對話框並自動執行打印過程時,我的打印機出現混亂,打印機會在左側自動留出一些餘量。

boolean don = job.printDialog(); 

任何想法爲什麼會發生這種情況,它如何解決?

+0

我有完全相同的問題,沒有得到答案。它是一個光柵rnp打印機? –

+0

不是。這是Epson TM-T81。 –

+0

即使如此嘗試使用我的代碼我有一個工作沒有打印對話框到普通打印機,但它沒有在我的工作,因爲它是一個ptr打印機。希望它有效。 http://stackoverflow.com/questions/17724784/printing-files-in-java-with-raster-ptr-printer –

回答

1

了大量的研究和應用的小腦袋後,我找到了解決方案。這是一個非常小但愚蠢的錯誤。閱讀下面的源代碼:

public class printnow { 

    public static void printCard(final String bill) { 
     final PrinterJob job = PrinterJob.getPrinterJob(); 

     Printable contentToPrint = new Printable() { 
      @Override 
      public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 
       Graphics2D g2d = (Graphics2D) graphics; 
       g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
       g2d.setFont(new Font("Monospaced", Font.BOLD, 7)); 

       if (pageIndex > 0) { 
        return NO_SUCH_PAGE; 
       } //Only one page 

       String Bill [] = bill.split(";"); 
       int y = 0; 
       for (int i = 0; i < Bill.length; i++) { 
        g2d.drawString(Bill[i], 0, y); 
        y = y + 15; 
       } 

       return PAGE_EXISTS; 
      } 
     }; 

     PageFormat pageFormat = new PageFormat(); 
     pageFormat.setOrientation(PageFormat.PORTRAIT); 

     Paper pPaper = pageFormat.getPaper(); 
     pPaper.setImageableArea(0, 0, pPaper.getWidth() , pPaper.getHeight() -2); 
     pageFormat.setPaper(pPaper); 

     job.setPrintable(contentToPrint, pageFormat); 

     try { 
      job.print(); 
     } catch (PrinterException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

在前面的源代碼(錯誤的),當應用程序觸發打印對話框,用戶點擊OK,默認的打印首選項轉移到Java應用程序,它打印什麼是必需的。但是當我們通過刪除這一行來禁用打印對話框時: boolean don = job.printDialog();

一個不明的PageFormat被傳它產生突然冒出。問題是不符合我們定義的PageFormat,問題是,PageFormat中被傳遞到我們沒有做最初的印刷方法:

job.setPrintable(contentToPrint, pageFormat); 

注意的第二個參數傳遞給上面的方法。 希望這可以幫助每個人。 :)