Java編程打印購物小票實(shí)現(xiàn)代碼
簡(jiǎn)單介紹運(yùn)行環(huán)境:
語言:Java
工具:eclipse
系統(tǒng):Windows7
(打印設(shè)備暫時(shí)沒有,所以只能提供預(yù)覽圖)
最近,項(xiàng)目需要為商城做一個(gè)購物小票的打印功能,日常我們?nèi)コ匈I東西,結(jié)賬的時(shí)候收銀員都會(huì)打印一個(gè)小票,一般的商城也都需要這樣的一個(gè)小功能,本文給出的 demo 是在 58mm 的熱敏打印機(jī)下的例子,如果是其他紙張類型的打印機(jī),調(diào)整紙張寬度即可。
package test;
import java.awt.*;
import java.awt.print.*;
/**
* 打印機(jī)測(cè)試類(58mm)
* 1、目標(biāo)打印機(jī)必須設(shè)置為默認(rèn)打印機(jī)
* 2、打印頁面的寬度和具體的打印機(jī)有關(guān),一般為打印紙的寬度,需要配置成系統(tǒng)參數(shù)
* 3、一個(gè)漢字的寬度大概是12點(diǎn)
*/
public class PrintTest {
public static void main(String[] args){
if(PrinterJob.lookupPrintServices().length>0){
/*
打印格式
*/
PageFormat pageFormat = new PageFormat();
//設(shè)置打印起點(diǎn)從左上角開始,從左到右,從上到下打印
pageFormat.setOrientation(PageFormat.PORTRAIT);
/*
打印頁面格式設(shè)置
*/
Paper paper = new Paper();
//設(shè)置打印寬度(固定,和具體的打印機(jī)有關(guān))和高度(跟實(shí)際打印內(nèi)容的多少有關(guān))
paper.setSize(140, 450);
//設(shè)置打印區(qū)域 打印起點(diǎn)坐標(biāo)、打印的寬度和高度
paper.setImageableArea(0, 0, 135, 450);
pageFormat.setPaper(paper);
//創(chuàng)建打印文檔
Book book = new Book();
book.append(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if(pageIndex>0){
return NO_SUCH_PAGE;
}
Graphics2D graphics2D = (Graphics2D) graphics;
Font font = new Font("宋體", Font.PLAIN, 5);
graphics2D.setFont(font);
drawString(graphics2D, "http://////////////////////////////", 10, 17, 119, 8);
font = new Font("宋體", Font.PLAIN, 7);
graphics2D.setFont(font);
int yIndex = 30;
int lineHeight = 10;
int lineWidth = 120;
Color defaultColor = graphics2D.getColor();
Color grey = new Color(145, 145, 145);
//收貨信息
yIndex = drawString(graphics2D, "收貨人:路人甲", 10, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收貨地址:北京市海淀區(qū)上地十街10號(hào)百度大廈", 10, yIndex + lineHeight, lineWidth, lineHeight);
//收貨信息邊框
Stroke stroke = new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,0,new float[]{4, 4},0);
graphics2D.setStroke(stroke);
graphics2D.drawRect(5, 10, 129, yIndex);
//藥店名稱
lineWidth = 129;
lineHeight = 8;
graphics2D.setFont(new Font("宋體", Font.BOLD, 8));
graphics2D.setColor(defaultColor);
yIndex = drawString(graphics2D, "北京藥店零售小票", 5, yIndex + lineHeight + 20, lineWidth, 12);
graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "操作員:小清新", 5, yIndex + lineHeight + 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "日期:2017-01-05", 5 + lineWidth/2, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "品名", 5, yIndex + lineHeight * 2 - 5, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "規(guī)格", (lineWidth/10)*4, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "單價(jià)", (lineWidth/10)*8, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "數(shù)量", (lineWidth/10)*10, yIndex, lineWidth, lineHeight);
for (int i=0; i<5; i++){
graphics2D.setFont(new Font("宋體", Font.PLAIN, 7));
yIndex = drawString(graphics2D, "E復(fù)合維生素B片100片E復(fù)合維生素B片100片", 5, yIndex + 15, (lineWidth/10)*7, 10);
graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "100片/盒", 5, yIndex + 11, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "14.50", (lineWidth/10)*8, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "2", (lineWidth/10)*10, yIndex, lineWidth, lineHeight);
graphics2D.setFont(new Font("宋體", Font.PLAIN, 7));
yIndex = yIndex + 2;
graphics2D.drawLine(5, yIndex, 5 + lineWidth, yIndex);
}
graphics2D.setColor(defaultColor);
yIndex = drawString(graphics2D, "會(huì)員名稱:小清新", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "總 數(shù):6", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "總 計(jì):55.30", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收 款:100.00", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "找 零:44.70", 5, yIndex + lineHeight, lineWidth, lineHeight);
graphics2D.setFont(new Font("宋體", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "電話:020-123456", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "地址:北京市海淀區(qū)上地十街10號(hào)百度大廈", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = yIndex + 20;
graphics2D.drawLine(0, yIndex, 140, yIndex);
return PAGE_EXISTS;
}
}
, pageFormat);
//獲取默認(rèn)打印機(jī)
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPageable(book);
try {
printerJob.print();
}
catch (PrinterException e) {
e.printStackTrace();
System.out.println("打印異常");
}
} else{
System.out.println("沒法發(fā)現(xiàn)打印機(jī)服務(wù)");
}
}
/**
* 字符串輸出
* @param graphics2D 畫筆
* @param text 打印文本
* @param x 打印起點(diǎn) x 坐標(biāo)
* @param y 打印起點(diǎn) y 坐標(biāo)
* @param lineWidth 行寬
* @param lineHeight 行高
* @return 返回終點(diǎn) y 坐標(biāo)
*/
private static int drawString(Graphics2D graphics2D, String text, int x, int y, int lineWidth, int lineHeight){
FontMetrics fontMetrics = graphics2D.getFontMetrics();
if(fontMetrics.stringWidth(text)<lineWidth){
graphics2D.drawString(text, x, y);
return y;
} else{
char[] chars = text.toCharArray();
int charsWidth = 0;
StringBuffer sb = new StringBuffer();
for (int i=0; i<chars.length; i++){
if((charsWidth + fontMetrics.charWidth(chars[i]))>lineWidth){
graphics2D.drawString(sb.toString(), x, y);
sb.setLength(0);
y = y + lineHeight;
charsWidth = fontMetrics.charWidth(chars[i]);
sb.append(chars[i]);
} else{
charsWidth = charsWidth + fontMetrics.charWidth(chars[i]);
sb.append(chars[i]);
}
}
if(sb.length()>0){
graphics2D.drawString(sb.toString(), x, y);
y = y + lineHeight;
}
return y - lineHeight;
}
}
}
運(yùn)行結(jié)果:

效果預(yù)覽:

總結(jié)
簡(jiǎn)單說就是編寫一段Java程序,將輸出結(jié)果另存為“ *.xps ”格式文件,由打印機(jī)輸出,非常簡(jiǎn)單。希望對(duì)大家有所幫助。如有問題歡迎留言指出。感謝朋友們對(duì)本站的支持。
相關(guān)文章
Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
這篇文章主要介紹了Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
基于java實(shí)現(xiàn)具有時(shí)效性文件鏈接
這篇文章主要為大家詳細(xì)介紹了如何基于java實(shí)現(xiàn)具有時(shí)效性的文件鏈接,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-12-12
JAVA實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)系統(tǒng)代碼
JAVA項(xiàng)目中正號(hào)需要一個(gè)停車收費(fèi)系統(tǒng),就整理出來java實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的停車收費(fèi)系統(tǒng)給大家分享一下,希望對(duì)大家有所幫助2017-04-04
springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱的實(shí)現(xiàn)代碼
在Redis中客戶端可以通過訂閱特定的頻道來接收發(fā)送至該頻道的消息,本文主要介紹了springboot+redis自定義注解實(shí)現(xiàn)發(fā)布訂閱,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
java8中parallelStream性能測(cè)試及結(jié)果分析
本篇文章給大家用代碼實(shí)例做了segmentfaultjava8中parallelStream性能測(cè)試,并對(duì)測(cè)試結(jié)果做了說明,需要的朋友學(xué)習(xí)下吧。2018-01-01
Java中一維二維數(shù)組的靜態(tài)和動(dòng)態(tài)初始化
今天通過本文給大家分享Java中的數(shù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動(dòng)態(tài)初始化問題,感興趣的朋友一起看看吧2017-10-10
IDEA如何將Java項(xiàng)目打包成可執(zhí)行的Jar包
在Java開發(fā)中,我們通常會(huì)將我們的項(xiàng)目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運(yùn)行,本文將介紹如何使用IDEA集成開發(fā)環(huán)境將Java項(xiàng)目打包成可執(zhí)行的Jar包,感興趣的朋友一起看看吧2023-07-07

