https://blog.csdn.net/hechurui/article/details/51995125
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.haier.bean.PolicyBean; import com.haier.dto.PolicyPersonDto; import com.haier.dto.PolicyProductDto; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class PictureUtil { private static void createImage(String fileLocation, BufferedImage image) { try { FileOutputStream fos = new FileOutputStream(fileLocation); BufferedOutputStream bos = new BufferedOutputStream(fos); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); encoder.encode(image); bos.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } public static void graphicsGeneration(String path, PolicyBean policyBean) { int imageWidth = 1000;// 图片的宽度 int imageHeight = 1000;// 图片的高度 BufferedImage 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.ORANGE); graphics.setFont(new Font("宋体", Font.BOLD, 20)); PolicyPersonDto policyPersonDto = policyBean.getPolicyPersonDto(); PolicyProductDto policyProductDto = policyBean.getPolicyProductDto(); int num = 50; graphics.drawString("手机号 : " + policyPersonDto.getMobile(), 50, num); num += 50; graphics.drawString("登陆密码 : " + policyPersonDto.getPassword(), 50, num); num += 50; graphics.drawString("身份证号 : " + policyPersonDto.getIdentityCard(), 50, num); num += 50; graphics.drawString("姓名 : " + policyPersonDto.getUserName(), 50, num); num += 50; graphics.drawString("所在地区 : " + policyPersonDto.getArea(), 50, num); num += 50; graphics.drawString("常住地址 : " + policyPersonDto.getAddress(), 50, num); num += 50; graphics.drawString("微信号 : " + policyPersonDto.getWechatNo(), 50, num); num += 50; graphics.drawString("QQ号 : " + policyPersonDto.getQq(), 50, num); num += 50; graphics.drawString("Email : " + policyPersonDto.getEmail(), 50, num); num += 50; graphics.drawString("品牌 : " + policyProductDto.getBrand(), 50, num); num += 50; graphics.drawString("型号 : " + policyProductDto.getModel(), 50, num); num += 50; graphics.drawString("商品编号 : " + policyProductDto.getProductId(), 50, num); num += 50; graphics.drawString("购买日期 : " + policyProductDto.getPurchaseDate(), 50, num); num += 50; graphics.drawString("购买价格 : " + policyProductDto.getPurchasePrice(), 50, num); num += 50; graphics.drawString("购买途径 : " + policyProductDto.getPurchaseWay(), 50, num); num += 50; graphics.drawString("报修电话 : " + policyProductDto.getWarrantyPhone(), 50, num); num += 50; graphics.drawString("延保单位 : " + policyProductDto.getExtendedWarrantyUnit(), 50, num); num += 50; graphics.drawString("延保电话 : " + policyProductDto.getExtendedWarrantyPhone(), 50, num); num += 50; graphics.drawString("发票编号 : " + policyProductDto.getInvoiceNo(), 50, num); createImage(path, image); } public static void main(String[] args){ List<Map> list = new ArrayList<Map>(); Map<String, String> mapTitle1 = new HashMap<String, String>(); mapTitle1.put("title", "使用人信息"); list.add(mapTitle1); Map<String, String> map1 = new HashMap<String, String>(); map1.put("客户姓名", "张三"); map1.put("手机号", "123123"); map1.put("身份证号", "230302198811241234"); list.add(map1); Map<String, String> map2 = new HashMap<String, String>(); map2.put("送货地址", "北京市海淀区知春路113号银网中心B座1009室"); list.add(map2); Map<String, String> map3 = new HashMap<String, String>(); map3.put("微信号码", "123123"); map3.put("qq号码", "123123"); map3.put("电子邮箱", "[email protected]"); list.add(map3); Map<String, String> mapTitle2 = new HashMap<String, String>(); mapTitle2.put("title", "购买人信息"); list.add(mapTitle2); Map<String, String> map4 = new HashMap<String, String>(); map4.put("姓名", "张三朋友"); map4.put("手机号", "15612341122"); map4.put("身份证号", "230302198811241234"); list.add(map4); Map<String, String> mapTitle3 = new HashMap<String, String>(); mapTitle3.put("title", "产品信息"); list.add(mapTitle3); Map<String, String> map5 = new HashMap<String, String>(); map5.put("产品型号", "ALI88"); map5.put("凭证类型", "发票"); map5.put("购买日期", "2014-12-02"); list.add(map5); Map<String, String> map6 = new HashMap<String, String>(); map6.put("购买商城", "ALI88"); map6.put("凭证编号", "发票"); list.add(map6); int imageWidth = 1200;// 图片的宽度 int imageHeight = 1000;// 图片的高度 BufferedImage 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); int high = 100; int wigth = 0; graphics.setFont(new Font("宋体", Font.BOLD, 50)); graphics.drawString("注册保单", 500, high); graphics.setFont(new Font("宋体", Font.BOLD, 20)); high += 10; graphics.drawLine(50, high, 1150, high); for(Map<String, String> rowMap : list){ high += 50; wigth = 50; for(Map.Entry<String, String> entry : rowMap.entrySet()){ String name = entry.getKey() + ":" + entry.getValue(); if("title".equals(entry.getKey())){ high += 50; graphics.setFont(new Font("黑体", Font.BOLD, 30)); graphics.drawString(entry.getValue(), wigth, high); graphics.setFont(new Font("宋体", Font.BOLD, 20)); } else { graphics.drawString(name, wigth, high); wigth += 400; } } } createImage("D://test1.jpg", image); } }
2、生成一个表格:
public void graphicsGeneration() throws Exception { // 实际数据行数+标题+备注 int totalrow = 6; int totalcol = 5; int imageWidth = 1024; int imageHeight = totalrow * 40 + 20; int rowheight = 40; int startHeight = 10; int startWidth = 10; int colwidth = ((imageWidth - 20) / totalcol); BufferedImage 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(new Color(220, 240, 240)); // 画横线 for (int j = 0; j < totalrow - 1; j++) { graphics.setColor(Color.black); graphics.drawLine(startWidth, startHeight + (j + 1) * rowheight, imageWidth - 5, startHeight + (j + 1) * rowheight); } // 末行 graphics.setColor(Color.black); graphics.drawLine(startWidth, imageHeight - 90, imageWidth - 5, imageHeight - 90); // 画竖线 for (int k = 0; k < totalcol; k++) { graphics.setColor(Color.black); graphics.drawLine(startWidth + k * colwidth, startHeight + rowheight, startWidth + k * colwidth, imageHeight - 50); } // 末列 graphics.setColor(Color.black); graphics.drawLine(imageWidth - 5, startHeight + rowheight, imageWidth - 5, imageHeight - 50); // 设置字体 Font font = new Font("华文楷体", Font.BOLD, 20); graphics.setFont(font); // 写标题 String title = "标题写在这里"; graphics.drawString(title, imageWidth / 3 + startWidth, startHeight + rowheight - 10); font = new Font("华文楷体", Font.BOLD, 18); graphics.setFont(font); // 写入表头 String[] headCells = { "编号", "名称", "年龄", "性别", "体重" }; for (int m = 0; m < headCells.length; m++) { graphics.drawString(headCells[m].toString(), startWidth + colwidth * m + 5, startHeight + rowheight * 2 - 10); } // 设置字体 font = new Font("华文楷体", Font.PLAIN, 16); graphics.setFont(font); String[][] cellsValue = { { "101", "xiaozhang", "13", "M", "55" }, { "102", "xiaowang", "14", "F", "53" }, { "103", "同事接听,工作信息核实无误,收入纯打卡,无现金发薪同事接听,工作信息核实无误,收入纯打卡,无现金发薪同事接听,工作信息核实无误,收入纯打卡,无现金发薪同事接听,工作信息核实无误,收入纯打卡,无现金发薪", "15", "M", "58" } }; // 写入内容 for (int n = 0; n < cellsValue.length; n++) { String[] arr = cellsValue[n]; for (int l = 0; l < arr.length; l++) { graphics.drawString(cellsValue[n][l].toString(), startWidth + colwidth * l + 5, startHeight + rowheight * (n + 3) - 10); } } font = new Font("华文楷体", Font.BOLD, 18); graphics.setFont(font); graphics.setColor(Color.RED); // 写备注 String remark = "备注:备注写在这里。"; graphics.drawString(remark, startWidth, imageHeight - 30); //createImage("D:\\1.jpg"); ImageIO.write(image, "jpg", new File("D:\\1.jpg")); }3、 实现条码打印源码,Graphics2D 在图片上画表格,图片等
/** * 打印模版 * * @param imgWidth 图片的宽度 * @param imgHeight 图片的高度 * @param x 起始x轴 * @param y 起始y轴 * @param rowHeight 每行的高度 * @param dataStart 数据缩进 * @param firstWidth 第一列间距x坐标 * @param secondWidth 第二列间距x坐标 * @param thirdWidth 第三列间距x坐标 * @param fourWidth 第四列间距x坐标 * @param tb 实体对象 * @return BufferedImage *(参数自己定,我的是340, 200, 0, 0, 20, 10, 60, 190, 250, 340, tb) */ private BufferedImage createTbGraphics(int imgWidth, int imgHeight, int x, int y, int rowHeight, int dataStart, int firstWidth, int secondWidth, int thirdWidth, int fourWidth, Tb tb) { //空白面板 也可是张图片 BufferedImage image = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = null; try { g = image.createGraphics();// 得到图形上下文 g.setBackground(Color.WHITE);//设置背景色 g.fillRect(x, y, imgWidth, imgHeight);//填充整个屏幕 g.setColor(Color.BLACK);//设置画笔颜色 // g.setFont(new Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 12));// 设置字体 这种以及“非国产”是乱码 有办法解决的话也可为实线, 我认为乱码是因为条码打印机的缘故,这样就要二次开发打印机,所以我没要这种方法 g.setFont(new Font("微软雅黑", Font.TYPE1_FONT, 12));// 设置字体 还可设置为Font.ITALIC 就这两种条码打印机打印出来的的线是实体线 // g.setFont(new Font("simsun", Font.TYPE1_FONT, 12));// jvm里 想将字体格式simsun存入jvm里直接调用,打印出来也不成 g.drawLine(x, y, imgWidth, y);// 第一条横线 g.drawLine(x, y, x, rowHeight);//竖线 // g.drawString(new String("名称".getBytes("utf-8"),"utf-8"), dataStart, rowHeight - 5); g.drawString("名称", dataStart, rowHeight - 5); g.drawLine(firstWidth, y, firstWidth, rowHeight); g.drawString(tb.getName() == null ? "" : tb.getName() , firstWidth + dataStart, rowHeight - 5); g.drawLine(imgWidth - 1, y, imgWidth - 1, rowHeight); g.drawLine(x, rowHeight, imgWidth, rowHeight); //横线 g.drawLine(x, rowHeight, x, rowHeight * 2); g.drawString("代码", dataStart, rowHeight * 2 - 5); // * 2代表第二行 g.drawLine(firstWidth, rowHeight, firstWidth, rowHeight * 2); g.drawString(tb.getCode() == null ? "" : tb.getCode() , firstWidth + dataStart, rowHeight * 2 - 5); g.drawLine(secondWidth, rowHeight, secondWidth, rowHeight * 2); //其他数据.... //最后一条线 g.drawLine(x, imgHeight - 1, imgWidth, imgHeight - 1); //在指定坐标(198,61)处 写入二维码或其它图片 g.drawImage(ImageIO.read(getServletContext().getResourceAsStream(t.getPicUrl())), null, 198, 61); g.dispose(); } catch (IOException e) { e.printStackTrace(); } return image; }