C#生成code128条形码

最近在做物流条形码的打印,下面分享一下用C#打印code128条码,以备后用。

?
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
namespace Code
{
class BarCode
{
public class Code128
{
private DataTable m_Code128 = new DataTable();
private uint m_Height = 40;
///
/// 高度
///
public uint Height { get { return m_Height; } set { m_Height = value; } }
private Font m_ValueFont = null ;
///
/// 是否显示可见号码 如果为NULL不显示号码
///
public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }
private byte m_Magnify = 0;
///
/// 放大倍数
///
public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
///
/// 条码类别
///
public enum Encode
{
Code128A,
Code128B,
Code128C,
EAN128
}
public Code128()
{
m_Code128.Columns.Add( "ID" );
m_Code128.Columns.Add( "Code128A" );
m_Code128.Columns.Add( "Code128B" );
m_Code128.Columns.Add( "Code128C" );
m_Code128.Columns.Add( "BandCode" );
m_Code128.CaseSensitive = true ;
#region 数据表
m_Code128.Rows.Add( "0" , " " , " " , "00" , "212222" );
m_Code128.Rows.Add( "1" , "!" , "!" , "01" , "222122" );
m_Code128.Rows.Add( "2" , "\"" , "\"" , "02" , "222221" );
m_Code128.Rows.Add( "3" , "#" , "#" , "03" , "121223" );
m_Code128.Rows.Add( "4" , "$" , "$" , "04" , "121322" );
m_Code128.Rows.Add( "5" , "%" , "%" , "05" , "131222" );
m_Code128.Rows.Add( "6" , "&" , "&" , "06" , "122213" );
m_Code128.Rows.Add( "7" , "'" , "'" , "07" , "122312" );
m_Code128.Rows.Add( "8" , "(" , "(" , "08" , "132212" );
m_Code128.Rows.Add( "9" , ")" , ")" , "09" , "221213" );
m_Code128.Rows.Add( "10" , "*" , "*" , "10" , "221312" );
m_Code128.Rows.Add( "11" , "+" , "+" , "11" , "231212" );
m_Code128.Rows.Add( "12" , "," , "," , "12" , "112232" );
m_Code128.Rows.Add( "13" , "-" , "-" , "13" , "122132" );
m_Code128.Rows.Add( "14" , "." , "." , "14" , "122231" );
m_Code128.Rows.Add( "15" , "/" , "/" , "15" , "113222" );
m_Code128.Rows.Add( "16" , "0" , "0" , "16" , "123122" );
m_Code128.Rows.Add( "17" , "1" , "1" , "17" , "123221" );
m_Code128.Rows.Add( "18" , "2" , "2" , "18" , "223211" );
m_Code128.Rows.Add( "19" , "3" , "3" , "19" , "221132" );
m_Code128.Rows.Add( "20" , "4" , "4" , "20" , "221231" );
m_Code128.Rows.Add( "21" , "5" , "5" , "21" , "213212" );
m_Code128.Rows.Add( "22" , "6" , "6" , "22" , "223112" );
m_Code128.Rows.Add( "23" , "7" , "7" , "23" , "312131" );
m_Code128.Rows.Add( "24" , "8" , "8" , "24" , "311222" );
m_Code128.Rows.Add( "25" , "9" , "9" , "25" , "321122" );
m_Code128.Rows.Add( "26" , ":" , ":" , "26" , "321221" );
m_Code128.Rows.Add( "27" , ";" , ";" , "27" , "312212" );
m_Code128.Rows.Add( "28" , "<" , "<" , "28" , "322112" );
m_Code128.Rows.Add( "29" , "=" , "=" , "29" , "322211" );
m_Code128.Rows.Add( "30" , ">" , ">" , "30" , "212123" );
m_Code128.Rows.Add( "31" , "?" , "?" , "31" , "212321" );
m_Code128.Rows.Add( "32" , "@" , "@" , "32" , "232121" );
m_Code128.Rows.Add( "33" , "A" , "A" , "33" , "111323" );
m_Code128.Rows.Add( "34" , "B" , "B" , "34" , "131123" );
m_Code128.Rows.Add( "35" , "C" , "C" , "35" , "131321" );
m_Code128.Rows.Add( "36" , "D" , "D" , "36" , "112313" );
m_Code128.Rows.Add( "37" , "E" , "E" , "37" , "132113" );
m_Code128.Rows.Add( "38" , "F" , "F" , "38" , "132311" );
m_Code128.Rows.Add( "39" , "G" , "G" , "39" , "211313" );
m_Code128.Rows.Add( "40" , "H" , "H" , "40" , "231113" );
m_Code128.Rows.Add( "41" , "I" , "I" , "41" , "231311" );
m_Code128.Rows.Add( "42" , "J" , "J" , "42" , "112133" );
m_Code128.Rows.Add( "43" , "K" , "K" , "43" , "112331" );
m_Code128.Rows.Add( "44" , "L" , "L" , "44" , "132131" );
m_Code128.Rows.Add( "45" , "M" , "M" , "45" , "113123" );
m_Code128.Rows.Add( "46" , "N" , "N" , "46" , "113321" );
m_Code128.Rows.Add( "47" , "O" , "O" , "47" , "133121" );
m_Code128.Rows.Add( "48" , "P" , "P" , "48" , "313121" );
m_Code128.Rows.Add( "49" , "Q" , "Q" , "49" , "211331" );
m_Code128.Rows.Add( "50" , "R" , "R" , "50" , "231131" );
m_Code128.Rows.Add( "51" , "S" , "S" , "51" , "213113" );
m_Code128.Rows.Add( "52" , "T" , "T" , "52" , "213311" );
m_Code128.Rows.Add( "53" , "U" , "U" , "53" , "213131" );
m_Code128.Rows.Add( "54" , "V" , "V" , "54" , "311123" );
m_Code128.Rows.Add( "55" , "W" , "W" , "55" , "311321" );
m_Code128.Rows.Add( "56" , "X" , "X" , "56" , "331121" );
m_Code128.Rows.Add( "57" , "Y" , "Y" , "57" , "312113" );
m_Code128.Rows.Add( "58" , "Z" , "Z" , "58" , "312311" );
m_Code128.Rows.Add( "59" , "[" , "[" , "59" , "332111" );
m_Code128.Rows.Add( "60" , "\\" , "\\" , "60" , "314111" );
m_Code128.Rows.Add( "61" , "]" , "]" , "61" , "221411" );
m_Code128.Rows.Add( "62" , "^" , "^" , "62" , "431111" );
m_Code128.Rows.Add( "63" , "_" , "_" , "63" , "111224" );
m_Code128.Rows.Add( "64" , "NUL" , "`" , "64" , "111422" );
m_Code128.Rows.Add( "65" , "SOH" , "a" , "65" , "121124" );
m_Code128.Rows.Add( "66" , "STX" , "b" , "66" , "121421" );
m_Code128.Rows.Add( "67" , "ETX" , "c" , "67" , "141122" );
m_Code128.Rows.Add( "68" , "EOT" , "d" , "68" , "141221" );
m_Code128.Rows.Add( "69" , "ENQ" , "e" , "69" , "112214" );
m_Code128.Rows.Add( "70" , "ACK" , "f" , "70" , "112412" );
m_Code128.Rows.Add( "71" , "BEL" , "g" , "71" , "122114" );
m_Code128.Rows.Add( "72" , "BS" , "h" , "72" , "122411" );
m_Code128.Rows.Add( "73" , "HT" , "i" , "73" , "142112" );
m_Code128.Rows.Add( "74" , "LF" , "j" , "74" , "142211" );
m_Code128.Rows.Add( "75" , "VT" , "k" , "75" , "241211" );
m_Code128.Rows.Add( "76" , "FF" , "I" , "76" , "221114" );
m_Code128.Rows.Add( "77" , "CR" , "m" , "77" , "413111" );
m_Code128.Rows.Add( "78" , "SO" , "n" , "78" , "241112" );
m_Code128.Rows.Add( "79" , "SI" , "o" , "79" , "134111" );
m_Code128.Rows.Add( "80" , "DLE" , "p" , "80" , "111242" );
m_Code128.Rows.Add( "81" , "DC1" , "q" , "81" , "121142" );
m_Code128.Rows.Add( "82" , "DC2" , "r" , "82" , "121241" );
m_Code128.Rows.Add( "83" , "DC3" , "s" , "83" , "114212" );
m_Code128.Rows.Add( "84" , "DC4" , "t" , "84" , "124112" );
m_Code128.Rows.Add( "85" , "NAK" , "u" , "85" , "124211" );
m_Code128.Rows.Add( "86" , "SYN" , "v" , "86" , "411212" );
m_Code128.Rows.Add( "87" , "ETB" , "w" , "87" , "421112" );
m_Code128.Rows.Add( "88" , "CAN" , "x" , "88" , "421211" );
m_Code128.Rows.Add( "89" , "EM" , "y" , "89" , "212141" );
m_Code128.Rows.Add( "90" , "SUB" , "z" , "90" , "214121" );
m_Code128.Rows.Add( "91" , "ESC" , "{" , "91" , "412121" );
m_Code128.Rows.Add( "92" , "FS" , "|" , "92" , "111143" );
m_Code128.Rows.Add( "93" , "GS" , "}" , "93" , "111341" );
m_Code128.Rows.Add( "94" , "RS" , "~" , "94" , "131141" );
m_Code128.Rows.Add( "95" , "US" , "DEL" , "95" , "114113" );
m_Code128.Rows.Add( "96" , "FNC3" , "FNC3" , "96" , "114311" );
m_Code128.Rows.Add( "97" , "FNC2" , "FNC2" , "97" , "411113" );
m_Code128.Rows.Add( "98" , "SHIFT" , "SHIFT" , "98" , "411311" );
m_Code128.Rows.Add( "99" , "CODEC" , "CODEC" , "99" , "113141" );
m_Code128.Rows.Add( "100" , "CODEB" , "FNC4" , "CODEB" , "114131" );
m_Code128.Rows.Add( "101" , "FNC4" , "CODEA" , "CODEA" , "311141" );
m_Code128.Rows.Add( "102" , "FNC1" , "FNC1" , "FNC1" , "411131" );
m_Code128.Rows.Add( "103" , "StartA" , "StartA" , "StartA" , "211412" );
m_Code128.Rows.Add( "104" , "StartB" , "StartB" , "StartB" , "211214" );
m_Code128.Rows.Add( "105" , "StartC" , "StartC" , "StartC" , "211232" );
m_Code128.Rows.Add( "106" , "Stop" , "Stop" , "Stop" , "2331112" );
#endregion
}
///
/// 获取128图形
///
/// 文字
/// 编码
/// 图形
public Bitmap GetCodeImage( string p_Text, Encode p_Code)
{
string _ViewText = p_Text;
string _Text = "" ;
IList< int > _TextNumb = new List< int >();
int _Examine = 0; //首位
switch (p_Code)
{
case Encode.Code128C:
_Examine = 105;
if (!((p_Text.Length & 1) == 0)) throw new Exception( "128C长度必须是偶数" );
while (p_Text.Length != 0)
{
int _Temp = 0;
try
{
int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
}
catch
{
throw new Exception( "128C必须是数字!" );
}
_Text += GetValue(p_Code, p_Text.Substring(0, 2), ref _Temp);
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(0, 2);
}
break ;
case Encode.EAN128:
_Examine = 105;
if (!((p_Text.Length & 1) == 0)) throw new Exception( "EAN128长度必须是偶数" );
_TextNumb.Add(102);
_Text += "411131" ;
while (p_Text.Length != 0)
{
int _Temp = 0;
try
{
int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
}
catch
{
throw new Exception( "128C必须是数字!" );
}
_Text += GetValue(Encode.Code128C, p_Text.Substring(0, 2), ref _Temp);
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(0, 2);
}
break ;
default :
if (p_Code == Encode.Code128A)
{
_Examine = 103;
}
else
{
_Examine = 104;
}
while (p_Text.Length != 0)
{
int _Temp = 0;
string _ValueCode = GetValue(p_Code, p_Text.Substring(0, 1), ref _Temp);
if (_ValueCode.Length == 0) throw new Exception( "无效的字符集!" + p_Text.Substring(0, 1).ToString());
_Text += _ValueCode;
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(0, 1);
}
break ;
}
if (_TextNumb.Count == 0) throw new Exception( "错误的编码,无数据" );
_Text = _Text.Insert(0, GetValue(_Examine)); //获取开始位
for ( int i = 0; i != _TextNumb.Count; i++)
{
_Examine += _TextNumb[i] * (i + 1);
}
_Examine = _Examine % 103; //获得严效位
_Text += GetValue(_Examine); //获取严效位
_Text += "2331112" ; //结束位
Bitmap _CodeImage = GetImage(_Text);
GetViewText(_CodeImage, _ViewText);
return _CodeImage;
}
///
/// 获取目标对应的数据
///
/// 编码
/// 数值 A b 30
/// 返回编号
/// 编码
private string GetValue(Encode p_Code, string p_Value, ref int p_SetID)
{
if (m_Code128 == null ) return "" ;
DataRow[] _Row = m_Code128.Select(p_Code.ToString() + "='" + p_Value + "'" );
if (_Row.Length != 1) throw new Exception( "错误的编码" + p_Value.ToString());
p_SetID = Int32.Parse(_Row[0][ "ID" ].ToString());
return _Row[0][ "BandCode" ].ToString();
}
///
/// 根据编号获得条纹
///
///
///
private string GetValue( int p_CodeId)
{
DataRow[] _Row = m_Code128.Select( "ID='" + p_CodeId.ToString() + "'" );
if (_Row.Length != 1) throw new Exception( "验效位的编码错误" + p_CodeId.ToString());
return _Row[0][ "BandCode" ].ToString();
}
///
/// 获得条码图形
///
/// 文字
/// 图形
private Bitmap GetImage( string p_Text)
{
char [] _Value = p_Text.ToCharArray();
int _Width = 0;
for ( int i = 0; i != _Value.Length; i++)
{
_Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);
}
Bitmap _CodeImage = new Bitmap(_Width, ( int )m_Height);
Graphics _Garphics = Graphics.FromImage(_CodeImage);
//Pen _Pen;
int _LenEx = 0;
for ( int i = 0; i != _Value.Length; i++)
{
int _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1); //获取宽和放大系数
if (!((i & 1) == 0))
{
//_Pen = new Pen(Brushes.White, _ValueNumb);
_Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _ValueNumb, ( int )m_Height));
}
else
{
//_Pen = new Pen(Brushes.Black, _ValueNumb);
_Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _ValueNumb, ( int )m_Height));
}
//_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));
_LenEx += _ValueNumb;
}
_Garphics.Dispose();
return _CodeImage;
}
///
/// 显示可见条码文字 如果小于40 不显示文字
///
/// 图形
private void GetViewText(Bitmap p_Bitmap, string p_ViewText)
{
if (m_ValueFont == null ) return ;
Graphics _Graphics = Graphics.FromImage(p_Bitmap);
SizeF _DrawSize = _Graphics.MeasureString(p_ViewText, m_ValueFont);
if (_DrawSize.Height > p_Bitmap.Height - 10 || _DrawSize.Width > p_Bitmap.Width)
{
_Graphics.Dispose();
return ;
}
int _StarY = p_Bitmap.Height - ( int )_DrawSize.Height;
_Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarY, p_Bitmap.Width, ( int )_DrawSize.Height));
_Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, 0, _StarY);
}
//12345678
//(105 + (1 * 12 + 2 * 34 + 3 * 56 + 4 *78)) % 103 = 47
//结果为starc +12 +34 +56 +78 +47 +end
internal Image GetCodeImage( string p)
{
throw new NotImplementedException();
}
}
}
}

  

  调用代码为:

            Code128 _Code = new Code128();
            _Code.ValueFont = new Font("宋体", 20);
            System.Drawing.Bitmap imgTemp = _Code.GetCodeImage("T26200-1900-123-1-0900",Code128.Encode.Code128A);
            imgTemp.Save(System.AppDomain.CurrentDomain.BaseDirectory + "\\" + "BarCode.gif", System.Drawing.Imaging.ImageFormat.Gif);
 
 
原文地址:http://www.cnblogs.com/rophie/archive/2012/03/02/2376946.html

你可能感兴趣的:(c#学习)