C#如何打印条形码EAN13码
2010-02-25 09:48
288 查看
条形码相信大家都不陌生,但自己写程序打印条形码就不是很容易了。最近用条码字体打印了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);
}
}
}
附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);
}
}
}
相关文章推荐
- C#如何打印条形码EAN13码
- C#如何打印条形码EAN13码
- C#如何打印条形码EAN13码
- C#如何打印条形码EAN13码
- C#如何打印条形码EAN13码
- .Net中的打印A4纸如何实现(以C#为例)——VB中的Printer.Print在.Net中如何实现
- C#打印时如何隐藏打印窗口
- c#如何打印picturebox里的图片,winform怎样打印picturebox里的图片
- 如何采用C#绘制39条形码
- c#打印条形码
- C#利用zxing.net生成二维码和条形码并实现打印的功能
- 如何使用WebBrowser控件打印格式化的XML文档,并以编程方式任意设置打印方向(C#完整示例)
- C# winform 条形码打印
- 【水晶报表】中如何打印条形码?
- 【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript
- C#利用Zxing.net生成条形码和二维码并实现打印的功能
- c#中如何用codesoft来打印标签开发分享
- C#如何实现Windows自带打印功能
- C#如何打印条形码EAN13码
- C# 如何在PDF文档中添加打印按钮