package com.dy.common.util; 
 | 
  
 | 
import com.google.zxing.BarcodeFormat; 
 | 
import com.google.zxing.EncodeHintType; 
 | 
import com.google.zxing.WriterException; 
 | 
import com.google.zxing.client.j2se.MatrixToImageWriter; 
 | 
import com.google.zxing.common.BitMatrix; 
 | 
import com.google.zxing.qrcode.QRCodeWriter; 
 | 
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; 
 | 
  
 | 
import javax.imageio.ImageIO; 
 | 
import java.awt.*; 
 | 
import java.awt.image.BufferedImage; 
 | 
import java.io.File; 
 | 
import java.io.IOException; 
 | 
import java.util.HashMap; 
 | 
import java.util.Map; 
 | 
  
 | 
public class QrCodeTest1 { 
 | 
  
 | 
    public static void main(String[] args) throws Exception { 
 | 
  
 | 
        String[] text = {"12345678;超声波水表;民旺道10号;大禹研究院;020-12345678;106.872615383,11.466578703"}; 
 | 
  
 | 
        String imgpath = "D:\\demo\\"; 
 | 
  
 | 
        for (int i = 0; i < text.length; i++) { 
 | 
  
 | 
            String[] s = text[i].split(";"); 
 | 
  
 | 
            String[] lines = {"设备编号:" + s[0], "设备类型:" + s[1], "道路名称:" + s[2], "管护单位:" + s[3], "报修电话:" + s[4]}; 
 | 
            String[] line = {s[0], s[1], s[2], s[3], s[4]}; 
 | 
  
 | 
            createq(lines, line, imgpath + "test.jpeg"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    static void createq(String[] lines, String[] line, String imgpath) { 
 | 
  
 | 
        String qrCodeText = line[0]; 
 | 
  
 | 
        //二维码大小 
 | 
        int size = 400; 
 | 
  
 | 
        //画布大小 
 | 
        int combinedWidth = size + 800; 
 | 
        int combinedHeight = size + 400 ; 
 | 
  
 | 
        //标题高度 
 | 
        int topsize = 160; 
 | 
  
 | 
        //设置标题y坐标 
 | 
        int yTitle = 110; 
 | 
  
 | 
        //设置画布内边距 
 | 
        int padding = 5; 
 | 
  
 | 
        //设置标题内容 
 | 
        String title = "大禹集团"; 
 | 
  
 | 
        //设置图片dpi 
 | 
        int dpi = 300; 
 | 
  
 | 
        Color blue = new Color(75, 125, 178); 
 | 
  
 | 
        //设置二维码参数 
 | 
        Map hints = new HashMap(); 
 | 
  
 | 
        //设置UTF-8, 防止中文乱码 
 | 
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 
 | 
  
 | 
        // 设置二维码的容错性 
 | 
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 
 | 
  
 | 
        //留白 默认4 
 | 
        hints.put(EncodeHintType.MARGIN, 1); 
 | 
  
 | 
        // 码版本,取值为 1 到 40 ,根据二维码内容决定最低版本 
 | 
        hints.put(EncodeHintType.QR_VERSION, 3); 
 | 
  
 | 
        //创建码位图 
 | 
        BitMatrix bitMatrix = null; 
 | 
        try { 
 | 
            bitMatrix = new QRCodeWriter().encode(qrCodeText, BarcodeFormat.QR_CODE, size, size, hints); 
 | 
        } catch (WriterException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
  
 | 
        //将生成码位图转换成BufferedImage 
 | 
        BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix); 
 | 
  
 | 
        //创建空白BufferedImage 
 | 
        BufferedImage combined = new BufferedImage(combinedWidth, combinedHeight, BufferedImage.TYPE_INT_RGB); 
 | 
  
 | 
        //从BufferedImage对象中获取画布(Graphics2D)对象 
 | 
        Graphics2D graphics = combined.createGraphics(); 
 | 
  
 | 
        //设置渲染提示为启用文本抗锯齿 
 | 
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
 | 
  
 | 
        //默认开启绘图抗锯齿 
 | 
        //graphics.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT); 
 | 
  
 | 
        //设置空白画布整体背景颜色 
 | 
        GraphicsUtils.drawBackground(graphics,0, 0, combinedWidth, combinedHeight,Color.WHITE); 
 | 
  
 | 
        //绘制表格画线 
 | 
        //绘制线在内边距内,不影响其它内容,-1操作 
 | 
        int linepadding = padding - 1 ; 
 | 
        //绘制矩形 
 | 
        GraphicsUtils.drawRectangle(graphics,linepadding,linepadding,combinedWidth-linepadding*2,combinedHeight-linepadding*2,Color.BLACK); 
 | 
        //绘制内三横线 
 | 
        GraphicsUtils.drawLine(graphics,linepadding,padding+topsize+1,combinedWidth-linepadding,padding+topsize+1,Color.BLACK); 
 | 
        GraphicsUtils.drawLine(graphics,linepadding,padding+topsize+size+2,combinedWidth-linepadding,padding+topsize+size+2,Color.BLACK); 
 | 
        GraphicsUtils.drawLine(graphics,linepadding,combinedHeight-(combinedHeight-padding*2-topsize-size+2)/2 - padding,combinedWidth-linepadding,combinedHeight-(combinedHeight-padding*2-topsize-size+2)/2 - padding,Color.BLACK); 
 | 
        //绘制二维码竖线及右边2横线 
 | 
        GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1,padding+size+1,padding+topsize+size+1,Color.BLACK); 
 | 
        GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1+size/3,combinedWidth-linepadding,padding+topsize+1+size/3,Color.BLACK); 
 | 
        GraphicsUtils.drawLine(graphics,padding+size+1,padding+topsize+1+size/3*2,combinedWidth-linepadding,padding+topsize+1+size/3*2,Color.BLACK); 
 | 
  
 | 
        //该方法用于绘制头部绘制矩形并填充指定颜色 
 | 
        GraphicsUtils.drawFillRect(graphics,padding, padding, combinedWidth-(padding*2), topsize,blue); 
 | 
  
 | 
        //二维码插入画布 
 | 
        GraphicsUtils.drawImage(graphics,qrImage, padding, topsize+padding+2); 
 | 
  
 | 
        //该方法用于绘制头部绘制矩形并填充指定颜色 
 | 
        GraphicsUtils.drawBackground(graphics,padding, padding, combinedWidth-(padding*2), topsize,blue); 
 | 
  
 | 
        //绘制头部字体 
 | 
        Font titleFont = new Font("宋体", Font.BOLD, 70); 
 | 
        GraphicsUtils.drawFont(graphics,titleFont,Color.white); 
 | 
        FontMetrics fontMetrics = graphics.getFontMetrics(); 
 | 
        int fontWidth = fontMetrics.stringWidth(title); 
 | 
        int xTitle = ((combinedWidth - fontWidth) / 2); 
 | 
        GraphicsUtils.drawText(graphics,title,xTitle, yTitle+padding,titleFont,Color.white); 
 | 
  
 | 
        //绘制非头部字体 
 | 
  
 | 
        //设置字体及颜色 
 | 
        Font downFont = new Font("宋体", Font.BOLD, 50); 
 | 
        GraphicsUtils.drawFont(graphics,downFont,Color.BLACK); 
 | 
  
 | 
        fontMetrics = graphics.getFontMetrics(); 
 | 
  
 | 
        int fontHeight  = fontMetrics.getHeight(); 
 | 
  
 | 
        for (int i = 0; i < lines.length; i++) { 
 | 
  
 | 
            if (i < 3){ 
 | 
                graphics.drawString(lines[i], size+padding+5, topsize+padding+ (size/3) * i + (size/3+fontHeight)/2 ); 
 | 
            }else if (i == 3){ 
 | 
                int test =  combinedHeight-(combinedHeight-padding*2-topsize-size)/4*3 - padding + fontHeight/2 ; 
 | 
                graphics.drawString(lines[i], 5+padding, test); 
 | 
            } 
 | 
            else if (i == 4){ 
 | 
                int test =  combinedHeight-(combinedHeight-padding*2-topsize-size)/4 - padding + fontHeight/2 ; 
 | 
                graphics.drawString(lines[i], 5+padding, test); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        graphics.dispose(); 
 | 
  
 | 
        try { 
 | 
            ImageIO.write(combined, "jpeg",new File(imgpath) ); 
 | 
        } catch (IOException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |