关闭

C#如何打印条形码EAN13码

130人阅读 评论(0) 收藏 举报
分类:


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

 }
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5778次
    • 积分:93
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:23篇
    • 译文:0篇
    • 评论:0条
    文章分类