1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace JXUtil
  10. {
  11. public class BarCode
  12. {
  13. private Hashtable _Code39 = new Hashtable();
  14.  
  15. /// <summary>
  16. /// 内容
  17. /// </summary>
  18. public string Text { get; set; }
  19.  
  20. /// <summary>
  21. /// 放大倍数
  22. /// </summary>
  23. public byte Magnify { get; set; }
  24.  
  25. /// <summary>
  26. /// 图形高
  27. /// </summary>
  28. public int Height { get; set; }
  29.  
  30. /// <summary>
  31. /// 字体大小
  32. /// </summary>
  33. public Font ViewFont { get; set; }
  34.  
  35. public BarCode()
  36. {
  37. _Code39.Add("A", "");
  38. _Code39.Add("B", "");
  39. _Code39.Add("C", "");
  40. _Code39.Add("D", "");
  41. _Code39.Add("E", "");
  42. _Code39.Add("F", "");
  43. _Code39.Add("G", "");
  44. _Code39.Add("H", "");
  45. _Code39.Add("I", "");
  46. _Code39.Add("J", "");
  47. _Code39.Add("K", "");
  48. _Code39.Add("L", "");
  49. _Code39.Add("M", "");
  50. _Code39.Add("N", "");
  51. _Code39.Add("O", "");
  52. _Code39.Add("P", "");
  53. _Code39.Add("Q", "");
  54. _Code39.Add("R", "");
  55. _Code39.Add("S", "");
  56. _Code39.Add("T", "");
  57. _Code39.Add("U", "");
  58. _Code39.Add("V", "");
  59. _Code39.Add("W", "");
  60. _Code39.Add("X", "");
  61. _Code39.Add("Y", "");
  62. _Code39.Add("Z", "");
  63. _Code39.Add("", "");
  64. _Code39.Add("", "");
  65. _Code39.Add("", "");
  66. _Code39.Add("", "");
  67. _Code39.Add("", "");
  68. _Code39.Add("", "");
  69. _Code39.Add("", "");
  70. _Code39.Add("", "");
  71. _Code39.Add("", "");
  72. _Code39.Add("", "");
  73. _Code39.Add("+", "");
  74. _Code39.Add("-", "");
  75. _Code39.Add("*", "");
  76. _Code39.Add("/", "");
  77. _Code39.Add("%", "");
  78. _Code39.Add("&", "");
  79. _Code39.Add(".", "");
  80. _Code39.Add(" ", "");
  81. }
  82.  
  83. public enum Code39Model
  84. {
  85. /// <summary>
  86. /// 基本类别 1234567890ABC
  87. /// </summary>
  88. Code39Normal,
  89. /// <summary>
  90. /// 全ASCII方式 +A+B 来表示小写
  91. /// </summary>
  92. Code39FullAscII
  93. }
  94.  
  95. /// <summary>
  96. /// 获得条码图形
  97. /// </summary>
  98. /// <param name="text">文字信息</param>
  99. /// <param name="model">类别</param>
  100. /// <param name="stat">是否增加前后*号</param>
  101. /// <returns>图形</returns>
  102. public Bitmap GetCodeImage(Code39Model model, bool star)
  103. {
  104. string textVal = "";
  105. string textCode = "";
  106. char[] charVal = null;
  107. switch (model)
  108. {
  109. case Code39Model.Code39Normal:
  110. textVal = Text.ToUpper();
  111. break;
  112. default:
  113. charVal = Text.ToCharArray();
  114. for (int i = ; i != charVal.Length; i++)
  115. {
  116. if ((int)charVal[i] >= && (int)charVal[i] <= )
  117. {
  118. textVal += "+" + charVal[i].ToString().ToUpper();
  119.  
  120. }
  121. else
  122. {
  123. textVal += charVal[i].ToString();
  124. }
  125. }
  126. break;
  127. }
  128. charVal = textVal.ToCharArray();
  129. if (star == true) textCode += _Code39["*"];
  130. for (int i = ; i != charVal.Length; i++)
  131. {
  132. if (star == true && charVal[i] == '*') throw new Exception("带有起始符号不能出现*");
  133. object _CharCode = _Code39[charVal[i].ToString()];
  134. if (_CharCode == null) throw new Exception("不可用的字符" + charVal[i].ToString());
  135. textCode += _CharCode.ToString();
  136. }
  137. if (star == true) textCode += _Code39["*"];
  138. Bitmap bmp = GetImage(textCode);
  139. GetViewImage(bmp, Text);
  140. return bmp;
  141. }
  142.  
  143. /// <summary>
  144. /// 绘制编码图形
  145. /// </summary>
  146. /// <param name="text">编码</param>
  147. /// <returns>图形</returns>
  148. private Bitmap GetImage(string text)
  149. {
  150. char[] val = text.ToCharArray();
  151.  
  152. //宽 == 需要绘制的数量*放大倍数 + 两个字的宽
  153. Bitmap codeImg = new Bitmap(val.Length * ((int)Magnify + ), (int)Height);
  154. Graphics graph = Graphics.FromImage(codeImg);
  155.  
  156. graph.FillRectangle(Brushes.White, new Rectangle(, , codeImg.Width, codeImg.Height));
  157.  
  158. int len = ;
  159. for (int i = ; i != val.Length; i++)
  160. {
  161. int width = Magnify + ;
  162. if (val[i] == '')
  163. {
  164. graph.FillRectangle(Brushes.Black, new Rectangle(len, , width, Height));
  165.  
  166. }
  167. else
  168. {
  169. graph.FillRectangle(Brushes.White, new Rectangle(len, , width, Height));
  170. }
  171. len += width;
  172. }
  173.  
  174. graph.Dispose();
  175. return codeImg;
  176. }
  177.  
  178. /// <summary>
  179. /// 绘制文字
  180. /// </summary>
  181. /// <param name="codeImage">图形</param>
  182. /// <param name="text">文字</param>
  183. private void GetViewImage(Bitmap codeImage, string text)
  184. {
  185. if (ViewFont == null) return;
  186. Graphics graphic = Graphics.FromImage(codeImage);
  187. SizeF fontSize = graphic.MeasureString(text, ViewFont);
  188.  
  189. if (fontSize.Width > codeImage.Width || fontSize.Height > codeImage.Height - )
  190. {
  191. graphic.Dispose();
  192. return;
  193. }
  194. int starHeight = codeImage.Height - (int)fontSize.Height;
  195. graphic.FillRectangle(Brushes.White, new Rectangle(, starHeight, codeImage.Width, (int)fontSize.Height));
  196.  
  197. int _StarWidth = (codeImage.Width - (int)fontSize.Width) / ;
  198. graphic.DrawString(text, ViewFont, Brushes.Black, _StarWidth, starHeight);
  199. graphic.Dispose();
  200.  
  201. }
  202. }
  203.  
  204. public class BarCode128
  205. {
  206. // ASCII从32到127对应的条码区,由3个条、3个空、共11个单元构成,符号内含校验码
  207. private string[] Code128Encoding = new string[] {
  208. "", "", "", "", "", "", "", "", "", "",
  209. "", "", "", "", "", "", "", "", "", "",
  210. "", "", "", "", "", "", "", "", "", "",
  211. "", "", "", "", "", "", "", "", "", "",
  212. "", "", "", "", "", "", "", "", "", "",
  213. "", "", "", "", "", "", "", "", "", "",
  214. "", "", "", "", "", "", "", "", "", "",
  215. "", "", "", "", "", "", "", "", "", "",
  216. "", "", "", "", "", "", "", "", "", "",
  217. "", "", "", "", "", "", "", "", "", "",
  218. "", "", "", "", "", ""
  219. };
  220. private const string Code128Stop = "", Code128End = ""; //固定码尾
  221. private enum Code128ChangeModes { CodeA = , CodeB = , CodeC = }; //变更
  222. private enum Code128StartModes { CodeUnset = , CodeA = , CodeB = , CodeC = };//各类编码的码头
  223.  
  224. /// <summary>
  225. /// 绘制Code128码(以像素为单位)
  226. /// </summary>
  227. public int EncodeBarcode(string code, System.Drawing.Graphics g, int x, int y, int width, int height, bool showText)
  228. {
  229. if (string.IsNullOrEmpty(code)) new Exception("条码不能为空");
  230. List<int> encoded = CodetoEncoded(code); //1.拆分转义
  231. encoded.Add(CheckDigitCode128(encoded)); //2.加入校验码
  232. string encodestring = EncodeString(encoded); //3.编码
  233.  
  234. if (showText) //计算文本的大小,字体占图像的1/4高
  235. {
  236. Font font = new System.Drawing.Font("宋体", height / 4F, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel, ((byte)()));
  237. SizeF size = g.MeasureString(code, font);
  238. height = height - (int)size.Height;
  239.  
  240. int _StarWidth = (width - (int)size.Width) / ;
  241. g.DrawString(code, font, System.Drawing.Brushes.Black, _StarWidth, height);
  242. int w = DrawBarCode(g, encodestring, x, y, width, height); //4.绘制
  243. return ((int)size.Width > w ? (int)size.Width : w);
  244. }
  245. else
  246. return DrawBarCode(g, encodestring, x, y, width, height); //4.绘制
  247. }
  248.  
  249. //1.检测并将字符串拆分并加入码头
  250. private List<int> CodetoEncoded(string code)
  251. {
  252. List<int> encoded = new List<int>();
  253. int type = ;//2:B类,3:C类
  254. for (int i = ; code.Length > ; i++)
  255. {
  256. int k = isNumber(code);
  257. if (k >= ) //连续偶个数字可优先使用C类(其实并不定要转C类,但能用C类时条码会更短)
  258. {
  259. if (type == ) encoded.Add((int)Code128StartModes.CodeC); //加入码头
  260. else if (type != ) encoded.Add((int)(Code128ChangeModes.CodeC)); //转义
  261. type = ;
  262. for (int j = ; j < k; j = j + ) //两位数字合为一个码身
  263. {
  264. encoded.Add(Int32.Parse(code.Substring(, )));
  265. code = code.Substring();
  266. }
  267. }
  268. else
  269. {
  270. if ((int)code[] < || (int)code[] > ) throw new Exception("字符串必须是数字或字母");
  271. if (type == ) encoded.Add((int)Code128StartModes.CodeB); //加入码头
  272. else if (type != ) encoded.Add((int)(Code128ChangeModes.CodeB)); //转义
  273. type = ;
  274. encoded.Add((int)code[] - );//字符串转为ASCII-32
  275. code = code.Substring();
  276. }
  277. }
  278. return encoded;
  279. }
  280. //2.校验码
  281. private int CheckDigitCode128(List<int> encoded)
  282. {
  283. int check = encoded[];
  284. for (int i = ; i < encoded.Count; i++)
  285. check = check + (encoded[i] * i);
  286. return (check % );
  287. }
  288.  
  289. //2.编码(对应Code128Encoding数组)
  290. private string EncodeString(List<int> encoded)
  291. {
  292. string encodedString = "";
  293. for (int i = ; i < encoded.Count; i++)
  294. {
  295. encodedString += Code128Encoding[encoded[i]];
  296. }
  297. encodedString += Code128Stop + Code128End; // 加入结束码
  298. return encodedString;
  299. }
  300.  
  301. //4.绘制条码(返回实际图像宽度)
  302. private int DrawBarCode(System.Drawing.Graphics g, string encodeString, int x, int y, int width, int height)
  303. {
  304. int w = width / encodeString.Length;
  305. for (int i = ; i < encodeString.Length; i++)
  306. {
  307. g.FillRectangle(encodeString[i] == '' ? System.Drawing.Brushes.White : System.Drawing.Brushes.Black, x, y, w, height);
  308. x += w;
  309. }
  310. return w * (encodeString.Length + );
  311. }
  312. //检测是否连续偶个数字,返回连续数字的长度
  313. private int isNumber(string code)
  314. {
  315. int k = ;
  316. for (int i = ; i < code.Length; i++)
  317. {
  318. if (char.IsNumber(code[i]))
  319. k++;
  320. else
  321. break;
  322. }
  323. if (k % != ) k--;
  324. return k;
  325. }
  326.  
  327. /// <summary>
  328. /// 绘制Code128码到图片
  329. /// </summary>
  330. public Image EncodeBarcode(string code, int width, int height, bool showText)
  331. {
  332. Bitmap image = new Bitmap(width, height);
  333. using (Graphics g = Graphics.FromImage(image))
  334. {
  335. g.Clear(Color.White);
  336. int w = EncodeBarcode(code, g, , , width, height, showText);
  337.  
  338. Bitmap image2 = new Bitmap(w, height); //剪切多余的空白;
  339. using (Graphics g2 = Graphics.FromImage(image2))
  340. {
  341. g2.DrawImage(image, , );
  342. return image2;
  343. }
  344.  
  345. }
  346.  
  347. }
  348.  
  349. /// <summary>
  350. /// 绘制Code128码到流
  351. /// </summary>
  352. public byte[] EncodeBarcodeByte(string code, int width, int height, bool showText)
  353. {
  354. Image image = EncodeBarcode(code, width, height, showText);
  355. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  356. image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
  357. byte[] byteImage = ms.ToArray();
  358. ms.Close();
  359. image.Dispose();
  360. return byteImage;
  361.  
  362. }
  363. }
  364. }
  1. <div>
  2. <table>
  3. <tr>
  4. <td>条码:</td>
  5. <td>
  6. <textarea id="barCode"></textarea><br />
  7. <span style="color: #ccc;">动态生成条码,生成多条码使用“,”号分隔。</span>
  8. </td>
  9. </tr>
  10. <tr>
  11. <td></td>
  12. <td>
  13. <a id="btnCreate">生成</a>
  14. </td>
  15. </tr>
  16. </table>
  17. </div>
  1. $("#btnCreate").click(function () {
  2. var barCode = $("#barCode").val();
  3. if (barCode != "" && barCode != null) {
  4. $("#print").html("");
  5. var imgStr = "";
  6. if (barCode.indexOf(",") > -1) {
  7. var code = barCode.split(",");
  8. $.each(code, function (index, value) {
  9. if (value != "" && value != null) {
  10. imgStr += "<div><img src='/BaseData/CreateBarCode?code=" + value + "'/></div>";
  11. }
  12. });
  13. }
  14. else {
  15. imgStr = "<div><img src='/BaseData/CreateBarCode?code=" + barCode + "'/></div>";
  16. }
  17.  
  18. $("#print").append(imgStr);
  19. }
  20. else {
  21. alert("条码不能为空!");
  22. }
  23. });
  1. public ActionResult CreateBarCode(string code)
  2. {
  3. JXUtil.BarCode barcode = new JXUtil.BarCode();
  4. barcode.Text = code;
  5. barcode.Height = ;
  6. barcode.Magnify = ;
  7. barcode.ViewFont = new Font("宋体", );
  8. System.Drawing.Image codeImage = barcode.GetCodeImage(JXUtil.BarCode.Code39Model.Code39Normal, true);
  9.  
  10. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  11. codeImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  12.  
  13. Response.ContentType = "image/jpeg";
  14. Response.Clear();
  15. Response.BinaryWrite(ms.ToArray());
  16.  
  17. return new EmptyResult();
  18. }

asp.net mvc 生成条形码的更多相关文章

  1. ASP.Net MVC 生成安全验证码

    ---------html <td>验证码:</td>            <td>                <img src="/Logi ...

  2. ASP.NET MVC生成安全验证码

    html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. (一)【转】asp.net mvc生成验证码

    网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中.   ...

  4. Asp.net mvc生成验证码

    1.生成验证码类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  5. ASP.NET MVC 生成验证码

    using System.Web.Mvc; using System.Drawing; using System; using System.Drawing.Imaging; using Models ...

  6. ASP.NET MVC 生成EML文件

    需求: 点发送邮件按钮的时候, 自动在客户端电脑打开默认邮件的窗口,并且把内容和附件都附加上去. 解决方案: 尝试使用过Microsoft.Office.Interop.Outlook 和 MPAI. ...

  7. Asp.net MVC 生成zip并下载

    前面有生成Excel或Word的示例,所以就不再重新写了. 这里只提供将指定文件以ZIP的方式下载. 创建一个 Zip工具类 public class ZIPCompressUtil { public ...

  8. asp.net mvc 生成二维码

    生成二维码,帮助类: using Gma.QrCodeNet.Encoding; using Gma.QrCodeNet.Encoding.Windows.Render; using System; ...

  9. ASP.NET MVC生成静态页面

    1.先付上封装好生成静态页的原代码: public class Common { #region 获取模板页的Html代码 /// <summary> /// 获取页面的Html代码 // ...

随机推荐

  1. PHP: configure: error: mysql configure failed. Please check config.log for more information.

    为php增加mysql模块时报错 configure: error: mysql configure failed. Please check config.log for more informat ...

  2. .NET MySQL的参数化查询

    MySqlConnection conn = new MySqlConnection(SqlConnnectString); MySqlCommand cmd = new MySqlCommand(& ...

  3. Node.js实践第一天

    实践案例一 表单提交 demo.html <!doctype html> <html> <head> <title>表单提交</title> ...

  4. javascript 命名空间,学习

    一. (function(){ var _NS=function(){ } _NS.prototype.alert=function(){ console.log('test'); } window. ...

  5. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  6. Java内存模型(转载)

    1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...

  7. Python成长之路第二篇(3)_字典的置函数用法

    字典的置函数用法(字典dict字典中的key不可以重复) class dict(object): """ dict() -> new empty dictionar ...

  8. 创建一个Hello World模块

    这篇文章描述了怎样为Orchard建立一个非常小的模块,它只显示一个"Hello World"页面. 另一个模块[Module]的简单例子,你可以从这找到:Quick Start ...

  9. TensorFlow 深度学习笔记 Stochastic Optimization

    Stochastic Optimization 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到I ...

  10. 一步一步学python(三) - 使用字符串

    1.基本字符串操作 序列和元组的索引.分片.乘法.判断成员资格.求长度.取最小值和最大值对字符串同样适用. 字符串是不可变的 2.字符串格式化 %左侧放字符串右侧放格式化的值.一般情况下使用元组 fo ...