SSM条形码处理

  1. 条形码是一个很常见的东西,可以是商品价格,货物的编码等一切都有关,而他也可称为一维码。条形码的格式有很多,如:Code 39, Code 93, Code 128, Codabar, Interleaved 2 of 5, EAN-8, EAN-13, UPC-A, UPC-E等等。

  2. 在ssm上面实现绘画赋予数值的条形码,以0.33间隔的条形码实现格式为Code 128。而现在两种模式的条形码jar包,第一个是普通条形码包/barcode4j,第二个是可以在条形码下面的数字实现文字出现的包/google。

  3. 那么先看第二个可实现文字出现的条形码,而这里导入依赖包位置是使用maven创建的pom.xml里面,然后导入它需要用到的两个jar包,如下图:

com.google.zxing core 3.3.3 com.google.zxing javase 3.3.3
  1. 最后创建一个类绘画我所需要的条形码,流程为:首先用它生成条形码的图片,然后生成一个新的图片面板,再将条形码图片放到新的图片面板上,最后将文字放到图片面板上(条形码下方)。如下图:

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.oned.Code128Writer;

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;

import javax.imageio.ImageIO;

//1、首先用google zxing 生成条形码的图片
//2、生成一个新的图片面板
//3、将条形码图片放到新的图片面板上
//4、将文字放到图片面板上(条形码下方)

public class GoogleBarCodeUtils {
/** 条形码宽度 */
private static final int WIDTH = 300;

/** 条形码高度 */
private static final int HEIGHT = 50;

/** 加文字 条形码 */
private static final int WORDHEIGHT = 75;
/**
 * 1.设置 条形码参数
 */
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
    private static final long serialVersionUID = 1L;
    {
        // 设置编码方式
        put(EncodeHintType.CHARACTER_SET, "utf-8");
    }
};
/**
 * 2.生成 图片缓冲
 * @author fxbin
 * @param vaNumber  VA 码
 * @return 返回BufferedImage
 */
public static BufferedImage getBarCode(String vaNumber){
    try {
        Code128Writer writer = new Code128Writer();
        // 编码内容, 编码类型, 宽度, 高度, 设置参数
        BitMatrix bitMatrix = writer.encode(vaNumber,
                BarcodeFormat.CODE_128,
                WIDTH,
                HEIGHT,
                hints);
        return MatrixToImageWriter.toBufferedImage(bitMatrix);
    } catch (WriterException e) {
        e.printStackTrace();
    }
    return null;
}
/**
 * 3.把带logo的二维码下面加上文字
 * @author fxbin
 * @param image  条形码图片
 * @param words  文字
 * @return 返回BufferedImage
 */
public static BufferedImage insertWords(BufferedImage image, String words){
    // 新的图片,把带logo的二维码下面加上文字
    BufferedImage outImage = new BufferedImage(WIDTH, WORDHEIGHT, BufferedImage.TYPE_INT_RGB);

    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;
    //height + (outImage.getHeight() - height) / 2 + 12
    int wordStartY=HEIGHT+20;

    // 画文字
    g2d.drawString(words, wordStartX, wordStartY);
    g2d.dispose();
    outImage.flush();
    return outImage;
}

/**
 * 4.设置 Graphics2D 属性  (抗锯齿)
 * @param g2d  Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
 */
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);
}

/**
 * 5.设置背景为白色
 * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
 */
private static void setColorWhite(Graphics2D g2d){
    g2d.setColor(Color.WHITE);
    //填充整个屏幕
    g2d.fillRect(0,0,600,600);
    //设置笔刷
    g2d.setColor(Color.BLACK);
}

public static void main(String[] args) throws IOException {
    BufferedImage image = insertWords(getBarCode("SY-SY24700/7"), "盛元-SY24700/7");
    ImageIO.write(image, "jpg", new File("F:/TXM/barcode.png"));
}

}

  1. 最后运行结果如下图:
    6在这里插入图片描述

  2. 虽然过程有些麻烦,但大多是为了处理文字所出现的代码量。如果觉得麻烦的同时又不需要用到文字的出现,只需要英文数字就OK的话,可以用第一种,而且他的代码量可以说只有二三十行,极容易理解,和方便调试或更给数值参数,而他需要导入一个jar,如下图:

net.sf.barcode4j barcode4j-light 2.0
  1. 而b4j的流程很简单,首先得到要设置条形码的数据,和存放路径,然后设置好条形码的条形精细度,配置对象,最后就可以直接输出条形码了。代码如下图:

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
import org.springframework.util.StringUtils;

import java.awt.image.BufferedImage;
import java.io.*;

public class StrippedDownBarcode {

public static void generate(String msg, OutputStream ous){
    //1.判断msg是否有数据
    if (StringUtils.isEmpty(msg) || ous == null) {
        return;
    }

    //2.设置条形精细度(越大越细),条形宽度(越大越长),类型
    final int dpi=200;
    final double moduleWidth= UnitConv.in2mm(1.0f/dpi);
    String format = "image/png";

    //3.配置对象(宽度,条形间隔,两边是否留)
    Code39Bean bean=new Code39Bean();
    bean.setModuleWidth(moduleWidth);
    bean.setWideFactor(3);
    bean.doQuietZone(false);

    //4.绘画(输出流;生成;结束)
    try{
        BitmapCanvasProvider canvas=new BitmapCanvasProvider(ous,format,dpi,
                BufferedImage.TYPE_BYTE_BINARY,false,0);
        bean.generateBarcode(canvas,msg);
        canvas.finish();
    }catch (IOException e){
        throw new RuntimeException(e);
    }
}

public static File generateFile(String msg,String path){
    File file = new File(path);
    try{
        generate(msg,new FileOutputStream(file));
    }catch (FileNotFoundException e){
        throw new RuntimeException(e);
    }
    return file;
}

public static void main(String[] a){
    String msg="S Y 2 4 7 0 0";
    String path="F:/TXM/mm.png";
    generateFile(msg,path);
}

}

  1. 最后得到的条形码图片如下图:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值