在項目中,經常有可能需要通過針式打印機打印一些票據,如快遞單,發票等...
之前在做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、上面講的是單張打印,但很多時間需要批量打印,這樣可以減少很多重複的工作,如果單張打印可以了,那多張打印也比較簡單,首先要設置進紙規格,和偏移量,如果是共享的網絡打印機,那麼兩邊都需要設置,最後就是要在代碼中設置打印區域和紙張大小了,關鍵部分代碼上面已提到,可參考!