在 Java Swing 中使用 Barcode4j 库生成 GS1-128 条码

问题描述 投票:0回答:2

我有一个像 (01)8638634367382(15)230316(3103)000998(10)45456465604 这样的字符串,我想在 java 中使用 barcode4j lib 将它作为条码 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 当然它必须可以被任何软件扫描。

java barcode barcode4j gs1-ai-syntax
2个回答
1
投票

您提供的示例是括号中的 GS1 应用标识符元素字符串。

除非库为您完成,否则您需要将其转换为 FNC1 在第一个位置的无括号表示,适合直接编码为 Code 128。(正是这个过程将 GS1-128 与普通 Code 128 区分开来。)

您提供的括号中的 AI 元素字符串 —(01)8638634367382(15)230316(3103)000998(10)45456465604 — 未正确解码:

GTIN                   (01) 8638634367382    <-- Invalid. Too short.
BEST BEFORE or BEST BY (15) 230316
NET WEIGHT (kg)        (3103) 000998
BATCH/LOT              (10) 45456465604

将 GTIN 替换为有效的 - (01)0101234567890128 - 将允许您以第一种语法对 FNC1 中的数据进行编码,如下所示:

{FNC1}01012345678901281523031631030009981045456465604

根据 barcode4j 文档他们的软件特有的用于编码

{FNC1}
字符的转义序列是文字 0xF1 ASCII 值:

可以使用功能 1 到 4。它们在消息中被编码为 ASCII 字符 0xF1(241)、0xF2(242)、0xF3(243)和 0xF4(244)。

本文中提供了有关 GS1 数据的各种表示的更多详细信息。

GS1 提供条码语法资源,这是一个本地库,具有 Java 绑定,可以处理 GS1 应用程序标识符语法数据。


0
投票

我最后遇到了同样的问题,在某些方面似乎不是很清楚……经过长时间的分析,我发现除了你之前所说的,如果你想要一个有效的 gs1 代码 128,你必须添加一些控制字符. 例如,在字符串数据的末尾,您必须添加一个控制字符,最后添加一个停止字符。所有这些都由 char ascii 数字打印。顺便说一下,我没有在 Java 中找到一个例程或函数来传递一个字符串(带有 ais 和数据)返回一个已经解析过的字符串,所以我不得不自己做一个(我“复制”了一个用 vb 编码的,所以它是容易)。

© www.soinside.com 2019 - 2024. All rights reserved.