【问题标题】:Java. BarCode Ean-13 to String爪哇。条码 Ean-13 转字符串
【发布时间】:2017-06-10 19:08:20
【问题描述】:

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

080432402184例如

以及编码后的版本,传递给前面提到的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 的新手)。

【问题讨论】:

    标签: java barcode ean-13


    【解决方案1】:

    Barcode4J 对此表示支持。它还可以生成图像,所以你可以放开JLabel和特殊字体。

    【讨论】:

    • 谢谢,马上试试。
    • 遇到问题了。我尝试在 Java2DCanvasProvider 画布上绘制条形码(不能使用文件输出画布,因为条形码只是图像的一部分)并且颜色变成了反转。
    • Aaaand,即使解决了这个问题,我也收到了一个缺少第一个 num 的条形码...
    • 可能是掩码问题...也许用代码打开一个新问题?
    • 我会说这个库的问题多于优点(图像,即 Java2DCanvas 上的画家变成了反色)。我会尝试向你提出一个新问题。
    【解决方案2】:

    对于那些可能需要这个的人,终于找到了算法(用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[] 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多