代码之家  ›  专栏  ›  技术社区  ›  Draaksward

Java语言条形码Ean-13至字符串

  •  2
  • Draaksward  · 技术社区  · 8 年前

    我有一个项目,它画了一个价格标签,上面有条形码。要绘制条形码,我使用设置了EAN-13字体的JLabel。生成价格标签的输入数据由两个条形码属性组成:条形码编号

    080432402184 例如

    以及编码版本,它被传递给前面提到的JLabel

    !h04324|PRQXTp 对于该条形码编号

    问题是我无法访问生成编码版本的代码,而生成编码版本代码的算法也有缺陷。正因为如此,我想从废料中写出来,但很难找到编码算法。

    有人能告诉我在哪里可以找到编码说明吗?谢谢

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

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

    尝试使用Java2CanvasProvider执行此操作:

    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真的很陌生)。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Michael Bar-Sinai    8 年前

    Barcode4J 有你的支持。它还可以生成图像,因此您可以放弃JLabel和特殊字体。

        2
  •  2
  •   Draaksward    7 年前

    对于那些可能需要的人,最终找到了算法(用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);
    }
    

    }

    我的输入来自字符串,校验和数字不正确,因此故意使用char[]结构。

    推荐文章