轉載於:HTTP://blog.sina.com.cn/s/blog_8f54b9f901014fl9.html

 

在項目中,經常有可能需要通過針式列印機列印一些票據,如快遞單,發票等...

 

之前在做JAVA列印時,也在網上找了好多資料,網上資料太多,講的也不夠詳細,走了不少彎路,在做這個之前,連針式列印機都很少接觸。。。,不多說了,言歸正傳吧

 

1、在編寫代碼之前,最好測試一下在你本機是否可以連接到列印機,正常列印,如果你本機都無法列印,也就不要指望程式可以列印了。

 

2、本機可以連接到列印機並可以列印後,就可以開始寫代碼了,首先寫一個最簡單的程式,列印一句最簡單的話,代碼如下:

 

package com.gotomycloud.print;




import java.awt.Color;

 

import java.awt.Font;

 

import java.awt.Graphics;

 

import java.awt.Graphics2D;

 

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;




public class Print implements Printable {

 

private int pageSize;//列印的總頁數

 

private double paperW=0;//列印的紙張寬度

 

private double paperH=0;//列印的紙張高度

 

//實現java.awt.print.Printable介面的列印方法

 

//pageIndex:列印的當前頁,此參數是系統自動維護的,不需要手動維護,系統會自動遞增

 

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)

 

throws PrinterException {

 

if (pageIndex >= pageSize)

 

//退出列印

 

return Printable.NO_SUCH_PAGE;

 

else {

 

Graphics2D g2 = (Graphics2D) graphics;

 

g2.setColor(Color.BLUE);

 

Paper p = new Paper();

 

//此處的paperW和paperH是從目標列印機的進紙規格中獲取的,實際針式列印機的可列印區域是有限的,

 

//距紙張的上下左右1inch(英寸)的中間的距形框為實際可列印區域,超出範圍的內容將不會列印出來(沒有設置偏移的情況)

 

//如果設置偏移量,那麼超出的範圍也是可以列印的,這裏的pageW和pageH我是直接獲取列印機的進紙規格的寬和高

 

//也可以手動指定,從是如果手動指定的寬高和目標列印機的進紙規格相差較大,將會默認以A4紙為列印模版

 

p.setImageableArea(0, 0, paperW, paperH);// 設置可列印區域

 

p.setSize(paperW,paperH);// 設置紙張的大小

 

pageFormat.setPaper(p);

 

drawCurrentPageText(g2, pageFormat);//調用列印內容的方法

 

return PAGE_EXISTS;

 

}

 

}




// 列印內容

 

private void drawCurrentPageText(Graphics2D g2, PageFormat pf) {

 

Font font = null;

 

//設置列印的字體

 

font = new Font("新宋體", Font.BOLD, 11);

 

g2.setFont(font);// 設置字體

 

//此處列印一句話,列印開始位置是(200,200),表示從pf.getPaper()中座標為(200,200)開始列印

 

//此處200的單位是1/72(inch),inch:英寸,所以這裏的長度,在測量後需要進行轉換

 

g2.drawString("列印測試列印測試列印測試列印測試列印測試列印測試列印測試列印測試列印測試列印測試列印測試",200,200);

 

}

 

//連接列印機,彈出列印對話框

 

public void starPrint() {

 

try {

 

PrinterJob prnJob = PrinterJob.getPrinterJob();

 

PageFormat pageFormat = new PageFormat();

 

pageFormat.setOrientation(PageFormat.PORTRAIT);

 

prnJob.setPrintable(this);

 

//彈出列印對話框,也可以選擇不彈出列印提示框,直接列印

 

if (!prnJob.printDialog())

 

return;

 

//獲取所連接的目標列印機的進紙規格的寬度,單位:1/72(inch)

 

paperW=prnJob.getPageFormat(null).getPaper().getWidth();

 

//獲取所連接的目標列印機的進紙規格的寬度,單位:1/72(inch)

 

paperH=prnJob.getPageFormat(null).getPaper().getHeight();

 

//System.out.println("paperW:"+paperW+";paperH:"+paperH);

 

prnJob.print();//啟動列印工作

 

} catch (PrinterException ex) {

 

ex.printStackTrace();

 

System.err.println("列印錯誤:" + ex.toString());

 

}

 

}

 

//入口方法

 

public static void main(String[] args) {

 

Print pm = new Print();// 實例化列印類

 

pm.pageSize = 2;//列印兩頁

 

pm.starPrint();

 

}

 

}




在列印過程中,很可能代碼正確,但是列印時,紙上確沒列印上,原因很可能是紙張放的位置有偏差,所以列印測試時,可以讓測試列印的列印內容多一點,只要能列印出內容就可以了

 

3、如果可以列印出內容,哪怕是一條線,那麼第一步就算好了。下面就是控制列印位置了,列印的位置在紙張上是有一個最左上角點的(0,0),下圖是一張類似的快遞單列印紙,圖上標有列印的起始位置、可列印區域等,可供參考,如下圖所示






知道了列印位置的規律,就可以通過測試來設置內容的列印位置了。

 

4、上面講的是單張列印,但很多時間需要批量列印,這樣可以減少很多重複的工作,如果單張列印可以了,那多張列印也比較簡單,首先要設置進紙規格,和偏移量,如果是共用的網絡列印機,那麼兩邊都需要設置,最後就是要在代碼中設置列印區域和紙張大小了,關鍵部分代碼上面已提到,可參考!
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()