문제

응용 프로그램에서 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 년 전에는 좋지 않았습니다. 바라건대 다른 사람이 와서 실제 이름을 채울 수 있기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top