我使用以下行获取DataMatrix代码:

BitMatrix bitMatrix = new DataMatrixWriter().encode(dmie.preEncodeBarcode(dataToEncode), BarcodeFormat.DATA_MATRIX, 50, 50, null);

我得到的输入字符串包含“ FNC1”(就像字符串中的普通字符一样)以标记动态字段的结尾,并且该字符串总共具有4个不同的GS1 DataMatrix应用程序标识符及其各自的值。

preEncodeBarcode()的作用是用<GS>替换“ FNC1”,如下所示:

input = input.replaceAll("FNC1", new String(new byte[] {0x1d}));

因为否则我只是简单地将“ FNC1910005FNC1230202 [...]”编码到DataMatrix中,而我想要的当然是<GS>而不是文本“ FNC1”。

但是,当用<GS>替换FNC1时(我也尝试过使用'\ u001c'),我得到了这个非常奇怪的double-DM代码,而不是普通的代码:

java - 编码GS1兼容的DataMatrix代码时如何处理FNC1/&lt;GS&gt;?-LMLPHP

仅当我跳过将“ FNC1”替换为<GS>时,我才能得到一个正确的。

任何想法如何基于包含<GS>的字符串获取正确的DataMatrix代码?还是我直接在字符串中使用<GS>只是在做错什么?在那种情况下,我应该怎么做才能让zxing给我正确的DataMatrix?我一直在阅读,但是我实在无法解决这个问题。

更新:我不确定,但是我可能会遇到一些奇怪的错误。这是我预处理输入字符串(空格为)后将发送给DataMatrixWriter的内容:

[d29100001 21000000049347037 24000163718 390300000002990

我发现比较晦涩的是,如果我(在撰写本文时)发送input.substring(2, input.length());input.substring(0, input.length()-3);,那么它工作得很好,而如果我改为从开头仅删除一个(或更少)字符,或者从开头删除两个或更少字符最后,我得到了这个奇怪的DataMatrix。甚至更奇怪的是,这种行为甚至还不一致-如果我在末尾添加6个随机数,那么效果很好,但是如果我删除了其中三个,那么我又遇到了问题。最糟糕的是,一个小时前我无法发送input.substring(0, input.length()-3),但现在可以了。

换句话说,我很困惑。

(PS。我正在使用找到的代码here将DataMatrix缩放到所需的大小,但是zxing从一开始就给出了错误的输出。)

最佳答案

多亏了Lachezar Dobrev over at the zxing Google group,我才能够按预期工作。事实证明,您可以将EncodeHintType移交给DataMatrixWriter,这将强制其应用正方形。

这对我有用:

        HashMap hintMap = new HashMap();
        hintMap.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);
        BitMatrix bitMatrix = new DataMatrixWriter().encode(input, BarcodeFormat.DATA_MATRIX, 50, 50, hintMap);


几周后更新:事实证明,无论您给它什么输入,zxing都不与GS1兼容,因此整个FNC1 /问题都不是问题。相反,我建议使用Okapi Barcode,它可以完美工作。

我还没有找到任何指南或教程,但是基于Okapi Java GUI如何生成其条形码,我从项目的Make Barcode类中对此感到困惑。

DataMatrix dataMatrix = new DataMatrix();
dataMatrix.setDataType(Symbol.DataType.GS1);
dataMatrix.setReaderInit();
dataMatrix.setPreferredSize(24); //144x144
dataMatrix.forceSquare(true);
dataMatrix.setContent(dataToEncode);
BufferedImage image = new BufferedImage((dataMatrix.getWidth() * magnification) + (2 * borderSize),
                    (dataMatrix.getHeight() * magnification) + (2 * borderSize), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, (dataMatrix.getWidth() * magnification) + (2 * borderSize),
                    (dataMatrix.getHeight() * magnification) + (2 * borderSize));
Java2DRenderer renderer = new Java2DRenderer(g2d, magnification, borderSize, Color.WHITE, Color.BLACK);
renderer.render(dataMatrix);
try {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(image, "png", baos);
    //Before Base64-encoding the image and return as a String
    Base64.Encoder encoder = Base64.getEncoder();
    return encoder.encodeToString(baos.toByteArray());
} catch (IOException e) {
//Do some logging
return "Something went wrong";//Return super-informative error message
}

07-24 16:05