2011-04-16 27 views
4

有很多组件创建/解析条形码图像,但我无法找到一个解析EAN 128条形码字符串的库,并给我一个简单的java-pojo对象,从中我可以得到EAN128如果它们包含在条形码中,则为组。解码EAN 128

示例伪代码:

EAN128Pojo pojo = EAN128Pojo.parse(some string got from scanner); 
Date dueDate = pojo.getDueDate(); 

Object dueDate = pojo.get(12 /*application identifier for due date*/); 

是否有这个能力的任何图书馆吗?

干杯

回答

3

我不知道有什么,而且也不谷歌于codesearch:http://www.google.com/codesearch?q=getAdditionalProductIdentification

反正自己写也并不难。这一次我花了不到一个小时:

package so5685964; 

import java.util.Map; 

import org.joda.time.DateMidnight; 

import com.google.common.collect.Maps; 

public class GS1Code128Data { 

    /** Maps the AI to the corresponding data from the barcode. */ 
    private final Map<String, String> data = Maps.newHashMap(); 

    private static final Map<String, AII> aiinfo = Maps.newHashMap(); 

    static class AII { 
    final int minLength; 
    final int maxLength; 

    public AII(String id, int minLength, int maxLength) { 
     this.minLength = minLength; 
     this.maxLength = maxLength; 
    } 
    } 

    private static void ai(String id, int minLength, int maxLength) { 
    aiinfo.put(id, new AII(id, minLength, maxLength)); 
    } 

    private static void ai(String id, int length) { 
    aiinfo.put(id, new AII(id, length, length)); 
    } 

    static { 
    ai("00", 18, 18); 
    ai("01", 14); 
    ai("02", 14); 
    ai("10", 1, 20); 
    ai("11", 6); 
    ai("12", 6); 
    // TODO: continue according to http://en.wikipedia.org/wiki/GS1-128 
    } 

    /** 
    * Decodes a Unicode string from a Code128-like encoding. 
    * 
    * @param fnc1 The character that represents FNC1. 
    */ 
    public GS1Code128Data(String s, char fnc1) { 
    StringBuilder ai = new StringBuilder(); 
    int index = 0; 
    while (index < s.length()) { 
     ai.append(s.charAt(index++)); 
     AII info = aiinfo.get(ai.toString()); 
     if (info != null) { 
     StringBuilder value = new StringBuilder(); 
     for (int i = 0; i < info.maxLength && index < s.length(); i++) { 
      char c = s.charAt(index++); 
      if (c == fnc1) { 
      break; 
      } 
      value.append(c); 
     } 
     if (value.length() < info.minLength) { 
      throw new IllegalArgumentException("Short field for AI \"" + ai + "\": \"" + value + "\"."); 
     } 
     data.put(ai.toString(), value.toString()); 
     ai.setLength(0); 
     } 
    } 
    if (ai.length() > 0) { 
     throw new IllegalArgumentException("Unknown AI \"" + ai + "\"."); 
    } 
    } 

    private static DateMidnight asDate(String s) { 
    if (s == null) { 
     return null; 
    } 
    String century = s.compareTo("500000") < 0 ? "20" : "19"; 
    return new DateMidnight(century + s); 
    } 

    public DateMidnight getDueDate() { 
    return asDate(data.get("12")); 
    } 
} 

还有一些演示代码:

package so5685964; 

public class BarcodeDemo { 

    public static void main(String[] args) { 
    String barcode = "12110416"; 

    GS1Code128Data data = new GS1Code128Data(barcode, '\f'); 

    System.out.println(data.getDueDate()); 
    } 
} 

当你认为你的输入已经是一个String,注意编码问题。 FNC1代码没有相应的Unicode代码点,所以它必须以其他方式进行编码。

+0

@ roland-illig 非常感谢,这对我很有帮助,但是由于知道并非所有条形码扫描仪都提供FNC1字符,我们在这里需要一些更复杂的算法。由barcode4j提供的模板(http://barcode4j.cvs.sourceforge.net/viewvc/barcode4j/barcode4j/src/java/org/krysalis/barcode4j/impl/code128/EAN128AIs.properties?revision=1.1&view=markup)将提供是一个很好的起点。但是因为我相信应该有这样一个图书馆,所以我不必重新发明轮子,我想在这里问。 显然没有这样的库。 – archangle 2011-04-16 20:12:11