简单介绍运行环境:
语言: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 ”格式文件,由打印机输出,非常简单。希望对大家有所帮助。如有问题欢迎留言指出。感谢朋友们对本站的支持。
本文向大家介绍Python实现购物车购物小程序,包括了Python实现购物车购物小程序的使用技巧和注意事项,需要的朋友参考一下 概要 按理说,我们入门的第一个小程序都应该是Hello World。因为比较简单,我这也就不做过多的演示 了。 下面是我写的一个小程序。主要用于练习Python的基本语法,以及入门。 主要实现功能 要求用户输入自己预期消费额度. 展示现有商品信息,要求用户选择 用户选择对
本文向大家介绍Java编程实现打印螺旋矩阵实例代码,包括了Java编程实现打印螺旋矩阵实例代码的使用技巧和注意事项,需要的朋友参考一下 直接上代码吧。 昨晚腾讯在线测试遇到的题。 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。 总结 以上就是本文关于Java编程实现打印螺旋矩阵实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续
本文向大家介绍javaScript 连接打印机,打印小票的实例,包括了javaScript 连接打印机,打印小票的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇javaScript 连接打印机,打印小票的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
本文向大家介绍java实现网上购物车程序,包括了java实现网上购物车程序的使用技巧和注意事项,需要的朋友参考一下 用java代码写一个简单的网上购物车程序,供大家参考,具体内容如下 需求: 1、写一个商品类,有商品编号、商品名称、商品分类、商品单价属性。 2、写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法。 3、写一个购物车类,有添加商品方法、查看订单信息,删除商品,修改商品,清空
本文向大家介绍Vuex实现购物车小功能,包括了Vuex实现购物车小功能的使用技巧和注意事项,需要的朋友参考一下 Vuex实现购物车功能(附:效果视频),供大家参考,具体内容如下 功能描述: 加购 删除 加减 全选反选 选中计算总价 存储 整体演示效果如下: 首先介绍一下Vuex: Vuex 实例对象属性 主要有下面5个核心属性: state : 全局访问的state对象,存放要设置的初始状态名及值
本文向大家介绍java swing实现电影购票系统,包括了java swing实现电影购票系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java swing实现电影购票系统的具体代码,供大家参考,具体内容如下 首先系统分为前台用户登录注册和后台管理员进行管理 项目采用三层架构思想 系统首页 电影详情以及查看评论 查看所有电影场次 购买影票选择座位 查看影票以及点击进入评论 对购
本文向大家介绍Python实现购物车程序,包括了Python实现购物车程序的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了程序:Python购物车程序,具体内容如下 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 如余额不足,可充值 代码: 程序效
本文向大家介绍ActiveX控件的使用-js实现打印超市小票功能代码详解,包括了ActiveX控件的使用-js实现打印超市小票功能代码详解的使用技巧和注意事项,需要的朋友参考一下 ·应客户的需求= = ,要在网页端实现打印小票的功能 ·先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好似比较方便,我的