您的位置:首页 > 编程语言 > C#

C#如何打印条形码EAN13码

2015-07-08 16:16 579 查看

条形码相信大家都不陌生,但自己写程序打印条形码就不是很容易了。最近用条码字体打印了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-C3

using 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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: