购物小票打印

购物小票打印

|作者:RexFang

|出处:http://www.cnblogs.com/rexfang/

|关于作者:Java 程序员一枚

|版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:fangruitao.work@foxmail.com

  最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时候收银员都会打印一个小票,一般的商城也都需要这样的一个小功能,本文给出的 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;
        }
    }
}

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值