Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理FNC1/<;GS>;编码GS1兼容的DataMatrix代码时?_Java_Zxing_Encode_Datamatrix - Fatal编程技术网

Java 如何处理FNC1/<;GS>;编码GS1兼容的DataMatrix代码时?

Java 如何处理FNC1/<;GS>;编码GS1兼容的DataMatrix代码时?,java,zxing,encode,datamatrix,Java,Zxing,Encode,Datamatrix,我使用以下行获取DataMatrix代码: BitMatrix BitMatrix=new DataMatrixWriter().encode(dmie.preEncodeBarcode(dataToEncode),BarcodeFormat.DATA_MATRIX,50,50,null) 我得到的输入字符串包含“FNC1”(与字符串中的普通字符一样),用于标记动态字段的结尾,该字符串总共有4个不同的GS1 DataMatrix应用程序标识符及其各自的值 preEncodeBarcode()的作

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

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

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

preEncodeBarcode()的作用是将“FNC1”替换为
,如下所示:

input=input.replaceAll(“FNC1”,新字符串(新字节[]{0x1d}))

否则,我只需要在DataMatrix中编码“FNC191005FNC1230202[…]”,而我想要的当然是
,而不是文本“FNC1”

然而,当用
替换FNC1时(我也尝试过使用“\u001c”),我得到了这个非常奇怪的双DM代码,而不是一个正常的代码:

只有当我跳过将“FNC1”替换为
时,我才能得到一个合适的

你知道如何根据我的
-包含字符串来获得正确的DataMatrix代码吗?或者我只是在字符串中直接插入
而做错了什么?在这种情况下,我应该怎么做才能让zxing给我一个正确的数据矩阵?我读了很多书,但我真的无法理解这一点

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

[d29100001 210000049347037 24000163718 390300000002990

我觉得相当模糊的是,如果我(在写这篇文章时)发送
input.substring(2,input.length());
input.substring(0,input.length()-3);
那么它工作得很好,而如果我只删除一个(或更少)从开始的字符或从结尾的2个或更少的字符,然后我得到了这个奇怪的数据矩阵。更奇怪的是,这种行为甚至不一致-如果我在末尾加上6个随机数,那么效果很好,但如果我删除其中的3个数,那么我再次遇到问题。最糟糕的是,一小时前我无法发送在
input.substring(0,input.length()-3)
中,但现在我可以了

换句话说,我完全困惑了

(顺便说一句,我正在使用找到的代码将DataMatrix缩放到我想要的大小,但是zxing从一开始就给出了错误的输出。)

多亏了我能够按预期工作。事实证明,您可以将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 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
}
多亏了我,我才能够按预期工作。事实证明,你可以将一个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 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
}