Introduction
Some days ago, I was asked to find a solution to create a barcode to be
printed on documents produced by a web application. After trying to find some
components that produced barcodes, I soon realized that their price was
very high when dealing with an unlimited number of clients licences. I needed an
alphanumeric barcode representation and the preferred barcode representation was
Code39.
In order to expose this service to the maximum of clients while delivering a
standardized solution, I thought of writing a web service that would
generate the barcode dynamically and return it streamlined as an image.
This article describes the solution that I�ve implemented.
The Barcode Generation
Instead of writing a code39 barcode generator that mimics the algorithm for
that barcode representation, my idea was to use one of the freely available
barcode fonts to produce the barcode (http://www.squaregear.net/fonts/free3of9.shtml).
So my approach was simple:
- Load the Barcode Font
- Create an image object
- Draw a string into that image using a code39 barcode font
- Return that image serialized.
Using the Code39 Font...
The way to use a font in windows is simple, all you have to do is install it
(by copying it to the c:\WINDOWS\Fonts - under XP) and just use it.
Unfortunately, the ASP.NET graphic context does not allow you to use any
font (free3of9.ttf for example) because .NET GDI only uses/enumerates
OpenType fonts. So what you have to do is create a temporary font object.
This method is very straighforward, as you can see in the code sample
below:
objectPrivateFontCollection pfc=new PrivateFontCollection();
pfc.AddFontFile("c:\\barcodefont\\free3of9.ttf");
FontFamily family=new FontFamily("Free 3 of 9",pfc);
Font c39Font=new Font(family,30);
With this easy way, you get a font object mapped to the barcode font so that
you can create the barcode.
Creating the Barcode Image Container
The image creation is very simple. .NET classes allow you to generate images
on the fly. So, in order to create a image large enough to accommodate the
barcode, first you need to determine the size that will be occupied by the code
string drawing, using the barcode font.
You can do it using the MeasureString
method:
Bitmap tmpBitmap = new Bitmap(1,1,PixelFormat.Format32bppArgb);
objGraphics = Graphics.FromImage(tmpBitmap);
SizeF barCodeSize=objGraphics.MeasureString(barCodeString,c39Font);
The returned type barCodeSize
has the width, and the height that
will be occupied by the code string drawing.
Draw the Barcode
So now we need to draw the barcode. We will use the code39 barcode font
object instantiated earlier.
Assuming the the barcode variable holds the barcode string, the required code
is:
objGraphics.DrawString(barCode, Code39Font, new solidBrush(Color.Black),0,0);
Please note that usualy the code39 barcodes are represented
concatenating the char (*) at the beginning and end of the barcode
string�meaning that code 123456 has to be written as *123456*. But I will leave
that to your experience.
Serialize/Deserialize the Image
In order to return the image from the web service method, you now have to
serialize the image, meaning that your web method has to return an array of
bytes.
This way, you have to create a stream from the bitmap image, and return it as
an array of bytes. Once again, the .NET framework makes it easy for us do
perform that task:
MemoryStream ms = new MemoryStream();
objBitmap.Save(ms ,ImageFormat.Png);
return ms.GetBuffer();
On the other end (the client side) when you are consuming the web service,
you need to be able to deserialize the array of bytes back to the image:
Byte[] imgBarcode;
MemoryStream memStream = new MemoryStream(imgBarcode);
A final note about the sample code attached�
After creating the barcode web app that will be your webservice, you need to
configure the web.config file in order to specify where your barcode
font is located. Search for the following section and make your changes
accordingly.
<appSettings>
<add key="BarCodeFontFile" value="c:\temp\font\FREE3OF9.TTF" />
<add key="BarCodeFontFamily" value="Free 3 of 9" />
</appSettings>
And that�s all folks. Hope you�ve enjoyed it.
Best regards,
Rui Miguel Barbosa