Java编程打印购物小票实现代码
发布时间:2020-12-14 20:59:44 所属栏目:Java 来源:网络整理
导读:简单介绍运行环境: 语言:Java 工具:eclipse 系统:Windows7 (打印设备暂时没有,所以只能提供预览图) 最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时候收银员都会打印一个小票,一般的商城也都需要这样的一个小功能,
简单介绍运行环境: 语言: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,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("宋体",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,"收货人:路人甲",yIndex,lineWidth,lineHeight); yIndex = drawString(graphics2D,"收货地址:北京市海淀区上地十街10号百度大厦",yIndex + lineHeight,lineHeight); //收货信息边框 Stroke stroke = new BasicStroke(0.5f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,new float[]{4,4},0); graphics2D.setStroke(stroke); graphics2D.drawRect(5,129,yIndex); //药店名称 lineWidth = 129; lineHeight = 8; graphics2D.setFont(new Font("宋体",Font.BOLD,8)); graphics2D.setColor(defaultColor); yIndex = drawString(graphics2D,"北京药店零售小票",5,yIndex + lineHeight + 20,12); graphics2D.setFont(new Font("宋体",6)); graphics2D.setColor(grey); yIndex = drawString(graphics2D,"操作员:小清新",yIndex + lineHeight + 2,"日期:2017-01-05",5 + lineWidth/2,"品名",yIndex + lineHeight * 2 - 5,"规格",(lineWidth/10)*4,"单价",(lineWidth/10)*8,"数量",(lineWidth/10)*10,lineHeight); for (int i=0; i<5; i++){ graphics2D.setFont(new Font("宋体",7)); yIndex = drawString(graphics2D,"E复合维生素B片100片E复合维生素B片100片",yIndex + 15,(lineWidth/10)*7,10); graphics2D.setFont(new Font("宋体",6)); graphics2D.setColor(grey); yIndex = drawString(graphics2D,"100片/盒",yIndex + 11,lineHeight); yIndex = drawString(graphics2D,"14.50","2",lineHeight); graphics2D.setFont(new Font("宋体",7)); yIndex = yIndex + 2; graphics2D.drawLine(5,5 + lineWidth,yIndex); } graphics2D.setColor(defaultColor); yIndex = drawString(graphics2D,"会员名称:小清新",yIndex + lineHeight * 2,"总 数:6","总 计:55.30","收 款:100.00","找 零:44.70",lineHeight); graphics2D.setFont(new Font("宋体","电话:020-123456","地址:北京市海淀区上地十街10号百度大厦",lineHeight); yIndex = yIndex + 20; graphics2D.drawLine(0,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(),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(),y); y = y + lineHeight; } return y - lineHeight; } } } 运行结果: 效果预览: 总结 简单说就是编写一段Java程序,将输出结果另存为“ *.xps ”格式文件,由打印机输出,非常简单。希望对大家有所帮助。如有问题欢迎留言指出。感谢朋友们对本站的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |