Bate Raiko написа:
Единственото по-хубаво нещо от един клян са...два кляна!

EAN 13 – Генериране на баркод чрез флаш

От: 10 ноември, 2009 | Къде: DevNull | Тагове: , , , | няма коментари »

    След упорито търсене на безплатен читав фонт за EAN 13 (по-късно разбрах защо няма такъв фонт… просто има доста калкулации за да се генерира) реших, че ще да е по-лесно да си драсна същия на флаш.

    Трябваше ми за принтиране на етикети през уеб сайт, а с флаш това става доста културно.

    import bsbm.barcode.Ean13; // use proper path for import

    var font:Font           = new BarcodeFont(); // Embedded font for the digits, may use a font name instead
    var Barcode             = new Ean13(’009018842562′, 31, font);

    addChild(Barcode);
    Barcode.x = 85;
    Barcode.y = 9;

    Ето и кода, може да с оптимизира, но ме мързи да се занимавам повече :)

    package bsbm.barcode
    {
            import flash.display.MovieClip;
            import flash.display.Sprite;
            import flash.text.TextField;
            import flash.text.AntiAliasType;
            import flash.text.TextFieldAutoSize;
            import flash.text.TextFormat;
           
            public class Ean13 extends MovieClip
            {              
                    public function Ean13(iNum, iHeight, font)
                    {
                            if(iNum.length != 12){
                                    throw new Error(‘Barcode number should be 12 digits!’)
                            }
                           
                            var iBarWidth = (iHeight/0.45)/95; // might not be exact but its close :)
                           
                                            //     0          1         2         3        4          5         6         7         8         9  -  country code matrix
                            var fdeg = [‘aaaaaa’, ‘aababb’, ‘aabbab’, ‘aabbba’, ‘abaabb’, ‘abbaab’, ‘abbbaa’, ‘ababab’, ‘ababba’, ‘abbaba’];
                           
                            var sets = {
                                    //      0          1          2          3          4          5          6          7          8          9  -  digit matrix
                                    a: [’0001101′, ’0011001′, ’0010011′, ’0111101′, ’0100011′, ’0110001′ ,’0101111′ ,’0111011′ ,’0110111′ ,’0001011′],
                                    b: [’0100111′, ’0110011′, ’0011011′, ’0100001′, ’0011101′, ’0111001′ ,’0000101′ ,’0010001′ ,’0001001′ ,’0010111′],
                                    c: [’1110010′, ’1100110′, ’1101100′, ’1000010′, ’1011100′, ’1001110′ ,’1010000′ ,’1000100′ ,’1001000′ ,’1110100′]
                            };
                           
                            iNum     = (iNum)+(this.checkDigit(iNum).toString());
                           
                            var bn   = 0;
                            var chrs = iNum.split();
                            var ctry = iNum.substring(0,1);
                            var set1 = iNum.substring(1,7).split();
                            var set2 = iNum.substring(7).split();
                            var mtrx = new Array();
                           
                            mtrx.push(’101′); // left guardian

                            for(var i=0; i<set1.length; i++)
                            {
                                    var cnum = parseInt(set1[i]);
                                    var fset = fdeg[ctry].split()[i];
                                   
                                    mtrx.push(sets[fset][cnum]);
                            }
                           
                            mtrx.push(’01010′);// center guardian
                           
                            for(var n=0; n<set2.length; n++){
                                    mtrx.push(sets.c[parseInt(set2[n])]);
                            }
                           
                            mtrx.push(’101′);// right guardian
                                                   
                            for(var m=0; m<mtrx.length; m++)
                            {
                                    var lines       = mtrx[m].split();
                                    var bar         = new MovieClip();
                                   
                                    this.addChild(bar);
                                   
                                    bar.name        = ‘bar_’+m;
                                    bar.graphics.drawRect(0, 0, (mtrx[m].length*iBarWidth).toFixed(2), iHeight);
                                    bar.graphics.endFill();
                                   
                                    var pbar        = this.getChildByName(‘bar_’+(m-1));
                                    bar.x           = (pbar ? (pbar.x+pbar.width).toFixed(2) : 10);
                                    bar.y           = 0;
                                   
                                    for(var l=0; l<lines.length; l++)
                                    {                                      
                                            var blk = new Sprite();
                                            this.addChild(blk);
                                           
                                            var clr = (parseInt(lines[l]) == 0 ? 0xFFFFFF : 0×000000);
                                            var ibh = iHeight;
                                           
                                            if(m == 0 || m == 7 || m == mtrx.length-1){
                                                    ibh = iHeight + (iHeight*0.15); //15% higher
                                            }
                                           
                                            blk.name        = ‘block_’+bn;
                                           
                                            blk.graphics.beginFill(clr);
                                            blk.graphics.drawRect(0, 0, iBarWidth, ibh);
                                            blk.graphics.endFill();
                                           
                                            var nxtp        = 10;
                                            var pblk        = this.getChildByName(‘block_’+(bn-1));
                                           
                                            if(pblk){
                                                    nxtp = (pblk.x+pblk.width);
                                            }

                                            blk.x           = nxtp;
                                            blk.y           = 0;
                                            bn++;
                                    }              
                            }
                           
                            // draw numbers
                            for(var d=0; d<chrs.length; d++)
                            {
                                    var tf:TextField                = new TextField();
                                    var ft:TextFormat               = new TextFormat();

                                    ft.font                                 = (typeof(font) == ‘string’ ? font : font.fontName);
                                    ft.color                                = 0×000000;
                                    ft.size                                 = Math.round(iHeight/5); // change this to match your size it doesn’t
                                   
                                    tf.defaultTextFormat    = ft;
                                    tf.embedFonts                   = (typeof(font) == ‘string’ ? false : true);
                                    tf.text                                 = chrs[d];
                                    tf.antiAliasType                = AntiAliasType.ADVANCED;
                                    tf.autoSize                             = TextFieldAutoSize.LEFT;
                                    tf.name                                 = ‘tx_’+d;
                                   
                                    var sx = 0;
                                   
                                    var pt = this.getChildByName(‘tx_’+(d-1));
                                   
                                    if(d == 1){
                                            sx = this.getChildByName(‘bar_0′).x + this.getChildByName(‘bar_0′).width;
                                    }
                                    else if(d == 7){ // center guardian
                                            sx = this.getChildByName(‘bar_7′).x + this.getChildByName(‘bar_7′).width;
                                    }
                                    else {
                                            sx = (pt ? pt.x + Math.round(iBarWidth*7) : 0);
                                    }

                                    tf.x = sx;
                                    tf.y = iHeight-0.5;

                                    this.addChild(tf);
                            }
                    }
                   
                    private function checkDigit(number):int
                    {
                            var digits      = number.toString().split();
                            var odds        = 0;
                            var even        = 0;
                           
                            for(var i=digits.length-1; i>=0; i–)
                            {
                                    if(i%2){
                                            odds += parseInt(digits[i])*3;
                                    }
                                    else {
                                            even += parseInt(digits[i]);
                                    }
                            }
                           
                            return 10 – parseInt((odds+even).toString().substring(1));
                    }
            }
    }

    П.П. Има вероятност при големи размери на баркода, цифрите да не стоят много добре, но ще си ги фикснете сами :)



    Коментирай