因为公司是做电商的,有线下门店,使用到了收银台和小票打印机。本篇讲解如何使用Java驱动小票打印机
编程要用到的Java相关的环境,工具我就不多叙述了。
我这里用到的是热敏打印机,型号为:逊镭NTEUMM NT-5890K
初次使用是没有驱动的,需要下载相关驱动:
逊镭NTEUMM NT-5890K驱动
其他驱动下载地址
一直下一步即可,可以修改一下安装位置。
之后得到文件夹和一个打印机安装的可执行程序
点击打印机驱动安装.exe
选择操作系统,然后选择打印机型号,之后点击USB端口检测,打印机出纸表示检测成功,点击开始安装。完活!
package com.example.demo.domain;
import lombok.Data;
import java.math.BigDecimal;
/* 这里对应你们的实体类 */
@Data
public class OrderDto {
private String title;
private String storeName;
private String goodsName;
private BigDecimal goodsUnitPrice;
private Long goodsNumber;
private BigDecimal goodsTotalPrice;
private Long chargeNumber;
private BigDecimal chargePrice;
private String qrCodePath;
private String note;
}
package com.example.demo.controller;
import com.example.demo.domain.OrderDto;
import java.awt.*;
import java.awt.print.*;
import java.math.BigDecimal;
import java.util.ArrayList;
public class PrintDemo implements Printable {
private static int COUNT = 0; //待打印数据的条数,此变量需定义在数据集合之前
private static ArrayList<OrderDto> DEMODTO_LIST = getOrderDto(); //待打印的文字数据
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
System.out.println("-----------------执行第"+(COUNT+1)+"次打印-------------------");
System.out.println("pageIndex = "+pageIndex);
Component c = null;
//转换成Graphics2D
Graphics2D g2 = (Graphics2D) graphics;
//设置打印颜色为黑色
g2.setColor(Color.black);
//打印起点坐标
double x = pageFormat.getImageableX();
double y = pageFormat.getImageableY();
System.out.println("起点坐标x="+x+";y="+y);
switch(pageIndex){
case 0:
//设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称)
//Java平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput
Font font = new Font("新宋体", Font.PLAIN, 10);
g2.setFont(font);//设置字体
float[] dash1 = {2.0f};
//设置打印线的属性。
//1.线宽 2、3、不知道,4、空白的宽度,5、虚线的宽度,6、偏移量
g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
//获取需要打印的图片,若是动态生成,直接传入绝对路径即可
Image src = Toolkit.getDefaultToolkit().getImage(DEMODTO_LIST.get(COUNT).getQrCodePath());
if (src == null) {
System.out.println("没有找到图像");
}
/**
* 参数2:打印的x坐标起点 参数3 打印的y坐标起点
* 参数4:打印图片的宽度 参数5:打印图片的高度
*/
// g2.drawImage(src,(int)80,(int)15,(int)48,(int)48,c);
//标题,固定不变
g2.drawString(DEMODTO_LIST.get(COUNT).getStoreName(), (float)30, (float)18);
//以下为动态的文字内容
font = new Font("新宋体", Font.PLAIN, 8);
g2.setFont(font);
g2.drawString("----------------------------------------------", (float)10, (float)30);
g2.drawString("商品名称:"+DEMODTO_LIST.get(COUNT).getGoodsName(), (float)10, (float)40);
g2.drawString("商品单价:"+DEMODTO_LIST.get(COUNT).getGoodsUnitPrice(), (float)10, (float)50);
g2.drawString("商品数量:"+DEMODTO_LIST.get(COUNT).getGoodsNumber(), (float)10, (float)60);
g2.drawString("商品总价:"+DEMODTO_LIST.get(COUNT).getGoodsTotalPrice(), (float)10, (float)70);
g2.drawString("----------------------------------------------", (float)10, (float)80);
g2.drawString("商品总数:"+DEMODTO_LIST.get(COUNT).getChargeNumber(), (float)10, (float)90);
g2.drawString("支付金额:"+DEMODTO_LIST.get(COUNT).getChargePrice(), (float)10, (float)100);
g2.drawString("----------------------------------------------", (float)10, (float)110);
g2.drawString("备注:"+DEMODTO_LIST.get(COUNT).getNote(), (float)10, (float)120);
System.out.println("-----------------打印成功-------------------");
return PAGE_EXISTS;
default:
return NO_SUCH_PAGE;
}
}
/**
* 封装测试数据
* @return
*/
private static ArrayList<OrderDto> getOrderDto() {
ArrayList<OrderDto> orderDtos = new ArrayList<>();
BigDecimal bigDecimal = new BigDecimal(100);
for (int i = 1; i < 2; i++) {
OrderDto orderDto = new OrderDto();
orderDto.setTitle("欢迎您的光临");
orderDto.setStoreName("梅利超市" + i);
orderDto.setGoodsName("小拉菲" + i);
orderDto.setGoodsUnitPrice(bigDecimal);
orderDto.setGoodsNumber(2L);
orderDto.setGoodsTotalPrice(bigDecimal.multiply(new BigDecimal(2)));
orderDto.setChargeNumber(2L);
orderDto.setChargePrice(bigDecimal.multiply(new BigDecimal(2)));
orderDto.setNote("购买成功");
orderDtos.add(orderDto);
}
if (orderDtos.size()>0) {
COUNT = orderDtos.size()-1;
System.out.println("总共需打印"+(COUNT+1)+"次");
}
return orderDtos;
}
public static void main(String[] args) {
// 通俗理解就是书、文档
Book book = new Book();
// 设置成竖打
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
p.setSize(142,150);//纸张大小
p.setImageableArea(0,0, 142,150); // 热敏纸打印
pf.setPaper(p);
// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append(new PrintDemo(), pf);
//获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
System.out.println("job.getJobName() = " + job.getJobName());
// 设置打印类
job.setPageable(book);
try {
//直接打印 ,不显示对话框
if (DEMODTO_LIST.size()>0) {
for (int i=0;i<DEMODTO_LIST.size();i++) {
job.print();
--COUNT;
}
}
} catch (PrinterException e) {
e.printStackTrace();
}
}
}