Java编程打印购物小票实现代码

 更新时间:2017年11月23日 14:59:52   作者:RexFang  
这篇文章主要介绍了Java编程打印购物小票实现代码,具有一定参考价值,需要的朋友可以了解下。

简单介绍运行环境:

语言:Java

工具:eclipse

系统:Windows7

(打印设备暂时没有,所以只能提供预览图)

最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时候收银员都会打印一个小票,一般的商城也都需要这样的一个小功能,本文给出的 demo 是在 58mm 的热敏打印机下的例子,如果是其他纸张类型的打印机,调整纸张宽度即可。

package test;
import java.awt.*;
import java.awt.print.*;
/**
 * 打印机测试类(58mm)
 * 1、目标打印机必须设置为默认打印机
 * 2、打印页面的宽度和具体的打印机有关,一般为打印纸的宽度,需要配置成系统参数
 * 3、一个汉字的宽度大概是12点
 */
public class PrintTest {
	public static void main(String[] args){
		if(PrinterJob.lookupPrintServices().length>0){
			/*
        打印格式
       */
			PageFormat pageFormat = new PageFormat();
			//设置打印起点从左上角开始,从左到右,从上到下打印
			pageFormat.setOrientation(PageFormat.PORTRAIT);
			/*
        打印页面格式设置
       */
			Paper paper = new Paper();
			//设置打印宽度(固定,和具体的打印机有关)和高度(跟实际打印内容的多少有关)
			paper.setSize(140, 450);
			//设置打印区域 打印起点坐标、打印的宽度和高度
			paper.setImageableArea(0, 0, 135, 450);
			pageFormat.setPaper(paper);
			//创建打印文档
			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, "//////////////////////////////", 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, "收货地址:北京市海淀区上地十街10号百度大厦", 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, "规格", (lineWidth/10)*4, yIndex, lineWidth, lineHeight);
					yIndex = drawString(graphics2D, "单价", (lineWidth/10)*8, yIndex, lineWidth, lineHeight);
					yIndex = drawString(graphics2D, "数量", (lineWidth/10)*10, yIndex, lineWidth, lineHeight);
					for (int i=0; i<5; i++){
						graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));
						yIndex = drawString(graphics2D, "E复合维生素B片100片E复合维生素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, "会员名称:小清新", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);
					yIndex = drawString(graphics2D, "总  数:6", 5, yIndex + lineHeight, lineWidth, lineHeight);
					yIndex = drawString(graphics2D, "总  计: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, "地址:北京市海淀区上地十街10号百度大厦", 5, yIndex + lineHeight, lineWidth, lineHeight);
					yIndex = yIndex + 20;
					graphics2D.drawLine(0, yIndex, 140, yIndex);
					return PAGE_EXISTS;
				}
			}
			, pageFormat);
			//获取默认打印机
			PrinterJob printerJob = PrinterJob.getPrinterJob();
			printerJob.setPageable(book);
			try {
				printerJob.print();
			}
			catch (PrinterException e) {
				e.printStackTrace();
				System.out.println("打印异常");
			}
		} else{
			System.out.println("没法发现打印机服务");
		}
	}
	/**
   * 字符串输出
   * @param graphics2D  画笔
   * @param text     打印文本
   * @param x       打印起点 x 坐标
   * @param y       打印起点 y 坐标
   * @param lineWidth   行宽
   * @param lineHeight  行高
   * @return 返回终点 y 坐标
   */
	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;
		}
	}
}

运行结果:

效果预览:

总结

简单说就是编写一段Java程序,将输出结果另存为“ *.xps  ”格式文件,由打印机输出,非常简单。希望对大家有所帮助。如有问题欢迎留言指出。感谢朋友们对本站的支持。

相关文章

  • mybatisplus 复合主键(多主键) CRUD示例详解

    mybatisplus 复合主键(多主键) CRUD示例详解

    这篇文章主要介绍了mybatisplus 复合主键(多主键) CRUD实例详解,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • java贪心算法初学感悟图解及示例分享

    java贪心算法初学感悟图解及示例分享

    这篇文章主要为大家介绍了本人在初学java贪心算法的感悟,并通过图解及示例代码的方式分享给大家,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 关于rocketmq中日志文件路径的配置指南

    关于rocketmq中日志文件路径的配置指南

    rocketmq是java编写的,也就是可以指定启动参数,下面这篇文章主要给大家介绍了关于rocketmq中日志文件路径的配置指南,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Java 浅谈 高并发 处理方案详解

    Java 浅谈 高并发 处理方案详解

    这篇文章主要介绍了浅谈Java高并发解决方案以及高负载优化方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 解析Java的Spring框架的BeanPostProcessor发布处理器

    解析Java的Spring框架的BeanPostProcessor发布处理器

    这篇文章主要介绍了Java的Spring框架的BeanPostProcessor发布处理器,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Java 实现滑动时间窗口限流算法的代码

    Java 实现滑动时间窗口限流算法的代码

    这篇文章主要介绍了Java 实现滑动时间窗口限流算法的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java设计模式之简单工厂模式简述

    java设计模式之简单工厂模式简述

    这篇文章主要为大家详细介绍了java设计模式之简单工厂模式,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • MyBatis-Plus 条件查询器的实现

    MyBatis-Plus 条件查询器的实现

    本文主要介绍了MyBatis-Plus 条件查询器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringBoot整合Lucene实现全文检索的详细步骤

    SpringBoot整合Lucene实现全文检索的详细步骤

    全文搜索(Full-Text Search)是指对大规模存储在计算机系统中的文本数据进行检索和匹配的技术,它允许用户输入关键字,然后从海量的文本数据中快速找到相关的信息,本文介绍了SpringBoot整合Lucene实现全文检索的详细步骤,需要的朋友可以参考下
    2024-03-03
  • mybatis plus自动生成器解析(及遇到的坑)

    mybatis plus自动生成器解析(及遇到的坑)

    这篇文章主要介绍了mybatis-plus自动生成器及遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论