65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 条形码生成器 WebService

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (71投票s)

2003年4月1日

BSD

3分钟阅读

viewsIcon

620676

downloadIcon

29222

使用 C# 的 Web 服务创建 code39 条形码。

Sample Image - barcodegen.jpg

引言

几天前,我被要求找一个解决方案,用来创建一个条形码,以便打印在由一个 Web 应用程序生成的文档上。在尝试寻找一些能生成条形码的组件后,我很快意识到,当需要处理无限数量的客户端许可证时,它们的价格非常高。我需要一个字母数字条形码表示,并且首选的条形码表示是 Code39。

为了向尽可能多的客户端提供服务,同时提供一个标准化的解决方案,我想到了编写一个 Web 服务,该服务可以动态地生成条形码,并将其作为图像流式传输回来。

本文描述了我所实现的解决方案。

条形码生成

我的想法是使用一种免费的条形码字体来生成条形码(http://www.squaregear.net/fonts/free3of9.shtml),而不是编写一个模拟该条形码表示算法的 code39 条形码生成器。

所以我的方法很简单

  1. 加载条形码字体
  2. 创建一个图像对象
  3. 使用 code39 条形码字体在该图像中绘制一个字符串
  4. 返回该图像的序列化结果。

使用 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

© . All rights reserved.