You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Barcode4J生成的条形码转Base64无结果,求排查

问题分析与解决:Barcode4J生成Base64空字符串

你遇到的这个问题其实是个常见的顺序错误——用Barcode4J生成条形码时,本地文件输出正常,但转Base64就空,核心原因是输出流的处理顺序搞反了。

先看你代码里的关键问题:你在调用canvas.finish()之前就尝试读取out.toByteArray(),但BitmapCanvasProvider只有在执行finish()方法后,才会把绘制完成的条形码数据真正写入到绑定的输出流中。这时候你提前取字节数组,自然拿不到任何内容。

修正后的代码

public void testNothing() throws FileNotFoundException, UnsupportedEncodingException {
    Code39Bean bean = new Code39Bean();
    int resolution = 150;
    bean.setModuleWidth(UnitConv.in2mm(1.0f / resolution));
    bean.setWideFactor(3);
    bean.doQuietZone(false);

    // 用try-with-resources自动管理资源,避免手动关闭的繁琐与错误
    try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(
                out, "image/x-png", resolution, BufferedImage.TYPE_BYTE_BINARY, false, 0);
        
        bean.generateBarcode(canvas, "1234");
        // 关键步骤:先完成canvas绘制,确保所有图像数据写入输出流
        canvas.finish();
        
        System.out.println("Generating Base64");
        String imgString = new String(Base64Encoder.encode(out.toByteArray()));
        System.out.println("String Generated :" + imgString);
        
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关键修正点说明

  • 调整canvas.finish()的执行顺序:必须在读取输出流字节数组前调用这个方法,它会触发Canvas把绘制好的条形码数据flush到绑定的ByteArrayOutputStream中。
  • 使用try-with-resources简化资源管理:Java 7+的特性可以自动关闭实现AutoCloseable的资源,避免手动关闭时可能出现的遗漏或顺序错误,代码更简洁可靠。
  • 移除冗余的手动close调用:原来代码中多次重复关闭out的逻辑可以完全被try-with-resources替代,减少出错概率。

这样修改后,你就能得到正常的Base64编码字符串了。

内容的提问来源于stack exchange,提问作者Aniket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:15