2017-01-25 19 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); 
} 

}

我的輸入是從字符串,並具有錯誤的校驗位,所以焦炭[]結構上的目的使用。