A Bar Code is a machine-readable code in the form of numbers and a pattern of parallel lines of varying widths, printed on a commodity and used especially for stock control. This article shows how to generate a Bar Code in an ASP.NET MVC project. A Bar code has a unique pattern of parallel lines. This pattern represents a unique number and using this number we get information of a product that has this bar code.
To start this task you need the Font named "FREE3OF9.TTF" (Code 39 Font). You can download it from. http://www.free-barcode-font.com. Click on Download the Code 39 font package.
First of all we create a database table for storing, the barcode image or barcode number of the bar code. The design of the table follows. In the database table we store the bar code image as a binary string.
Now we create a model in the model folder for data accessing. Add the following code to the model.
namespace BarCode.Models
{
public class BarCodeModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public byte[] BarcodeImage { get; set; }
public string Barcode { get; set; }
public string ImageUrl { get; set; }
}
}
Now open Visual Studio 2012 then select "New project" in the Start Page and click on ASP.NET MVC4 Web Application in Visual C#, name the project BarCode or whatever you like. Create a controller named HomeController and in this controller create an ActionResult method named Index.
public ActionResult Index()
{
return View();
}
Now create a view, right-click on the Index action method and select Add View and then click OK. Write the following code in this view to create an insert form using @html helper or create a strongly typed view.
@model BarCode.Models.BarCodeModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Add Product</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
For generating the bar code we are adding two classes, the first is “barcodecs” and the other is “BarCode39”. The Barcodecs class has two methods the first is “generateBarcode” for generating a unique bar code number and another method is “getBarcodeImage” creating the bar code image using “Code 39 Font”.
The “barcode39.cs” code is available in the given source code file. The barcodecs.cs code is the following.
namespace BarCode.Models
{
public class barcodecs
{
public string generateBarcode()
{
try
{
string[] charPool = "1-2-3-4-5-6-7-8-9-0".Split('-');
StringBuilder rs = new StringBuilder();
int length = 6;
Random rnd = new Random();
while (length-- > 0)
{
int index = (int)(rnd.NextDouble() * charPool.Length);
if (charPool[index] != "-")
{
rs.Append(charPool[index]);
charPool[index] = "-";
}
else
length++;
}
return rs.ToString();
}
catch (Exception ex)
{
//ErrorLog.WriteErrorLog("Barcode", ex.ToString(), ex.Message);
}
return "";
}
public Byte[] getBarcodeImage(string barcode, string file)
{
try
{
BarCode39 _barcode = new BarCode39();
int barSize = 16;
string fontFile = HttpContext.Current.Server.MapPath("~/fonts/FREE3OF9.TTF");
return (_barcode.Code39(barcode, barSize, true, file, fontFile));
}
catch (Exception ex)
{
//ErrorLog.WriteErrorLog("Barcode", ex.ToString(), ex.Message);
}
return null;
}
}
}
Now create a HttpPost Action method to get the posted data. I am using “LINQ to SQL” (dbml file) to insert data into the table.
Now create a data context for makaing a connection to the database.
ProductDataContext context = new ProductDataContext();
Now create an object of the product table for inserting data into the table and write the following code for the action method. Here barcode is a unique number that is generated by the generateBarcode() method and the barcode image is byte codes of an image generated by the getBarCodeImage() method of the of barcodecs.cs as in the following:
[HttpPost]
public ActionResult Index(BarCodeModel model)
{
barcodecs objbar = new barcodecs();
Product objprod = new Product()
{
Name = model.Name,
Description = model.Description,
Barcode = objbar.generateBarcode(),
BarCodeImage = objbar.getBarcodeImage(objbar.generateBarcode(), model.Name)
};
context.Products.InsertOnSubmit(objprod);
context.SubmitChanges();
return RedirectToAction("BarCode", "Home");
}
Now create another action method to display the barcode. In this action method we get data from the database. The code is as in the following:
public ActionResult BarCode()
{
SqlConnection con = new SqlConnection("Data Source=192.168.137.1;Initial Catalog=Hospital;Persist Security Info=True;User ID=sa;Password=MORarka#1234");
string query = "select * From Product";
DataTable dt = new DataTable();
con.Open();
SqlDataAdapter sda = new SqlDataAdapter(query, con);
sda.Fill(dt);
con.Close();
IList<BarCodeModel> model = new List<BarCodeModel>();
for (int i = 0; i < dt.Rows.Count; i++)
{
var p = dt.Rows[i]["BarCodeImage"];
model.Add(new BarCodeModel()
{
Name = dt.Rows[i]["Name"].ToString(),
Description = dt.Rows[i]["Description"].ToString(),
Barcode = dt.Rows[i]["Barcode"].ToString(),
ImageUrl = dt.Rows[i]["BarCodeImage"] != null ? "data:image/jpg;base64," + Convert.ToBase64String((byte[])dt.Rows[i]["BarCodeImage"]) : ""
});
}
return View(model);
}
Now right-click on the BarCode() action method and add a new view to display the barcode. Write the following code in BarCode.cshtml to display the data.
@model IEnumerable<BarCode.Models.BarCodeModel>
@{
ViewBag.Title = "BarCode";
}
<h2>BarCode</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Barcode)
</th>
<th>
@Html.DisplayNameFor(model => model.ImageUrl)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Barcode)
</td>
<td>
<img src="@item.ImageUrl"/>
</td>
</tr>
}
</table>
Now build and run your application.
Insert and submit data in the form if data. When it is successfully inserted your bar code is generated and it looks like:
Your bar code is successfully generated. If you have any query than feel free to contact me.