C# 条形码生成器 WebService






4.79/5 (71投票s)
使用 C# 的 Web 服务创建 code39 条形码。
引言
几天前,我被要求找一个解决方案,用来创建一个条形码,以便打印在由一个 Web 应用程序生成的文档上。在尝试寻找一些能生成条形码的组件后,我很快意识到,当需要处理无限数量的客户端许可证时,它们的价格非常高。我需要一个字母数字条形码表示,并且首选的条形码表示是 Code39。
为了向尽可能多的客户端提供服务,同时提供一个标准化的解决方案,我想到了编写一个 Web 服务,该服务可以动态地生成条形码,并将其作为图像流式传输回来。
本文描述了我所实现的解决方案。
条形码生成
我的想法是使用一种免费的条形码字体来生成条形码(http://www.squaregear.net/fonts/free3of9.shtml),而不是编写一个模拟该条形码表示算法的 code39 条形码生成器。
所以我的方法很简单
- 加载条形码字体
- 创建一个图像对象
- 使用 code39 条形码字体在该图像中绘制一个字符串
- 返回该图像的序列化结果。
使用 Code39 字体...
在 Windows 中使用字体的方法很简单,只需安装它(通过将其复制到 c:\WINDOWS\Fonts - 在 XP 下)并使用它即可。
不幸的是,ASP.NET 图形上下文不允许您使用任何字体(例如 free3of9.ttf),因为 .NET GDI 仅使用/枚举 OpenType 字体。所以您要做的是创建一个临时字体对象。
这种方法非常简单,您可以在下面的代码示例中看到
// Create a private font collection
objectPrivateFontCollection pfc=new PrivateFontCollection();
// Load in the temporary barcode font
pfc.AddFontFile("c:\\barcodefont\\free3of9.ttf");
// Select the font family to use
FontFamily family=new FontFamily("Free 3 of 9",pfc);
// Create the font object with size 30
Font c39Font=new Font(family,30);
通过这种简单的方法,您可以获得一个映射到条形码字体的字体对象,以便您可以创建条形码。
创建条形码图像容器
图像创建非常简单。.NET 类允许您动态生成图像。因此,为了创建一个足够大的图像来容纳条形码,首先您需要确定代码字符串绘制将占用的尺寸,使用条形码字体。
您可以使用 MeasureString
方法来实现
// Create a temporary bitmap...
Bitmap tmpBitmap = new Bitmap(1,1,PixelFormat.Format32bppArgb);
objGraphics = Graphics.FromImage(tmpBitmap);
// measure the barcode size...
SizeF barCodeSize=objGraphics.MeasureString(barCodeString,c39Font);
返回的类型 barCodeSize
具有代码字符串绘制将占用的宽度和高度。
绘制条形码
所以现在我们需要绘制条形码。我们将使用之前实例化的 code39 条形码字体对象。
假设 barcode 变量包含条形码字符串,则所需的代码是
// Draw the barcode
objGraphics.DrawString(barCode, Code39Font, new solidBrush(Color.Black),0,0);
请注意,通常 code39 条形码是通过连接条形码字符串的开头和结尾的字符 (*) 来表示的……这意味着代码 123456 必须写成 *123456*。但是,我将其留给您的经验。
序列化/反序列化图像
为了从 Web 服务方法返回图像,您现在必须序列化图像,这意味着您的 Web 方法必须返回一个字节数组。
这样,您必须从位图图像创建一个流,并将其作为字节数组返回。同样,.NET 框架使我们很容易执行该任务
// Create stream....
MemoryStream ms = new MemoryStream();
// save the image to the stream
objBitmap.Save(ms ,ImageFormat.Png);
//return an array of bytes....
return ms.GetBuffer();
在另一端(客户端),当您使用 Web 服务时,您需要能够将字节数组反序列化回图像
Byte[] imgBarcode;
// Call the webservice to create the barcode...
// Create a stream....
MemoryStream memStream = new MemoryStream(imgBarcode);
// Recreate the image from the stream
Bitmap bmp=new Bitmap(memStream);
关于附带的示例代码的最后说明…
在创建了条形码 Web 应用程序(这将是您的 Web 服务)之后,您需要配置 web.config 文件,以指定条形码字体的位置。搜索以下部分并进行相应的更改。
<appSettings>
<add key="BarCodeFontFile" value="c:\temp\font\FREE3OF9.TTF" />
<add key="BarCodeFontFamily" value="Free 3 of 9" />
</appSettings>
就这样了。希望您喜欢它。
此致,
Rui Miguel Barbosa