Bootstrap

Java 打印小票

简介:

整理了一个打印小票的功能,记录一下,代码如下:

import org.jboss.logging.Logger;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.JobName;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;


/**
 * 打印小票功能实现
 */
public class PrintUtil implements Printable {

    static Logger log = Logger.getLogger(PrintUtil.class);

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex){

        //绘图
        Graphics2D graphics2d = (Graphics2D) graphics;
        //设置字体
        graphics2d.setFont(new Font("宋体", Font.PLAIN,8));
        graphics2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        //打印格式

        graphics2d.drawString("销售凭证", 45, 25);
        graphics2d.drawString("存根联", 95, 25);

        graphics2d.drawString("——————————————————————————————————————————————", 1, 30);
        graphics2d.drawString("品名  货号  规格  生产厂商", 1, 40);
        graphics2d.drawString("批号  数量  单价  金额", 1, 50);
        graphics2d.drawString("----------------------------------------------", 1, 60);

        graphics2d.drawString("营业员: 2070793", 1, 75);

        graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
        graphics2d.drawString("交易号:000000000000 ", 70, 70);
        graphics2d.drawString("日期:2020-00-00 00:00:00", 70, 80);

        graphics2d.setFont(new Font("宋体", Font.PLAIN,8));

        graphics2d.drawString("真皮手套 63897 kg 江南皮革厂", 1, 105);
        graphics2d.drawString("1000001 1 200 200", 1, 115);
        graphics2d.drawString("——————————————————————————————————————————————", 1, 125);

        graphics2d.drawString("(兴)代表运动员慎用", 1, 135);
        graphics2d.drawString("折扣金额: 0 现金支付: 200", 1, 145);
        graphics2d.drawString("收款金额: 200(大写:贰佰元整)", 1, 155);
        graphics2d.drawString("收银员: Admin 服务费: 0", 1, 165);

        graphics2d.drawString("——————————————————————————————————————————————", 1, 180);
        graphics2d.drawString("会员号: 积分: ", 1, 190);
        graphics2d.drawString("返券数: ", 1, 200);
        graphics2d.drawString("——————————————————————————————————————————————", 1, 210);

        graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
        graphics2d.drawString("按照规定,除商品质量原因外,商品一经售出,不得退换。", 1, 220);

        graphics2d.setFont(new Font("宋体", Font.PLAIN,8));

        graphics2d.drawString("交易号: 000000000000", 1, 230);
        graphics2d.drawString("交易时间: 2020-00-00 00:00:00", 1, 240);
        graphics2d.drawString("门店电话: 888888", 1, 260);

        graphics2d.drawString("——————————————————————————————————————————————", 1, 280);
        graphics2d.drawString("----------------------------------------------", 1, 280);

//        graphics2d.drawImage(new BufferedImage());

        graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
        graphics2d.drawString("电子发票(E-Invoice)微信或支付宝扫一扫", 1, 290);
        graphics2d.drawString("需当日发票当日申请,二维码有效期 30天", 1, 300);

        BufferedImage bufferedImage = ZxingCodeUtil.getBufferedImage();

        graphics2d.drawImage(bufferedImage, null,1, 310);
        graphics2d.drawString("若开票异常,可联系上面门店电话,直接为您核实", 1, 400);
        graphics2d.drawString("收银小票是您获取发票的唯一凭证,请妥善保管", 1, 410);
        graphics2d.drawString("若有需要, 请联系门店开纸质发票,感谢您的配合!!", 1, 430);
        graphics2d.drawString("   ", 1, 450);//尾部留白
        return PAGE_EXISTS;
    }

    public static void printWordDayInfo() {
        try {
            Book book = new Book();
            PageFormat pf = new PageFormat();

            pf.setOrientation(PageFormat.PORTRAIT);
            Paper p = new Paper();
            //设置打印纸的大小一般是158,10000随便设的因为这是一卷纸不像A4纸是规定的
            p.setSize(158,500);
            //打印区域
            p.setImageableArea(0,0, 158,500);
            pf.setPaper(p);
            book.append(new PrintUtil(), pf);

            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(book);
            job.print();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("打印异常:"+e.getMessage());
        }
    }


    /**
     * 根据指定宽度自动换行
     * @param g
     * @param maxWdith
     * @param strContent
     * @param loc_X
     * @param loc_Y
     * @param font
     */
    private void drawStringWithFontStyleLineFeed(Graphics g, String strContent,int maxWdith, int loc_X, int loc_Y, Font font){
        g.setFont(font);
        //获取字符串 字符的总宽度
        int strWidth =getStringLength(g,strContent);
        //每一行字符串宽度
        int rowWidth=maxWdith;
        // System.out.println("每行字符宽度:"+rowWidth);
        //获取字符高度
        int strHeight=getStringHeight(g);
        //字符串总个数
        //  System.out.println("字符串总个数:"+strContent.length());
        if(strWidth>rowWidth){
            char[] strContentArr = strContent.toCharArray();
            int count = 0;
            int conut_value = 0;
            int line = 0;
            int charWidth = 0;
            for(int j=0;j< strContentArr.length;j++){

                if(conut_value>=rowWidth){
                    conut_value = 0;
                    g.drawString(strContent.substring(count,j),loc_X,loc_Y+strHeight*line);
                    count = j;
                    line++;

                }else{
                    if(j==strContentArr.length - 1){
                        g.drawString(strContent.substring(count,j),loc_X,loc_Y+strHeight*line);
                    }else{
                        charWidth = g.getFontMetrics().charWidth(strContentArr[j]);
                        conut_value = charWidth + conut_value;
                    }

                }

            }

        }else{
            //直接绘制
            g.drawString(strContent, loc_X, loc_Y);
        }

    }

    private int  getStringLength(Graphics g,String str) {
        char[]  strcha=str.toCharArray();
        int strWidth = g.getFontMetrics().charsWidth(strcha, 0, str.length());
        System.out.println("字符总宽度:"+strWidth);
        return strWidth;
    }


    private int  getStringHeight(Graphics g) {
        int height = g.getFontMetrics().getHeight();
        //System.out.println("字符高度:"+height);
        return height;
    }


    public static void main(String[] args) {
        // System.out.println("Value:"+test());
        // 打印pdf的一个方法,首先安装下PDFCreator软件
        try {
            printFile("D:\\PDF文件\\");
        } catch (Exception e) {
            System.out.println("打印文件异常:" + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void printFile(String path) throws Exception {
        File file = new File(path);
        File[] fies = file.listFiles();
        for (File f : fies) {
            System.out.println("file " + f.getName());
            String fileExt = f.getName().substring(
                    f.getName().indexOf(".") + 1, f.getName().length());
            if ("pdf".equalsIgnoreCase(fileExt)) {
                String filepath = path + File.separator + f.getName();
                File pdfFile = new File(filepath);
                // 构建打印请求属性集
                PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
                pras.add(new JobName(f.getName(), null));

                HashAttributeSet has = new HashAttributeSet();
//				has.add(new PrinterName("Officejet J5500 series", null)); // 添加打印机名称

                // 设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
                DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

                // 查找所有的可用打印服务
                PrintService printService[] = PrintServiceLookup
                        .lookupPrintServices(flavor, has);

                if (printService[1] != null) {
                    //获得打印服务的文档打印作业
                    DocPrintJob job = printService[1].createPrintJob(); // 创建打印任务

                    DocAttributeSet das=new HashDocAttributeSet();

                    InputStream fis = new FileInputStream(pdfFile); // 构造待打印的文件流
                    Doc doc = new SimpleDoc(fis, flavor, das); // 建立打印文件格式
                    job.print(doc, pras); // 进行文件的打印
                }
            }
        }
    }


    public static void printFile(InputStream fis) throws Exception {
        // 构建打印请求属性集
        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
        pras.add(new JobName("as", null));

        HashAttributeSet has = new HashAttributeSet();
//				has.add(new PrinterName("Officejet J5500 series", null)); // 添加打印机名称

        // 设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

        // 查找所有的可用打印服务
        PrintService printService[] = PrintServiceLookup
                .lookupPrintServices(flavor, has);

        if (printService[1] != null) {
            //获得打印服务的文档打印作业
            DocPrintJob job = printService[1].createPrintJob(); // 创建打印任务

            DocAttributeSet das=new HashDocAttributeSet();

//            InputStream fis = new FileInputStream(pdfFile); // 构造待打印的文件流
            Doc doc = new SimpleDoc(fis, flavor, das); // 建立打印文件格式
            job.print(doc, pras); // 进行文件的打印
        }
    }
}

此文章为该作者原创,禁止转载。