近期项目需要将条码导出到具体的页面,如果每次导入到本地再展示,占用资源较多,因此考虑采用了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);