可以实时响应展示到前端页面的条形码模块

近期项目需要将条码导出到具体的页面,如果每次导入到本地再展示,占用资源较多,因此考虑采用了google的zxing,参考大佬java生成条形码中第二种方法。
部分代码在展示过程中,会因为字节转换而出问题,因此笔者做了一些改动。

工具类

package top.powersys.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class BarcodeUtils {
    private static int WIDTH = 350;
    private static int HEIGHT = 50;
    private static int WORDHEIGHT = 75;
    private static Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>(){
      private static final long serialVersionUID = 1L;
        {
            //设置编码方式
            put(EncodeHintType.CHARACTER_SET,"utf-8");
        }
    };

    /**
     * 生成图片缓冲
     * @param valNumber
     * @return
     */
    public static BufferedImage getBarCode(String valNumber){
        try {
            Code128Writer writer = new Code128Writer();
            BitMatrix bitMatrix = writer.encode(valNumber, BarcodeFormat.CODE_128,WIDTH,HEIGHT,hints);
            return MatrixToImageWriter.toBufferedImage(bitMatrix);
        } catch (WriterException e) {
            e.printStackTrace();
        }
    return null;
    }
    public static BufferedImage insertWords(BufferedImage image,String words){
        if(StringUtils.isNotEmpty(words)){
            BufferedImage outImage = new BufferedImage(WIDTH,WORDHEIGHT,BufferedImage.TYPE_INT_BGR);
            Graphics2D g2D = outImage.createGraphics();
            //抗锯齿
            setGraphics2D(g2D);
            //设置白色
            setColorWhite(g2D);

            //画条形码到新的面板
            g2D.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
            //画文字到新的面板
            Color color = new Color(0,0,0);
            g2D.setColor(color);
            g2D.setFont(new Font("微软雅黑",Font.PLAIN,18));
            int strWidth = g2D.getFontMetrics().stringWidth(words);
            int wordStartX = (WIDTH-strWidth) / 2;
            int wordStartY = HEIGHT+20;


            g2D.drawString(words,wordStartX,wordStartY);
            g2D.dispose();
            outImage.flush();
            return outImage;
        }
        return null;
    }

    /**
     * 设置Graphics属性(抗锯齿)
     * @param g2D
     */
    private static void setGraphics2D(Graphics2D g2D) {
        g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);
        Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);
        g2D.setStroke(s);
    }

    private static void setColorWhite(Graphics2D g2D){
        g2D.setColor(Color.white);
        //填充范围
        g2D.fillRect(0,0,600,600);
        //笔刷
        g2D.setColor(Color.BLACK);
    }

    /**
     * 生成条形码字节数组,用于外部调用
     * @param imgText 图片名称
     * @return
     * @throws IOException
     */
    public static String getArrayCode(String imgText) throws IOException {
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        ImageIO.write(getBarCode(imgText),"png",bao);
        //一定要把Base64加密后内容转换成String而不是byte[],不然发送到前端后展示数据解析会有问题
        return Base64.encodeBase64String(bao.toByteArray());
        
    }

    public static void main(String[] args) throws IOException {
        BufferedImage image = insertWords(getBarCode("05910050405004"),"05910050405004");
        BufferedImage i1 = getBarCode("015910010101011");
        ImageIO.write(i1,"jpg",new File("E:\\111.png"));// 本地生成
    }
}

然后在业务层可以对具体参数封装到model中传到前端

控制业务层(摘录)

try {
			//vr是返回到前端的Data,msno是需要生成条形码的text内容
            vr.setBarcode(BarcodeUtils.getArrayCode(msno));
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("barcode exception:" + e.getMessage());
        }


        // vr.setEnergymoney(amount.setScale(2, RoundingMode.HALF_UP));
        jr.setData(vr);
        jr.setErrorCode(0);
        return jr;

前端数据处理

<img id="barcode">
$("#barcode").attr("src","data:image/png;base64," + data.data.barcode);

参考:
java生成条形码
ajax接受流数据图片方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镜云兮

打赏的都是爷~求各位爷可怜可怜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值