java-打印机

前言

因为公司是做电商的,有线下门店,使用到了收银台和小票打印机。本篇讲解如何使用Java驱动小票打印机

准备工作

编程要用到的Java相关的环境,工具我就不多叙述了。
我这里用到的是热敏打印机,型号为:逊镭NTEUMM NT-5890K
初次使用是没有驱动的,需要下载相关驱动:
逊镭NTEUMM NT-5890K驱动
其他驱动下载地址


下载后得到一个.exe的文件,点击安装

java-打印机_第1张图片
一直下一步即可,可以修改一下安装位置。
之后得到文件夹和一个打印机安装的可执行程序
java-打印机_第2张图片
点击打印机驱动安装.exe

java-打印机_第3张图片
java-打印机_第4张图片
选择操作系统,然后选择打印机型号,之后点击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();
        }
    }

}

你可能感兴趣的:(java,开发语言,jvm)