条形码生成总结

学习条形码的坎坷路

生成条形码:采用BarCode4j插件,使用版本:barcode4j-2.1.0
下载地址
使用方法:项目导入barcode4j.jar和avalon-framework-4.2.0.jar两个架jar包
在网上没找到详细的教学,只能硬着头皮读官方文档(英语很烂太难了)
地址:http://barcode4j.sourceforge.net/trunk/index.html
经过大量的时间浪费之后,终于找对地方了
在这里插入图片描述
1.可以使用加载XML API配置生成条形码(放弃)
2.使用Bean API(推荐)
下面是官方推荐步骤:

The steps necessary to create barcodes using JavaBeans is similar to the steps using XML:
1.Create a barcode bean
2.Set the desired values to configure the barcode generator
3.Create a CanvasProvider (depending on the output format)
4.Finally generate the barcode

下面是核心代码(官方):

//Create the barcode bean
Code39Bean bean = new Code39Bean();
final int dpi = 150;
//Configure the barcode generator
bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar 
                                                //width exactly one pixel
bean.setWideFactor(3);
bean.doQuietZone(false);
//Open output file
File outputFile = new File("out.png");
OutputStream out = new FileOutputStream(outputFile);
try {
    //Set up the canvas provider for monochrome PNG output 
    BitmapCanvasProvider canvas = new BitmapCanvasProvider(
            out, "image/x-png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
    //Generate the barcode
    bean.generateBarcode(canvas, "123456");
    //Signal end of generation
    canvas.finish();
} finally {
    out.close();
}

具体步骤解释,请查看官方文档
以上操作耗费一上午的时间,才将条形码成功生成。
以下是实际需求代码(有借鉴,具体原创找不到,会在文章最后添加转载)
类名:BarcodeUtil
msg:条形码信息
ous:输出流:可为ByteArrayOutputStream字节流 和 FileOutputStream文件流

public static void generate(String msg, OutputStream ous) {
        if (StringUtils.isEmpty(msg) || ous == null) {
            return;
        }
        Code39Bean bean = new Code39Bean();
        // 精细度
        final int dpi = 200;
        // module宽度
        final double moduleWidth = UnitConv.in2mm(1.0f / dpi);
        // 配置对象
        bean.setModuleWidth(moduleWidth);
        //设置宽条和窄条因子
        bean.setWideFactor(3);
        bean.doQuietZone(false);
        String format = "image/png";
        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);
        }
    }

下方为具体调用,可将条形码转为字节流和文件

/**
     * 生成文件
     *
     * @param msg
     * @param path
     * @return
     */
    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;
    }

    /**
     * 生成字节
     *
     * @param msg
     * @return
     */
    public static byte[] generate(String msg) {
        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        generate(msg, ous);
        return ous.toByteArray();
    }

下面记录将条形码图片展示页面的方法:
一、使用字节流:
1.前端采用img标签,src=“action路径”方式
后端代码:

   @RequestMapping("/sendImage")
    public void sendImage(HttpServletResponse response) throws IOException {
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        response.setHeader("expires", "0");
        /**
         * response。setHeader()具体作用有待研究
         */
        byte[] bytes = BarcodeUtil.generate("123456");
        OutputStream ous = response.getOutputStream();
        ous.write(bytes);
        ous.flush();
        ous.close();
        }

2.前端采用xmlhttprequest 对象(ajax datatype没有二进制数据选择)

function obtain() {
            let url = "/sendImage";
            let xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);
            xhr.responseType = "blob";
            xhr.onload = function() {
                console.log(this);
                if (this.status == 200) {
                    let blob = this.response;
                    let img = document.createElement("img");
                    img.onload = function(e) {
                        window.URL.revokeObjectURL(img.src);
                    };
                    img.src = window.URL.createObjectURL(blob);
                    document.body.appendChild(img);
                }
            }
            xhr.send();
        }

二、使用文件流
前端采用img标签,src=“action路径”方式
后端代码:(参考验证码的生成)

     @RequestMapping("/sendImage")
    public void sendImage(HttpServletResponse response) throws IOException {
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        response.setHeader("expires", "0");
        /**
         * response。setHeader()具体作用有待研究
         */
     	 try{
            BufferedImage image = ImageIO.read(new File("D:/out.png"));
            ImageIO.write(image,"png",response.getOutputStream());
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

记录二进制流转图片

    /***
     * 将二进制流转换为图片
     * @param data
     * @param path
     */
    public static void byteToImage(byte[] data, String path) {
        if (data.length < 3 || path.equals(""))
            return;
        try {
            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
            imageOutput.write(data, 0, data.length);
            imageOutput.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

参考博客:
response.setHeader用法:https://www.cnblogs.com/mingforyou/p/4259113.html
ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践https://www.cnblogs.com/cdemo/p/5225848.html

如有侵权,联系删除。博客记录学习,传播知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值