C#如何打印条形码EAN13码

    技术2022-05-11  114

    C#如何打印条形码EAN13码

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

     }}

     

    最新回复(0)