如何在vb.net中生成Code39条码
我想从我的应用程序中创建Code39编码的条形码。
我知道我可以为此使用一种字体,但是我不愿意这样做,因为我必须在服务器上注册该字体,并且我对此有一些不好的经验。
回答这个问题后,我产生了一个例子
解决方案
如果我们选择Code39,则可能可以从我编写的这段代码中进行编码
http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/03/24/code-39-barcode-generation.aspx
我写它的目的是为了使用我们的工具包来生成图像,但是我们可以很容易地重写它以使用.NET Image / Graphics。
在我的上一份工作中,我为此在vb.net中使用了几个不同的库。我们有一个,然后转移到另一个。我不记得他们的名字了(如果我看到他们的话,我会再认出来的),但是我确实知道这两个都是有偿的,我们在转换时评估了几个不同的组成部分,我认为其中包括免费的。一。我们是一家很小的商店,并且对成本非常敏感,因此如果我们可以免费使用免费组件,那么我们肯定会使用它(我认为我们需要128b支持,并且只能处理代码39)。
我还记得我们切换的原因是因为它是同时从.Net 1.1迁移到.Net 2.0的,而第一个组件进行转换的速度太慢了。
因此,总而言之,这里有一些东西,但是3年前并没有什么好用的。希望其他人可以跟进并填写一些实际姓名。
这是.NET语言的开源条形码渲染库:http://www.codeplex.com/BarcodeRender
它可以呈现一些常用的编码。
该许可证看起来不错,并且似乎可以在开源和商业应用程序中使用(但是,IANAL,我们可能需要自己检查其许可证。)
这是另一个使用Apache 2.0许可证的开源软件:http://sourceforge.net/projects/onecode/
通常,当我们从一开始就知道要寻找开源组件时,最好绕过Google并直接开始在SourceForge上搜索(它有一个很棒的搜索结果过滤系统,我们可以按语言进行过滤,这可能很有趣给我们)或者Microsoft的CodePlex(通常选择比较有限,但我们可以选择)。
我对库一无所知-我完成的所有条形码工作都与条形码字体有关。如果我们使用的是" 9之3"格式,请免费查看9之3.
9之三的警告:
确保所有文字均大写
以星号开头和结尾的每个条形码
如果渲染客户端,则字体可以驻留在工作站上。这样,我们可以使用9之3. 我在几个项目中使用了9之3,这是最简单的解决方案。
这是我当前的代码背后,有很多评论:
Option Explicit On Option Strict On Imports System.Drawing Imports System.Drawing.Imaging Imports System.Drawing.Bitmap Imports System.Drawing.Graphics Imports System.IO Partial Public Class Barcode Inherits System.Web.UI.Page 'Sebastiaan Janssen - 20081001 - TINT-30584 'Most of the code is based on this example: 'http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/04/25/writing-code-39-barcodes-with-javascript.aspx-generation.aspx 'With a bit of this thrown in: 'http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/03/24/code-39-barcode Private _encoding As Hashtable = New Hashtable Private Const _wideBarWidth As Short = 8 Private Const _narrowBarWidth As Short = 2 Private Const _barHeight As Short = 100 Sub BarcodeCode39() _encoding.Add("*", "bWbwBwBwb") _encoding.Add("-", "bWbwbwBwB") _encoding.Add("$", "bWbWbWbwb") _encoding.Add("%", "bwbWbWbWb") _encoding.Add(" ", "bWBwbwBwb") _encoding.Add(".", "BWbwbwBwb") _encoding.Add("/", "bWbWbwbWb") _encoding.Add("+", "bWbwbWbWb") _encoding.Add("0", "bwbWBwBwb") _encoding.Add("1", "BwbWbwbwB") _encoding.Add("2", "bwBWbwbwB") _encoding.Add("3", "BwBWbwbwb") _encoding.Add("4", "bwbWBwbwB") _encoding.Add("5", "BwbWBwbwb") _encoding.Add("6", "bwBWBwbwb") _encoding.Add("7", "bwbWbwBwB") _encoding.Add("8", "BwbWbwBwb") _encoding.Add("9", "bwBWbwBwb") _encoding.Add("A", "BwbwbWbwB") _encoding.Add("B", "bwBwbWbwB") _encoding.Add("C", "BwBwbWbwb") _encoding.Add("D", "bwbwBWbwB") _encoding.Add("E", "BwbwBWbwb") _encoding.Add("F", "bwBwBWbwb") _encoding.Add("G", "bwbwbWBwB") _encoding.Add("H", "BwbwbWBwb") _encoding.Add("I", "bwBwbWBwb") _encoding.Add("J", "bwbwBWBwb") _encoding.Add("K", "BwbwbwbWB") _encoding.Add("L", "bwBwbwbWB") _encoding.Add("M", "BwBwbwbWb") _encoding.Add("N", "bwbwBwbWB") _encoding.Add("O", "BwbwBwbWb") _encoding.Add("P", "bwBwBwbWb") _encoding.Add("Q", "bwbwbwBWB") _encoding.Add("R", "BwbwbwBWb") _encoding.Add("S", "bwBwbwBWb") _encoding.Add("T", "bwbwBwBWb") _encoding.Add("U", "BWbwbwbwB") _encoding.Add("V", "bWBwbwbwB") _encoding.Add("W", "BWBwbwbwb") _encoding.Add("X", "bWbwBwbwB") _encoding.Add("Y", "BWbwBwbwb") _encoding.Add("Z", "bWBwBwbwb") End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load BarcodeCode39() Dim barcode As String = String.Empty If Not IsNothing(Request("barcode")) AndAlso Not (Request("barcode").Length = 0) Then barcode = Request("barcode") Response.ContentType = "image/png" Response.AddHeader("Content-Disposition", String.Format("attachment; filename=barcode_{0}.png", barcode)) 'TODO: Depending on the length of the string, determine how wide the image will be GenerateBarcodeImage(250, 140, barcode).WriteTo(Response.OutputStream) End If End Sub Protected Function getBCSymbolColor(ByVal symbol As String) As System.Drawing.Brush getBCSymbolColor = Brushes.Black If symbol = "W" Or symbol = "w" Then getBCSymbolColor = Brushes.White End If End Function Protected Function getBCSymbolWidth(ByVal symbol As String) As Short getBCSymbolWidth = _narrowBarWidth If symbol = "B" Or symbol = "W" Then getBCSymbolWidth = _wideBarWidth End If End Function Protected Overridable Function GenerateBarcodeImage(ByVal imageWidth As Short, ByVal imageHeight As Short, ByVal Code As String) As MemoryStream 'create a new bitmap Dim b As New Bitmap(imageWidth, imageHeight, Imaging.PixelFormat.Format32bppArgb) 'create a canvas to paint on Dim canvas As New Rectangle(0, 0, imageWidth, imageHeight) 'draw a white background Dim g As Graphics = Graphics.FromImage(b) g.FillRectangle(Brushes.White, 0, 0, imageWidth, imageHeight) 'write the unaltered code at the bottom 'TODO: truely center this text Dim textBrush As New SolidBrush(Color.Black) g.DrawString(Code, New Font("Courier New", 12), textBrush, 100, 110) 'Code has to be surrounded by asterisks to make it a valid Code39 barcode Dim UseCode As String = String.Format("{0}{1}{0}", "*", Code) 'Start drawing at 10, 10 Dim XPosition As Short = 10 Dim YPosition As Short = 10 Dim invalidCharacter As Boolean = False Dim CurrentSymbol As String = String.Empty For j As Short = 0 To CShort(UseCode.Length - 1) CurrentSymbol = UseCode.Substring(j, 1) 'check if symbol can be used If Not IsNothing(_encoding(CurrentSymbol)) Then Dim EncodedSymbol As String = _encoding(CurrentSymbol).ToString For i As Short = 0 To CShort(EncodedSymbol.Length - 1) Dim CurrentCode As String = EncodedSymbol.Substring(i, 1) g.FillRectangle(getBCSymbolColor(CurrentCode), XPosition, YPosition, getBCSymbolWidth(CurrentCode), _barHeight) XPosition = XPosition + getBCSymbolWidth(CurrentCode) Next 'After each written full symbol we need a whitespace (narrow width) g.FillRectangle(getBCSymbolColor("w"), XPosition, YPosition, getBCSymbolWidth("w"), _barHeight) XPosition = XPosition + getBCSymbolWidth("w") Else invalidCharacter = True End If Next 'errorhandling when an invalidcharacter is found If invalidCharacter Then g.FillRectangle(Brushes.White, 0, 0, imageWidth, imageHeight) g.DrawString("Invalid characters found,", New Font("Courier New", 8), textBrush, 0, 0) g.DrawString("no barcode generated", New Font("Courier New", 8), textBrush, 0, 10) g.DrawString("Input was: ", New Font("Courier New", 8), textBrush, 0, 30) g.DrawString(Code, New Font("Courier New", 8), textBrush, 0, 40) End If 'write the image into a memorystream Dim ms As New MemoryStream Dim encodingParams As New EncoderParameters encodingParams.Param(0) = New EncoderParameter(Encoder.Quality, 100) Dim encodingInfo As ImageCodecInfo = FindCodecInfo("PNG") b.Save(ms, encodingInfo, encodingParams) 'dispose of the object we won't need any more g.Dispose() b.Dispose() Return ms End Function Protected Overridable Function FindCodecInfo(ByVal codec As String) As ImageCodecInfo Dim encoders As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders For Each e As ImageCodecInfo In encoders If e.FormatDescription.Equals(codec) Then Return e Next Return Nothing End Function End Class
我们要使用标准打印机还是实际的条形码打印机(斑马或者datamax)进行打印?
zebra和datamax都有自己的脚本语言,实际上更像是标记语言。 ZPL和DPL分别。我更喜欢zebra,他们的文档更干净。
如果我们没有合法的条形码打印机,建议我们购买一台打印机,然后执行以下操作....(比起尝试构建小的图像块并将其绘画以模拟条形码字体要干净得多)
两者都给我们很大的灵活性,并且我们可以让打印机处理创建实际的条形码图像。
让程序将自定义的ZPL / DPL脚本(包括我们要作为条形码打印的值)通过ftp发送到打印机。基本上,我们只需将包含脚本的文本文件"放入"打印机的IP,打印机就会处理字体。
iTextSharp库虽然表面上用于创建创建PDF,但也具有包含Code39的条形码生成库。
一旦添加了对DLL的引用,它就很简单:
Barcode39 code39 = new Barcode39(); code39.Code = "Whatever You're Encoding";
糟糕,这是C#,但我们明白了。创建后,我们可以以几乎任何图像格式渲染图像,并根据需要使用它。