Java打印小票

“无边落木萧萧下,不尽长江滚滚来”

前言

最近在帮别人做个打印的功能,就是登记完学生信息后,用小票打印出学生信息。打印预览图如下:
在这里插入图片描述

实现

首先我用Java代码实现:


import com.xxx.students.domain.StudentInfo;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PrintUtils implements Printable {

    private StudentInfo studentInfo;
    private HttpServletRequest request;

    public PrintUtils(HttpServletRequest request,StudentInfo studentInfo) {
        this.studentInfo = studentInfo;
        this.request = request;
    }

    public PrintUtils() {
    }

    @Override
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (page > 0) {
            return NO_SUCH_PAGE;
        }
        Graphics2D g2d = (Graphics2D) g;
        g2d.setFont(new Font("Default", Font.PLAIN, 20));
        g2d.drawString("测试打印", 60, 20);
        g2d.drawString("-------------------------------------", 7, 30);
        g2d.setFont(new Font("Default", Font.PLAIN, 12));
        g2d.drawString("学生姓名:" + studentInfo.getName(), 5, 45);
        g2d.drawString("手机号码:" + studentInfo.getParentPhone(), 5, 75);
        g2d.drawString("课程名称:" + studentInfo.getCourseName(), 5, 105);
        g2d.drawString("缴费金额:" + studentInfo.getPaymentAmount() + " RMB", 5, 135);
        g2d.drawString("支付方式:" + studentInfo.getPaymentModeName(), 5, 165);
        g2d.drawString("打印时间:" + sdf.format(new Date()), 5, 195);
        g2d.drawImage(writeQrCodeContent(),50, 225,100,100, null);
        return PAGE_EXISTS;
    }


    /**
     *@author ruanhui
     *@date 2018/12/10
     *@description 生成二维码
     */
    public Image writeQrCodeContent()  {
        java.awt.Image im = null ;
        try {
            //获取图片路径
            String filePath = request.getSession().getServletContext().getRealPath("/") + "resource/images/";
            System.out.println("filePath:" + filePath) ;
            File file=new File(filePath + "xxx.jpg");
            System.out.println(file.getName());
            InputStream is = new FileInputStream(file);
            BufferedImage bi;
            bi = ImageIO.read(is);
             im = (java.awt.Image)bi;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return im;
    }

    //打印方法
    public static void print(HttpServletRequest request,StudentInfo studentInfo) {

        int height = 250 + 3 * 15 + 20;

        // 通俗理解就是书、文档
        Book book = new Book();

        // 打印格式
        PageFormat pf = new PageFormat();
        pf.setOrientation(PageFormat.PORTRAIT);

        // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
        Paper p = new Paper();
        p.setSize(230, height);
        p.setImageableArea(5, -20, 230, height + 20);
        pf.setPaper(p);

        // 把 PageFormat 和 Printable 添加到书中,组成一个页面
        book.append(new PrintUtils(request,studentInfo), pf);

        // 获取打印服务对象
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(book);
        try {
            job.print();
        } catch (PrinterException e) {
            System.out.println("================打印出现异常");
        }
    }
}

这段java代码能实现在本地运行中调用打印机并且打印。但是把项目放到服务器上就不能调本地的打印机了。
于是,有了第二种打印方法,用JS实现:


//测试打印
function doTestPrint() {
    var nowDate = new Date();
    //初始化打印机
    var LODOP=getLodop();
    LODOP.PRINT_INIT("测试打印");               //首先一个初始化语句
    LODOP.SET_PRINT_STYLE("FontSize", 25); //字体大小
    LODOP.ADD_PRINT_TEXT(20,50,150,20,"xxxx");//然后多个ADD语句及SET语句
    LODOP.SET_PRINT_STYLE("FontSize", 10); //字体大小
    LODOP.ADD_PRINT_TEXT(50,5,250,20,"--------------------------------");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(70,5,180,20,"学生姓名:诺贝尔爱情奖");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(95,5,180,20,"手机号码:123456");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(120,5,180,20,"课程名称:年卡");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(145,5,180,20,"缴费金额:1000RMB");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(170,5,180,20,"支付方式:支付宝支付");//然后多个ADD语句及SET语句
    LODOP.ADD_PRINT_TEXT(195,5,220,20,"打印时间:" + nowDate.getFullYear() + "-" + (nowDate.getMonth() + 1) + "-" + nowDate.getDate() + " " + nowDate.getHours() + ":" + nowDate.getMinutes() + ":" + nowDate.getSeconds());//然后多个ADD语句及SET语句
    // ADD_PRINT_TEXT(intTop,intLeft,intWidth,intHeight,strContent)增加纯文本项
    LODOP.ADD_PRINT_IMAGE(220,50,150,150,"<img border='0' src='../../resource/images/xxx.jpg' width='150' height='150'/>"); //打印二维码
    LODOP.SET_PRINT_STYLEA(0,"Stretch",2);//按原图比例(不变形)缩放模式
    LODOP.PREVIEW();    //打印预览
    // LODOP.PRINT();                               //最后一个打印(或预览、维护、设计)语句
}

在JS文件写上面的代码即可调用打印机。这里用到的插件就是Lodop。需要从官网下载类似驱动(我是这样的认为的)软件安装之后,然后需要引入它的JS文件,<script src="js/LodopFuncs.js?v=<%=new Date()%>"></script> 就这么简单,在哪都可以打印了。具体请见官网参考实例:官网样例

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中,打印超市小票通常涉及到文件I/O操作和字符串格式化。你可以使用`java.io.PrintStream`或者`java.util.Scanner`来完成这个任务。以下是一个简单的步骤示例: 1. **创建实例**: 首先,你需要一个`PrintWriter`或`BufferedWriter`对象,它们可以连接到打印机: ```java import java.io.*; import java.text.SimpleDateFormat; public class ReceiptPrinter { private PrintWriter writer; public void initPrinter() throws IOException { writer = new PrintWriter(new BufferedWriter(new FileWriter("receipt.txt"))) // 文件路径替换为你实际的打印机设备 .append("\u00A7"); // 添加发票开始符 } } ``` 2. **数据结构**: 创建一个包含商品信息的数据结构,例如`ArrayList<Item>`,每个`Item`包含名称、价格、数量等。 3. **格式化**: 使用`SimpleDateFormat`对日期进行格式化,并将商品信息写入小票: ```java class Item { String name; double price; int quantity; // 构造函数... } void printReceipt(ArrayList<Item> items) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); writer.println("超市小票 - " + sdf.format(new Date())); for (Item item : items) { writer.printf("%s %d*%f=%f元%n", item.name, item.quantity, item.price, item.quantity * item.price); } writer.println("\n谢谢惠顾!"); // 小票结束符 } ``` 4. **关闭流**: 打印完毕后,别忘了关闭资源: ```java public void closePrinter() throws IOException { writer.close(); } ``` 5. **使用**: ```java public static void main(String[] args) { try { ReceiptPrinter printer = new ReceiptPrinter(); printer.initPrinter(); ArrayList<Item> items = ... // 填充商品列表 printReceipt(items); printer.closePrinter(); } catch (IOException e) { e.printStackTrace(); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值