EAN 13 – Генериране на баркод чрез флаш
От: 10 ноември, 2009 | Къде: DevNull | Тагове: as3, barcode, ean 13, flash | няма коментари »След упорито търсене на безплатен читав фонт за EAN 13 (по-късно разбрах защо няма такъв фонт… просто има доста калкулации за да се генерира) реших, че ще да е по-лесно да си драсна същия на флаш.
Трябваше ми за принтиране на етикети през уеб сайт, а с флаш това става доста културно.
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;
Ето и кода, може да с оптимизира, но ме мързи да се занимавам повече
{
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));
}
}
}
П.П. Има вероятност при големи размери на баркода, цифрите да не стоят много добре, но ще си ги фикснете сами
Bate Raiko написа:

Коментирай