vb.net에서 Code39 바코드를 생성하는 방법
문제
응용 프로그램에서 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, 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
다른 팁
Code39를 선택하면 내가 쓴이 코드에서 코드를 올릴 수 있습니다.
http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/03/24/code-39-barcode-generation.aspx
이미지 생성에 툴킷을 사용하기 위해 작성했지만 .NET Image/Graphics를 매우 쉽게 사용하도록 다시 작성할 수 있습니다.
나는 라이브러리에 대해 모른다 - 내가 한 모든 바코드 작업은 바코드 글꼴과 관련이있다. 체크 아웃 무료 3-9 "9 of 9"형식을 사용하는 경우
3-of-9의 경고 :
모든 텍스트가 대문자가 시작되고 별표로 각 바코드를 종료하십시오.
.NET 언어를위한 오픈 소스 바코드 렌더링 라이브러리는 다음과 같습니다. http://www.codeplex.com/barcoderender
일반적인 인코딩을 렌더링 할 수 있습니다.
라이센스는 양성인 것처럼 보이며 오픈 소스 및 상업용 앱 모두에서 사용할 수있는 것 같습니다 (그러나 Ianal, 귀하는 ITS를 확인하고 싶을 수도 있습니다. 특허 당신 자신.)
다음은 Apache 2.0 라이센스를 사용하여 오픈 소스도 있습니다. http://sourceforge.net/projects/onecode/
일반적으로 처음부터 오픈 소스 구성 요소를 찾고있는 경우 Google을 우회하고 직접 검색을 시작하는 것이 좋습니다. Sourceforge (검색 결과를위한 훌륭한 필터링 시스템이 있습니다. 언어별로 필터링 할 수 있습니다. 코드 플렉스 (선택 선택은 일반적으로 더 제한적이지만, 당신은 간다.)
표준 프린터 또는 실제 바코드 프린터 (Zebra 또는 Datamax)로 인쇄하고 있습니까? Zebra와 Datamax는 모두 자체 스크립팅 언어를 가지고 있습니다. 실제로 마크 업 언어와 비슷합니다. 각각 ZPL 및 DPL. 나는 Zebra의 점점 더 좋아하고 그들의 문서는 훨씬 깨끗합니다.
합법적 인 바코드 프린터가 없다면, 나는 하나를 구매하고 다음을 수행하는 것이 좋습니다 .... (작은 이미지 블록을 만들고 바코드 글꼴을 시뮬레이션하기 위해 그림을 그리는 것보다 훨씬 깨끗합니다).
둘 다 유연성이 뛰어나고 프린터가 실제 바코드 이미지를 만들도록 할 수 있습니다.
프로그램에 FTP를 통해 프린터에 바코드로 인쇄하려는 값이 포함 된 맞춤형 ZPL/DPL 스크립트를 보내도록하십시오. 기본적으로 스크립트가 포함 된 프린터의 IP에 포함 된 텍스트 파일을 "넣고 프린터는 글꼴을 처리합니다.
그만큼 itextsharp 도서관은 PDF를 생성하기 위해 표면적으로 표면적으로도 Code39를 포함하는 바코드 생성 라이브러리도 있습니다.
DLL에 대한 참조를 추가하면 다음과 같이 간단합니다.
Barcode39 code39 = new Barcode39();
code39.Code = "Whatever You're Encoding";
죄송합니다. C#이지만 아이디어를 얻습니다. 일단 생성되면 이미지를 거의 모든 이미지 형식으로 렌더링하고 원하는대로 사용할 수 있습니다.
클라이언트 쪽을 렌더링하면 글꼴이 워크 스테이션에 상주 할 수 있습니다. 이렇게하면 3-of-9를 사용할 수 있습니다. 여러 프로젝트에서 3-9로 사용했으며 가장 간단한 솔루션을 사용했습니다.
다음은 다음과 같습니다 vb.net에서 Code39 바코드를 생성하는 방법. 나는 지금 그것을 테스트했고 그것은 작동합니다.
Public Class code39
Private bitsCode As ArrayList
Public Sub New()
bitsCode = New ArrayList
bitsCode.Add(New String(3) {"0001101", "0100111", "1110010", "000000"})
bitsCode.Add(New String(3) {"0011001", "0110011", "1100110", "001011"})
bitsCode.Add(New String(3) {"0010011", "0011011", "1101100", "001101"})
bitsCode.Add(New String(3) {"0111101", "0100001", "1000010", "001110"})
bitsCode.Add(New String(3) {"0100011", "0011101", "1011100", "010011"})
bitsCode.Add(New String(3) {"0110001", "0111001", "1001110", "011001"})
bitsCode.Add(New String(3) {"0101111", "0000101", "1010000", "011100"})
bitsCode.Add(New String(3) {"0111011", "0010001", "1000100", "010101"})
bitsCode.Add(New String(3) {"0110111", "0001001", "1001000", "010110"})
bitsCode.Add(New String(3) {"0001011", "0010111", "1110100", "011010"})
End Sub
Public Function Generate(ByVal Code As String) As Image
Dim a As Integer = 0
Dim b As Integer = 0
Dim imgCode As Image
Dim g As Graphics
Dim i As Integer
Dim bCode As Byte()
Dim bitCode As Byte()
Dim tmpFont As Font
If Code.Length <> 12 Or Not IsNumeric(Code.Replace(".", "_").Replace(",", "_")) Then Throw New Exception("Le code doit être composé de 12 chiffres")
ReDim bCode(12)
For i = 0 To 11
bCode(i) = CInt(Code.Substring(i, 1))
If (i Mod 2) = 1 Then
b += bCode(i)
Else
a += bCode(i)
End If
Next
i = (a + (b * 3)) Mod 10
If i = 0 Then
bCode(12) = 0
Else
bCode(12) = 10 - i
End If
bitCode = getBits(bCode)
tmpFont = New Font("times new roman", 14, FontStyle.Regular, GraphicsUnit.Pixel)
imgCode = New Bitmap(110, 50)
g = Graphics.FromImage(imgCode)
g.Clear(Color.White)
g.DrawString(Code.Substring(0, 1), tmpFont, Brushes.Black, 2, 30)
a = g.MeasureString(Code.Substring(0, 1), tmpFont).Width
For i = 0 To bitCode.Length - 1
If i = 2 Then
g.DrawString(Code.Substring(1, 6), tmpFont, Brushes.Black, a, 30)
ElseIf i = 48 Then
g.DrawString(Code.Substring(7, 5) & bCode(12).ToString, tmpFont, Brushes.Black, a, 30)
End If
If i = 0 Or i = 2 Or i = 46 Or i = 48 Or i = 92 Or i = 94 Then
If bitCode(i) = 1 Then 'noir
g.DrawLine(Pens.Black, a, 0, a, 40)
a += 1
End If
Else
If bitCode(i) = 1 Then 'noir
g.DrawLine(Pens.Black, a, 0, a, 30)
a += 1
Else 'blanc
a += 1
End If
End If
Next
g.Flush()
Return imgCode
End Function
Private Function getBits(ByVal bCode As Byte()) As Byte()
Dim i As Integer
Dim res As Byte()
Dim bits As String = "101"
Dim cle As String = bitsCode(bCode(0))(3)
For i = 1 To 6
bits &= bitsCode(bCode(i))(CInt(cle.Substring(i - 1, 1)))
Next
bits &= "01010"
For i = 7 To 12
bits &= bitsCode(bCode(i))(2)
Next
bits += "101"
ReDim res(bits.Length - 1)
For i = 0 To bits.Length - 1
res(i) = Asc(bits.Chars(i)) - 48
Next
Return res
End Function
End Class
바코드 글꼴을 사용하는 대신 .NET 바코드 생성기 구성 요소. 아래는 a입니다 코드 39 바코드 생성을위한 vb.net 샘플.
Imports System.IO
Imports PQScan.BarcodeCreator
Namespace BarcodeGeneratorVB
Class Program
Private Shared Sub Main(args As String())
Dim barcode As New Barcode()
barcode.Data = "www.pqscan.com"
barcode.BarType = BarCodeType.Code39
barcode.Width = 300
barcode.Height = 100
barcode.CreateBarcode("code39-vb.jpeg")
End Sub
End Class
End Namespace
마지막 직장에서 나는 이것을 위해 vb.net의 몇 가지 다른 라이브러리와 함께 일했습니다. 우리는 하나를 가지고 있었고 다른 하나로 옮겼습니다. 나는 그들의 이름을 기억할 수 없다 (내가 보았을 때 다시 알아볼 것이다). 그러나 나는 그것을 알고있다. 둘 다 전환 당시에는 여러 가지 다른 구성 요소를 평가했으며, 여기에는 무료 구성 요소가 포함되어 있다고 생각합니다. 우리는 매우 작은 가게와 매우 비용 민감성이므로 무료 구성 요소가 전혀 좋지 않은 경우 우리는 그것을 사용했을 것입니다 (우리는 128b 지원이 필요하다고 생각하고 Code39 만 처리했습니다).
또한 우리가 전환 한 이유는 우리가 .NET 1.1에서 .NET 2.0으로 이동했을 때와 첫 번째 구성 요소가 너무 느리게 전환했기 때문입니다.
요약하면, 거기에 무언가가 있지만 3 년 전에는 좋지 않았습니다. 바라건대 다른 사람이 와서 실제 이름을 채울 수 있기를 바랍니다.