2017-01-25 21 views
1

我有一个项目,它绘制了一个价格标签,里面有一个条形码。要绘制的条形码我使用与设置EAN-13字体的JLabel输入数据,从其中产生的价格标签,由两个条形码的属性:条形码数Java。 BarCode Ean-13到字符串

例如

和编码版本,它被传递到previosly提到的JLabel

h04324 |!PRQXTp该条码号

问题是我没有访问生成编码版本的代码,并且生成它的算法有错误。正因为如此,我想从废品中写出这件事,但无法找到编码算法。

有人可以指点我在哪里可以找到关于编码的说明吗?谢谢。

============================================== =========================

Barcode4J问题。试图创建一个Graphics2D对象并在其上绘制条形码(不能真正使用文件,因为条形码只是价格标签的一部分)。

试图做到这一点使用Java2DCanvasProvider:

EAN13Bean bean = new EAN13Bean(); 

    final int dpi = 150; 

    //Configure the barcode generator 
    bean.setModuleWidth(UnitConv.in2mm(13.3f/dpi)); //makes the narrow bar 
                //width exactly one pixel 
    bean.doQuietZone(true); 

    bean.setHeight(chart.getBarcodeMainHeight()-10); 
    bean.setFontSize(10f); 

    BufferedImage bi = new BufferedImage(chart.getBarcodeMainWidth(), chart.getBarcodeMainHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D graphics = bi.createGraphics(); 

    //graphics.fillRect(0, 0, chart.getBarcodeMainWidth(), chart.getBarcodeMainHeight()); 
    Java2DCanvasProvider canv = new Java2DCanvasProvider(graphics, 0); 

    bean.generateBarcode(canv, priceTag.getBarCodeNumber()); 

    barCodeLabel.setIcon(new ImageIcon(bi)); 

但是我收到一个倒置图像块(我是真正的新的Graphics2D)。

回答

1

Barcode4J对此有回覆。它也可以生成图像,所以你可以放开JLabel和特殊字体。

+0

谢谢,现在就试试看。 –

+0

遇到问题。我尝试在Java2DCanvasProvider画布上绘制条形码(不能使用画布外的文件,因为条形码只是图像的一部分),并且颜色反过来显示。 –

+0

Aaaand,即使解决这个问题,我收到了第一个数字缺失的条形码... –

0

对于那些可能需要这个,最终找到算法(在C中,但重写它在Java中)。

public class BarCodeService { 
    private static final int[][] leftPartMaps = {{48,48,48,48,48},{48,64,48,64,64},{48,64,64,48,64},{48,64,64,64,48},{64,48,48,64,64},{64,64,48,48,64},{64,64,64,48,48},{64,48,64,48,64},{64,48,64,64,48},{64,64,48,64,48}}; 
    private static final int[] rightPartMap = {80,80,80,80,80,112}; 
    private static final int firstDigitArg = 33, secondDigitArg = 96; 
    private static final char delimiter = 124; 


    public String parseInput(String code){ 
     char[] data = new char[13]; 
     char[] givenData = code.toCharArray(); 

     int length = (givenData.length < 12) ? givenData.length : 12; 
     System.arraycopy(givenData, 0, data, 0, length); 

     int checkSumDigit = generateCheckSum(data); 
     data[12] = String.valueOf(checkSumDigit).charAt(0); 

     return String.valueOf(data); 
    } 

    public String generateCode(String code){ 
     char[] data = code.toCharArray(); 
     if(data.length<13){ 
      System.err.println("Bad data input"); 
      return null; 
     } 

     String result = null; 
     try{ 
      result = generateEanString(data); 
     }catch(NumberFormatException e){ 
      System.err.println("Input data had unconvertable characters: "+e.fillInStackTrace()); 
      result = ""; 
     } 
     return result; 
    } 

    protected int generateCheckSum(char[] data){ 
     int result = 0; 
     for(int i = 0; i<12;i++){ 
      int num = Character.getNumericValue(data[i]); 
      num = (i%2 == 0) ? num : num*3; 
      result += num; 
     } 

     result = (result % 10 == 0) ? 0 : ((result/10)+1)*10 - result; 
     return result; 
    } 
    protected String generateEanString(char[] data) throws NumberFormatException{ 
     char[] resultData = new char[14]; 

     resultData[0] = (char) (Character.getNumericValue(data[0]) + firstDigitArg); 
     resultData[1] = (char) (Character.getNumericValue(data[1]) + secondDigitArg); 


    fillLeftPart(data,resultData); 
    resultData[7] = delimiter; 
    fillRightPart(data,resultData); 

    return String.valueOf(resultData); 
} 

protected void fillLeftPart(char[] inputData, char[] resultData){ 
    int[] chars = new int[]{ 
      Character.getNumericValue(inputData[2]), 
      Character.getNumericValue(inputData[3]), 
      Character.getNumericValue(inputData[4]), 
      Character.getNumericValue(inputData[5]), 
      Character.getNumericValue(inputData[6]) 
    }; 

    int pointer = Character.getNumericValue(inputData[0]); 
    for(int i = 0; i<leftPartMaps[pointer].length; i++){ 
     int n = i+2; 
     resultData[n] = (char)(chars[i] + leftPartMaps[pointer][i]); 
    } 

} 

protected void fillRightPart(char[] inputData, char[] resultData){ 
    int[] chars = new int[]{ 
     Character.getNumericValue(inputData[7]), 
     Character.getNumericValue(inputData[8]), 
     Character.getNumericValue(inputData[9]), 
     Character.getNumericValue(inputData[10]), 
     Character.getNumericValue(inputData[11]), 
     Character.getNumericValue(inputData[12]) 
    }; 

    for(int i = 0; i< rightPartMap.length; i++){ 
     int n = i + 8; 
     resultData[n] = (char)(chars[i] + rightPartMap[i]); 
    } 
} 

public static void main(String[] args) { 
    /*System.out.println((char)(Character.getNumericValue('4')+33)); 
    System.out.println((char)((int)('a')+2)); 
    System.out.println((int)'%'); 
    System.out.println("'"+(char)'0'+"'");*/ 
    //if(true)return; 
    // %hB00FB|PUPWVp 4820062050760 
    //"%hB00FB|PUQUUr";"4820062051552"; 
    String testCode = "2205276000000"; 
    BarCodeService serv = new BarCodeService(); 
    String parsedString = serv.parseInput(testCode); 
    System.out.println("Input: "+testCode+ ", parsed string: "+parsedString); 
    String barCodeString = serv.generateCode(parsedString); 
    System.out.println("Result: "+barCodeString); 
} 

}

我的输入是从字符串,并具有错误的校验位,所以焦炭[]结构上的目的使用。