条形码相信大家都不陌生,但自己写程序打印条形码就不是很容易了。最近用条码字体打印了39码,觉的太长,不美观。后来,在国外网站(http://www.c-sharpcorner.com//Code/2004/March/EANBarcode.asp)上找到了EAN13码的源码,修改了其中的一些小Bug,发上来与大家共享。附EAN13码的计算规则: 假设将EAN的内容从右到左的顺序编号:N13、N12、N11、N10、N9、N8、N7、N6、N5、N4、N3、N2、N1,其中N1是准备要求的校验位:1、C1=(N2+N4+N6+N8+N10+N12)*3;2、C2=N3+N5+N7+N9+N11+N13; 3、将C1与C2相加,取其个位数,设为C3;4、校验位N1=10-C3using System;using System.Collections;using System.ComponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;
namespace BarCodeEAN13{ /// <summary> /// Barcode control. /// </summary> public class wctrl_BarCode {
private static string getENA13Code(string Numbers12bit) { int c1 = 0; int c2 = 0;
for (int i=0; i<11; i= i+2) { c1 += int.Parse(Numbers12bit[i].ToString()); c2 += int.Parse(Numbers12bit[i+1].ToString()); }
int c3 = c1 + c2 *3;
c3 = c3 - c3/10 *10;
if (c3 == 0) { return Numbers12bit + 0; } else { int N = 10 - c3;
return Numbers12bit + N; } }
/// <summary> /// Paint EAN13 barcode to specified graphics into specified draw rectangle. /// </summary> /// <param name="barCode">BarCode value.</param> /// <param name="g">Graphics where to draw.</param> /// <param name="drawBounds">Draw bounds.</param> public static void Paint_EAN13(string Numbers12bit,Graphics g,Rectangle drawBounds) { string barCode = getENA13Code(Numbers12bit);
char[] symbols = barCode.ToCharArray();
//--- Validate barCode -------------------------------------------------------------------// if(barCode.Length != 13){ return; } foreach(char c in symbols){ if(!Char.IsDigit(c)){ return; } }
//--- Check barcode checksum ------------------------// int checkSum = Convert.ToInt32(symbols[12].ToString()); int calcSum = 0; bool one_three = true; for(int i=0;i<12;i++){ if(one_three){ calcSum += (Convert.ToInt32(symbols[i].ToString()) * 1); one_three = false; } else{ calcSum += (Convert.ToInt32(symbols[i].ToString()) * 3); one_three = true; } } char[] calcSumChar = calcSum.ToString().ToCharArray(); if(checkSum !=0 && checkSum != (10 - Convert.ToInt32(calcSumChar[calcSumChar.Length - 1].ToString()))){ return; } //--------------------------------------------------// //---------------------------------------------------------------------------------------//
Font font = new Font("Microsoft Sans Serif",8); // Fill backround with white color// g.Clear(Color.White);
int lineWidth = 1; int x = drawBounds.X;
// Paint human readable 1 system symbol code g.DrawString(symbols[0].ToString(),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 16); x += 10;
// Paint left 'guard bars', always same '101' g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth;
// First number of barcode specifies how to encode each character in the left-hand // side of the barcode should be encoded. bool[] leftSideParity = new bool[6]; switch(symbols[0]) { case '0': leftSideParity[0] = true; // Odd leftSideParity[1] = true; // Odd leftSideParity[2] = true; // Odd leftSideParity[3] = true; // Odd leftSideParity[4] = true; // Odd leftSideParity[5] = true; // Odd break; case '1': leftSideParity[0] = true; // Odd leftSideParity[1] = true; // Odd leftSideParity[2] = false; // Even leftSideParity[3] = true; // Odd leftSideParity[4] = false; // Even leftSideParity[5] = false; // Even break; case '2': leftSideParity[0] = true; // Odd leftSideParity[1] = true; // Odd leftSideParity[2] = false; // Even leftSideParity[3] = false; // Even leftSideParity[4] = true; // Odd leftSideParity[5] = false; // Even break; case '3': leftSideParity[0] = true; // Odd leftSideParity[1] = true; // Odd leftSideParity[2] = false; // Even leftSideParity[3] = false; // Even leftSideParity[4] = false; // Even leftSideParity[5] = true; // Odd break; case '4': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = true; // Odd leftSideParity[3] = true; // Odd leftSideParity[4] = false; // Even leftSideParity[5] = false; // Even break; case '5': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = false; // Even leftSideParity[3] = true; // Odd leftSideParity[4] = true; // Odd leftSideParity[5] = false; // Even break; case '6': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = false; // Even leftSideParity[3] = false; // Even leftSideParity[4] = true; // Odd leftSideParity[5] = true; // Odd break; case '7': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = true; // Odd leftSideParity[3] = false; // Even leftSideParity[4] = true; // Odd leftSideParity[5] = false; // Even break; case '8': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = true; // Odd leftSideParity[3] = false; // Even leftSideParity[4] = false; // Even leftSideParity[5] = true; // Odd break; case '9': leftSideParity[0] = true; // Odd leftSideParity[1] = false; // Even leftSideParity[2] = false; // Even leftSideParity[3] = true; // Odd leftSideParity[4] = false; // Even leftSideParity[5] = true; // Odd break; }
// second number system digit + 5 symbol manufacter code string lines = ""; for(int i=0;i<6;i++){ bool oddParity = leftSideParity[i]; if(oddParity){ switch(symbols[i + 1]) { case '0': lines += "0001101"; break; case '1': lines += "0011001"; break; case '2': lines += "0010011"; break; case '3': lines += "0111101"; break; case '4': lines += "0100011"; break; case '5': lines += "0110001"; break; case '6': lines += "0101111"; break; case '7': lines += "0111011"; break; case '8': lines += "0110111"; break; case '9': lines += "0001011"; break; } } // Even parity else{ switch(symbols[i + 1]) { case '0': lines += "0100111"; break; case '1': lines += "0110011"; break; case '2': lines += "0011011"; break; case '3': lines += "0100001"; break; case '4': lines += "0011101"; break; case '5': lines += "0111001"; break; case '6': lines += "0000101"; break; case '7': lines += "0010001"; break; case '8': lines += "0001001"; break; case '9': lines += "0010111"; break; } } }
// Paint human readable left-side 6 symbol code g.DrawString(barCode.Substring(1,6),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 12);
char[] xxx = lines.ToCharArray(); for(int i=0;i<xxx.Length;i++){ if(xxx[i] == '1'){ g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12); } else{ g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12); } x += lineWidth; } // Paint center 'guard bars', always same '01010' g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth;
// 5 symbol product code + 1 symbol parity lines = ""; for(int i=7;i<13;i++){ switch(symbols[i]) { case '0': lines += "1110010"; break; case '1': lines += "1100110"; break; case '2': lines += "1101100"; break; case '3': lines += "1000010"; break; case '4': lines += "1011100"; break; case '5': lines += "1001110"; break; case '6': lines += "1010000"; break; case '7': lines += "1000100"; break; case '8': lines += "1001000"; break; case '9': lines += "1110100"; break; } }
// Paint human readable left-side 6 symbol code g.DrawString(barCode.Substring(7,6),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 12);
xxx = lines.ToCharArray(); for(int i=0;i<xxx.Length;i++){ if(xxx[i] == '1'){ g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12); } else{ g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12); } x += lineWidth; } // Paint right 'guard bars', always same '101' g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); x += lineWidth; g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height); }
}}