Introduction
I was looking for a C# sample on how to draw barcodes in various formats and I could not find a sample for "2 of 5 interleaved" format, so I wrote my own using some guidance from here.
Points of Interest
To use this code, simply paste the code into the default form of a new C# Windows project in Visual Studio 2005. Drop a picturebox on the form and set the "Image" for this control to the output from the print2of5Interleaved()
method, pictureBox1.Image=print2of5Interleaved();
.
public Bitmap Print2of5Interleaved()
{
string Content = "12345678";
string CheckSum = CalcCheckSum(Content);
string startcode = "1010";
string stopcode = "1101";
int startX = 0;
int startY = 0;
int endY = startY + 40;
int curX;
int sectionIndex = 0;
int pairIndex = 0;
int barIndex = 0;
int spaceIndex = 0;
Graphics g;
Bitmap bmp = new Bitmap(100, 80);
g = Graphics.FromImage(bmp);
curX = startX;
Content = Content + CheckSum;
if ((Content.Length % 2) != 0)
{
Content = "0" + Content;
}
foreach (char digit in startcode)
{
if (digit == '1')
{
g.DrawLine(Pens.Black, curX, startY, curX, endY);
curX += 1;
}
else
{
curX += 1;
}
}
for (int i = 0; i < Content.Length; i += 2)
{
string pair = Content.Substring(i, 2);
string barPattern = Get2of5Pattern(pair.Substring(0, 1));
string spacePattern = Get2of5Pattern(pair.Substring(1, 1));
barIndex = 0;
spaceIndex = 0;
sectionIndex = 0;
while (sectionIndex < 10)
{
if ((sectionIndex % 2) == 0)
{
pairIndex = 0;
if (barPattern.Substring(barIndex, 1) == "W")
{
while (pairIndex < 2)
{
g.DrawLine(Pens.Black, curX + pairIndex, startY, curX + pairIndex, endY);
pairIndex++;
}
curX = curX + 2;
}
else
{
g.DrawLine(Pens.Black, curX + pairIndex, startY, curX + pairIndex, endY);
curX = curX + 1;
}
barIndex++;
}
else
{
if (spacePattern.Substring(spaceIndex, 1) == "W")
{
curX = curX + 2;
}
else
{
curX = curX + 1;
}
spaceIndex++;
}
sectionIndex += 1;
}
}
foreach (char digit in stopcode)
{
if (digit == '1')
{
g.DrawLine(Pens.Black, curX, startY, curX, endY);
curX += 1;
}
else
{
curX += 1;
}
}
return bmp;
}
Here is the code for the two helper methods:
public string CalcCheckSum(string CheckNum)
{
int i;
int j;
int checkval = 0;
j = 3;
i = CheckNum.Length - 1;
while (i > 0)
{
checkval += Convert.ToInt32(CheckNum.Substring(i, 1)) * j;
j = j ^ 2;
i -= 1;
}
checkval = (10 - (checkval % 10)) % 10;
return checkval.ToString();
}
public string Get2of5Pattern(string letter)
{
string tmpPattern = "";
switch (letter)
{
case "0":
tmpPattern = "NNWWN";
break;
case "1":
tmpPattern = "WNNNW";
break;
case "2":
tmpPattern = "NWNNW";
break;
case "3":
tmpPattern = "WWNNN";
break;
case "4":
tmpPattern = "NNWNW";
break;
case "5":
tmpPattern = "WNWNN";
break;
case "6":
tmpPattern = "NWWNN";
break;
case "7":
tmpPattern = "NNNWW";
break;
case "8":
tmpPattern = "WNNWN";
break;
case "9":
tmpPattern = "NWNWN";
break;
}
return tmpPattern;
}
Points of Interest
If anyone tests this with a barcode scanner and encounters any problems, let me know!
History
- 9th August, 2007: Initial post