超市/饭店等收据或者小票的生成代码

package com.chauvet.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.swing.JLabel;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/***
 * 生成 80打印机 图片
 * @author WXW
 *
 */
public class CreateImage {

    public static BufferedImage image;

     public static String createImage(String fileLocation) {
     try {
         FileOutputStream fos = new FileOutputStream(fileLocation);
         BufferedOutputStream bos = new BufferedOutputStream(fos);
         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
         encoder.encode(image);
         bos.close();
     } catch (Exception e) {
         e.printStackTrace();
     }
         return fileLocation;
     }

     /***
      * 生成图片
      * @param map
      *          菜品集合,可以为map或者list 根据情况修改
      * @param imgPath
      *          生成的图片存放的路径
      * @return
      *         此处返回的是生成的图片高度,因为掉打印接口的时候需要这个高度
      */
     public static int graphicsGeneration(Map<String,String> map,String imgPath) {
         int x = 10;
         int y = 20;
         int marginY = 30;
         Double price = 20.0;

         createDir(imgPath.substring(0, imgPath.lastIndexOf("/")));//创建目录
         Random ne=new Random();
         int imageWidth = 302;//80打印机能打印的图片的宽度(固定值)       计算公式  打印机宽度(80打印机为800,58打印机为580)/96*25.4
         int imageHeight = 500+map.keySet().size()*40;//图片的高度(500是标题的高度)    根据map/list中的值自动计算
         image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
         Graphics graphics = image.getGraphics();
         graphics.setColor(Color.WHITE);
         graphics.fillRect(0, 0, imageWidth, imageHeight);
         graphics.setColor(Color.BLACK);

         /***
          * 标题字体
          */
         Font fontTitle=new Font("黑体",Font.BOLD,22);
         graphics.setFont(fontTitle);
         FontMetrics fm = new JLabel().getFontMetrics(fontTitle);

         String title = "味多美上地店";
         int width = fm.stringWidth(title);
         y = y + marginY;
         int titleMaxLength = 220;
         if(width > titleMaxLength){
             graphics.drawString(title.substring(0, 9), (imageWidth - titleMaxLength) / 2, y);
             y = y + marginY;
             String lastTitle = title.substring(9, title.length());
             int lastLength = fm.stringWidth(lastTitle);
             graphics.drawString(lastTitle, (imageWidth - lastLength) / 2, y);
         }else{
             graphics.drawString(title, (imageWidth - width) / 2, y);
         }

         y = y + marginY;

         String yjd = "预结单";
         int yjdWidth = fm.stringWidth(yjd);
         graphics.drawString(yjd, (imageWidth - yjdWidth) / 2, y);
         y = y + marginY;

         String zh = "桌号:大厅-"+ne.nextInt(10)+1;
         graphics.drawString(zh, x, y);
         y = y + marginY;

         String ddbm = "订单编码:"+ne.nextInt(9999-1000+1);
         graphics.drawString(ddbm, x, y);
         y = y + marginY;

         Font font=new Font("宋体",Font.PLAIN,16);
         fm = new JLabel().getFontMetrics(font);
         graphics.setFont(font);
         graphics.drawString("订单号:"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+System.currentTimeMillis(), x, y);
         y = y + marginY;
         graphics.drawString("操作人:Husky", x, y);
         y = y + marginY;
         graphics.drawString("订单时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), x, y);
         y = y + marginY;
         graphics.drawString("支付状态:未支付", x, y);

         y = y + 15;
         graphics.drawString("-----------------------------------", x, y);
         y = y + 15;
         graphics.drawString("品名", x, y);
         graphics.drawString("单价 * 数量", 140, y);
         graphics.drawString("金额", imageWidth-(x+40), y);
         y = y + 15;
         graphics.drawString("-----------------------------------", x, y);
         int cpWidth = 0;
         Double allMoney = 0D;
         for(String str : map.keySet()){
             y = y + marginY;
             String cp = str;
             cpWidth = fm.stringWidth(cp);

             if(cpWidth >= 130){

                 String cp1 = cp.substring(0, 7);
                 graphics.drawString(cp1, x, y);
                 String cp2 = cp.substring(7, cp.length());
                 graphics.drawString(cp2, x, y+20);

             }else{
                 graphics.drawString(cp, x, y);
             }

             graphics.drawString(price+" * "+map.get(str), 140, y);
             Double totalVal = (Double.parseDouble(map.get(str))*price);
             allMoney = allMoney + totalVal;
             graphics.drawString(""+totalVal, imageWidth-(x+40), y);    

             if(cpWidth >= 130){
                 y = y + marginY;
             }
         }

         y = y + marginY;
         if(cpWidth >= 130){
             y = y + 15;
         }
         graphics.drawString("-----------------------------------", x, y);
         y = y + 15;
         DecimalFormat    df   = new DecimalFormat("######0.00");
         graphics.drawString("消费合计", x, y);
         graphics.drawString(""+map.keySet().size(), 140, y);
         graphics.drawString(df.format(allMoney), imageWidth-(x+60), y);
         y = y + 15;
         graphics.drawString("-----------------------------------", x, y);
         y = y + marginY;

         String totalMoney = "总金额:"+df.format(allMoney);
         int mWith = fm.stringWidth(totalMoney);
         graphics.drawString(totalMoney, imageWidth-(mWith+20), y);
         y = y + marginY;

         graphics.setFont(fontTitle);
         String ysje = "应收金额:"+df.format(allMoney);
         int ysWidth = fm.stringWidth(ysje);
         graphics.drawString(ysje, imageWidth-(ysWidth+x+60), y);
         BufferedImage bimg = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
         graphics.drawImage(bimg, imageWidth, 0, null);
         graphics.dispose();
         String  imageUrl = createImage(imgPath);
         int height = (int) (imageHeight/96*25.4);
         return height;//返回生成的图片高度或者地址
     }

     /**
      * 创建图片存放目录
      * 如果目录不存在   创建
      * @param destDirName
      * @return
      */
     public static boolean createDir(String destDirName) {
         File dir = new File(destDirName);
         if(dir.exists()) {
              System.out.println("创建目录" + destDirName + "失败,目标目录已存在!");
              return false;
         }
         if(!destDirName.endsWith(File.separator))
          destDirName = destDirName + File.separator;
         // 创建单个目录
         if(dir.mkdirs()) {
          System.out.println("创建目录" + destDirName + "成功!");
          return true;
         } else {
          System.out.println("创建目录" + destDirName + "成功!");
          return false;
         }
     }

    public static void main(String[] args) {

        Map<String,String> map = new HashMap<String, String>();
        map.put("番茄鸡蛋", "1");
        map.put("蒜苔腊肉", "2");
        map.put("农家小炒肉", "3");
        map.put("干锅辣子鸡炒芹菜炖豆腐", "4");
//        map.put("番茄鸡蛋1", "5");
//        map.put("蒜苔腊肉2", "6");
//        map.put("农家小炒肉3", "7");

        CreateImage.graphicsGeneration(map,"D:/123/1.jpg");
    }
}
时间: 2024-10-05 10:58:57

超市/饭店等收据或者小票的生成代码的相关文章

PxCook 点击设计稿即可生成代码前端,高效智能的设计研发工具,智能标注软件。

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] PxCook 像素大厨 设计师一键拖拽上传后,可智能标注.然后程序员点击pxcp即可生成css xml swift objective-c还有NativeReact的代码了.支持画板解析.项目 字多不看的话 (走心要听: 这次3.0版本相比于之前更加高效,易用.支持 Win & Mac ,并且是支持PS和Sketch全平台. 拖拽即用和一键流的理念我想都明白它易用性的含义.不但体现在设计稿导入上,智能标注和生成代码也是一样.

使用 Velocity 模板引擎快速生成代码

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ Velocity 是一个基于 Java 的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由 Java 代码定义的对象,从而实现界面和 Java 代码的分离,使得界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点.但是在实际应用过程中,Velocity 又不仅仅被用在了 MVC 的架构中. Velocity 模板引擎介绍 在现今的软

java自动生成代码

看到这个标题,如果你以为真的可以完全自动生成,那你就太Naive啦 我这里想介绍的是,利用模板生成我们需要的代码 一.模板 首先来说说模板,常见的java模板有:FreeMarker.Velocity.Jamon.JByte等等. 不熟悉的可以百度下,其实我了解也不多,哈哈. 二.原理 其实就是利用模板,填充数据,得到我们需要的代码.即:输出=模板+数据 三.实例 实例利用FreeMarker来做的,所以你需要先导入freemarker的jar包 假设我们需要自动生成一个java bean,那么

json 对c++类的序列化(自动生成代码)

[动机] 之前写网络协议的时候,使用的是google protobuf,protobuf不但在性能和扩展性上有很好的优势,protoc自动生成c++类代码的工具,这点确实给程序员带来了很多便利. 做后面一项目使用的json格式来传输,然后就萌生了实现像protoc这样的工具,根据json文件来生成c++类代码,并且生成序列化代码,这样在写网络的时候就无需把jsonvalue序列化散落在各处. [思路] 之前写object-c的时候,如果你要对类的序列化,你必须实现NSCoding协议(接口),

T4模板:MVC中用T4模板快速生成代码

T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true" language="C#" #> <#@ include file="EF.Utility.CS.ttinclude"#> <#@ output extension=".cs" #> <# CodeG

ButterKnife的使用以及不能自动生成代码问题的解决

ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又赔了配环境(linux),并且根据老大的要求看了一些相关的知识点,其中在用到有个工具的时候与到了一些奇葩的问题,就是ButterKnife的不能自动生成代码的问题,查了好多资料和博客才查到,现在总结一下,以备同为码农的程序员不时之需. 大家知道在我们android编程的时候,经常会遇到findVie

maven插件mybatis-generator生成代码配置

鸣谢:http://my.oschina.net/u/1763011/blog/324106?fromerr=nJakGh4P (也可参看此博客进行配置) http://www.cnblogs.com/zcy_soft/p/3358132.html(补充1) http://blog.csdn.net/sunny243788557/article/details/45166397 (补充2) http://www.cnblogs.com/yjmyzz/p/4210554.html (补充3) ht

yii2使用Gii生成代码

本章节将介绍如何使用 Gii 去自动生成 Web 站点常用功能的代码.使用 Gii 生成代码非常简单,只要按照 Gii 页面上的介绍输入正确的信息即可. 贯穿本章节,你将会学到: 在你的应用中开启 Gii 使用 Gii 去生成活动记录类 使用 Gii 去生成数据表操作的增查改删(CRUD)代码 自定义 Gii 生成的代码 开始 Gii Gii 是 Yii 中的一个模块.可以通过配置应用的 [[yii\base\Application::modules|modules]] 属性开启它.通常来讲在 

mybatis generator生成代码工具的使用

mybatis generator生成代码工具的使用, 附demo 使用Hibernate时, 可以很方便的生成model,dao,和映射配置文件.在mybatis里, 也有生成器, 即mybatis generator, 简称MBG. 下面为大家介绍一下MBG的使用. 下载mybatis-generator-core-1.3.1-bundle.zip之后, 解压得到mybatis-generator-core-1.3.1.jar, 即生成器的jar包, 将mybatis-3.0.6.jar和m