我想从我的应用程序创建Code39编码的条形码.
我知道我可以使用这种字体,但是我不想像在服务器上注册字体那样,我已经有了一些不好的经历.
在提出这个问题之后,我提出的一个例子就是答案
这是我目前的codebehind,有很多评论:
- 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,imageWidth,imageHeight)
- 'draw a white background
- Dim g As Graphics = Graphics.FromImage(b)
- g.FillRectangle(Brushes.White,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"),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,imageHeight)
- g.DrawString("Invalid characters found,",8),0)
- g.DrawString("no barcode generated",10)
- g.DrawString("Input was: ",30)
- g.DrawString(Code,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