在Java Swing中使用Barcode 4j库生成GS1-128条形码

sqxo8psd  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(325)

我有一个字符串,如(01)8638634367382(15)230316(3103)000998(10)45456465604,我想使用java中的barcode4j库将其作为条形码png。

// Create the barcode bean
        Code128Bean barcode = new Code128Bean();

        // Configure the barcode generator
        final int dpi = 400;
        barcode.setModuleWidth(0.2);
        barcode.doQuietZone(false);

        int codeset = Code128Constants.CODESET_C;
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (!Character.isDigit(c)) {
                codeset = Code128Constants.CODESET_B;
                break;
            }
        }
        barcode.setCodeset(codeset);
        // Generate the barcode bitmap
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
        barcode.generateBarcode(canvas, input);
        try {
            canvas.finish();
        } catch (IOException e) {
            throw new RuntimeException("Error generating barcode", e);
        }

        // Encode the bitmap as a base64 string
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            ImageIO.write(canvas.getBufferedImage(), "png", outputStream);
        } catch (IOException e) {
            throw new RuntimeException("Error encoding barcode as PNG", e);
        }
        byte[] barcodeBytes = outputStream.toByteArray();
        String base64Barcode = Base64.getEncoder().encodeToString(barcodeBytes);
        
        return base64Barcode;

但是生成的条形码不能被任何条形码扫描软件识别,我也把图像编码成base64字符串,当我想在程序的任何部分显示时,我解码它并显示图像,你知道这有什么问题吗?
我希望生成此格式的可读条形码(01)8638634367382(15)230316(3103)000998(10)45456465604,当然它必须可以通过任何软件扫描。

jrcvhitl

jrcvhitl1#

您提供的示例是一个用括号表示的GS1应用程序标识符元素字符串。
除非库为您完成,否则您需要将其转换为无括号的表示形式,FNC 1位于第一位,适合直接编码为Code 128。(正是这个过程将GS1-128与普通Code 128区分开来。)
有关GS1数据的各种表示的更多详细信息,请参见this article
GS1提供Barcode Syntax Resource,这是一个本地库,具有Java绑定,可以处理GS1应用程序标识符语法数据。

相关问题