超市/饭店等收据或者小票的生成代码
Posted wxw_wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超市/饭店等收据或者小票的生成代码相关的知识,希望对你有一定的参考价值。
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"); } }
以上是关于超市/饭店等收据或者小票的生成代码的主要内容,如果未能解决你的问题,请参考以下文章
小白学前端化腐朽为神奇-HTML+CSS3实现永和小票(day01-2)