namespace Barcode { /// <summary> /// Code39:生成39条形码。 /// </summary> public class Code39 { //对应码表 private Hashtable Decode; private Hashtable CheckCode; //每个字符间的间隔符 private string SPARATOR="0"; //float WidthUNIT= 0.25f;//宽度单位 mm public int WidthCU = 3; //粗线和宽间隙宽度 public int WidthXI = 1; //细线和窄间隙宽度 public int xCoordinate =10;//75; //条码起始坐标 public int LineHeight=60; private int Height=0; private int Width=0; public Code39() { Decode=new Hashtable(); Decode.Add("0","000110100"); Decode.Add("1","100100001"); Decode.Add("2","001100001"); Decode.Add("3","101100000"); Decode.Add("4","000110001"); Decode.Add("5","100110000"); Decode.Add("6","001110000"); Decode.Add("7","000100101"); Decode.Add("8","100100100"); Decode.Add("9","001100100"); Decode.Add("A","100001001"); Decode.Add("B","001001001"); Decode.Add("C","101001000"); Decode.Add("D","000011001"); Decode.Add("E","100011000"); Decode.Add("F","001011000"); Decode.Add("G","000001101"); Decode.Add("H","100001100"); Decode.Add("I","001001101"); Decode.Add("J","000011100"); Decode.Add("K","100000011"); Decode.Add("L","001000011"); Decode.Add("M","101000010"); Decode.Add("N","000010011"); Decode.Add("O","100010010"); Decode.Add("P","001010010"); Decode.Add("Q","000000111"); Decode.Add("R","100000110"); Decode.Add("S","001000110"); Decode.Add("T","000010110"); Decode.Add("U","110000001"); Decode.Add("V","011000001"); Decode.Add("W","111000000"); Decode.Add("X","010010001"); Decode.Add("Y","110010000"); Decode.Add("Z","011010000"); Decode.Add("-","010000101"); Decode.Add("%","000101010"); Decode.Add("$","010101000"); Decode.Add("*","010010100"); CheckCode=new Hashtable(); CheckCode.Add("0","0"); CheckCode.Add("1","1"); CheckCode.Add("2","2"); CheckCode.Add("3","3"); CheckCode.Add("4","4"); CheckCode.Add("5","5"); CheckCode.Add("6","6"); CheckCode.Add("7","7"); CheckCode.Add("8","8"); CheckCode.Add("9","9"); CheckCode.Add("A","10"); CheckCode.Add("B","11"); CheckCode.Add("C","12"); CheckCode.Add("D","13"); CheckCode.Add("E","14"); CheckCode.Add("F","15"); CheckCode.Add("G","16"); CheckCode.Add("H","17"); CheckCode.Add("I","18"); CheckCode.Add("J","19"); CheckCode.Add("K","20"); CheckCode.Add("L","21"); CheckCode.Add("M","22"); CheckCode.Add("N","23"); CheckCode.Add("O","24"); CheckCode.Add("P","25"); CheckCode.Add("Q","26"); CheckCode.Add("R","27"); CheckCode.Add("S","28"); CheckCode.Add("T","29"); CheckCode.Add("U","30"); CheckCode.Add("V","31"); CheckCode.Add("W","32"); CheckCode.Add("X","33"); CheckCode.Add("Y","34"); CheckCode.Add("Z","35"); CheckCode.Add("-","36"); CheckCode.Add(".","37"); CheckCode.Add(",","38"); CheckCode.Add("$","39"); CheckCode.Add("/","40"); CheckCode.Add("+","41"); CheckCode.Add("%","42"); } //保存文件 public Boolean saveFile(string Code,string Title,int UseCheck) { string code39=Encode39(Code,UseCheck); if(code39!=null) { Bitmap saved=new Bitmap(this.Width,this.Height); Graphics g=Graphics.FromImage(saved); g.FillRectangle(new SolidBrush(Color.White),0,0,this.Width,this.Height); this.DrawBarCode39(code39,Title,g); //string path=ConfigurationSettings.AppSettings["ImagePath"]; string path="C:\\"; string filename=path+Code+".jpg"; saved.Save(filename,ImageFormat.Jpeg); saved.Dispose(); return true; } return false; } /*** * Code:未经编码的字符串 * * **/ private string Encode39(string Code,int UseCheck) { int UseStand = 1; //检查输入待编码字符是否为标准格式(是否以*开始结束) //保存备份数据 string OriginalCode=Code; //为空不进行编码 if(null==Code||Code.Trim().Equals("")) { return null; } //检查错误字符 Code = Code.ToUpper(); //转为大写 Regex rule = new Regex(@"[^0-9A-Z%$\-*]"); if(rule.IsMatch(Code)) { MessageBox.Show("编码中包含非法字符,目前仅支持字母,数字及%$-*符号!!"); return null; } //计算检查码 if (UseCheck==1) { int Check = 0; //累计求和 for (int i = 0; i < Code.Length; i++) { Check += int.Parse((string)CheckCode[Code.Substring(i,1)]); } //取模 Check=Check%43; //附加检测码 foreach(DictionaryEntry de in CheckCode) { if((string)de.Value==Check.ToString()) { Code=Code+(string)de.Key; break; } } } //标准化输入字符,增加起始标记 if (UseStand==1) { if (Code.Substring(0,1) != "*") { Code = "*" + Code; } if (Code.Substring(Code.Length-1,1)!="*") { Code = Code + "*"; } } //转换成39编码 string Code39=""; for (int i = 0; i < Code.Length; i++) { Code39=Code39+(string)Decode[Code.Substring(i,1)]+SPARATOR; } int height = 30+LineHeight;//定义图片高度 int width=xCoordinate; for(int i=0;i<Code39.Length;i++) { if("0".Equals(Code39.Substring(i,1))) { width+=WidthXI; } else { width+=WidthCU; } } this.Width=width+xCoordinate; this.Height=height; return Code39; } private void DrawBarCode39(string Code39,string Title,Graphics g) { int UseTitle = 1; //条码上端显示标题 //int UseTTF = 1; //使用TTF字体,方便显示中文,需要$UseTitle=1时才能生效 if(Title.Trim().Equals("")) { UseTitle=0; } Pen pWhite=new Pen(Color.White, 1); Pen pBlack=new Pen(Color.Black, 1); int position=xCoordinate; for(int i=0;i<Code39.Length;i++) { //绘制条线 if("0".Equals(Code39.Substring(i,1))) { for(int j=0;j<WidthXI;j++) { g.DrawLine(pBlack,position+j,5,position+j,5+LineHeight); } position+=WidthXI; } else { for(int j=0;j<WidthCU;j++) { g.DrawLine(pBlack,position+j,5,position+j,5+LineHeight); } position+=WidthCU; } i++; //绘制间隔线 if("0".Equals(Code39.Substring(i,1))) { position+=WidthXI; } else { position+=WidthCU; } } //显示标题 if(UseTitle==1) { Font TitleFont=new Font("宋体", 16, FontStyle.Bold); SizeF sf=g.MeasureString(Title,TitleFont); g.DrawString(Title,TitleFont, Brushes.Black,(Width-sf.Width)/2,LineHeight+5); } return ; } } }