Frage

Ich möchte Code39 Barcodes codiert aus meiner Anwendung erstellen.

Ich weiß, dass ich eine Schriftart für diese, aber ich würde es vorziehen, nicht als habe ich die Schrift auf dem Server registrieren und ich habe ein paar ziemlich schlechte Erfahrungen mit, dass habe.

Ein Beispiel dessen, was ich nach dem diese Frage produziert haben in den Antworten ist

War es hilfreich?

Lösung

Dies ist mein aktueller Code-Behind, mit vielen Kommentaren:

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

Andere Tipps

Wenn Sie Code39 wählen, könnten Sie wahrscheinlich von diesem Code Code bis ich schrieb

http: //www.atalasoft.com/cs/blogs/loufranco/archive/2008/03/24/code-39-barcode-generation.aspx

Ich schrieb es unser Toolkit zur Bilderzeugung zu verwenden, aber man könnte es umschreiben .NET Bild / Grafik ziemlich leicht zu verwenden.

Ich weiß nicht, über Bibliotheken - all die Barcodes Arbeit, die ich getan habe, ist mit Barcode-Fonts gewesen. Schauen Sie sich freien 3-of-9 , wenn Sie die "3 von 9" verwenden Format.

Caveats von 3-of-9:

Sicherstellen, dass alle Text ist in Großbuchstaben beginnen und jeden Barcode mit einem Sternchen Ende

Hier ist ein Open-Source-Barcode für .NET-Sprachen-Rendering-Bibliothek: http://www.codeplex.com/BarcodeRender

Es kann einige üblichen Kodierungen machen.

Die Lizenz sieht gutartig, und es scheint, sowohl Open-Source- und kommerziellen Anwendungen verwendbar zu sein (jedoch IANAL, möchten Sie vielleicht seine Lizenz selbst.)

Hier ist ein weiterer, auch Open Source, die Apache 2.0-Lizenz verwenden: http://sourceforge.net/ Projekte / OneCode /

Im Allgemeinen, wenn Sie von Anfang an wissen Sie suchen Open-Source-Komponenten, es ist besser, Google zu umgehen und direkt starten die Suche auf Source (es ist ein wunderbares Filtersystem für die Suchergebnisse erhalten, Sie nach Sprache filtern können, die Sie wahrscheinlich von Interesse ist) oder auf Microsoft CodePlex (wo Wahl in der Regel mehr begrenzt ist, aber es Sie gehen.)

drucken Sie auf einen Standarddrucker oder einen tatsächlichen Barcode-Drucker (Zebra oder Datamax)? beide Zebra und Datamax haben ihre eigenen Skriptsprachen - eigentlich mehr wie Markup-Sprachen. ZPL und DPL sind. Ich mag Zebras mehr und deren Dokumentation ist viel sauberer.

Wenn Sie nicht über ein berechtigtes Barcode-Drucker haben, schlage ich vor, den Kauf eines und gehen Sie wie folgt .... (es wird viel sauberer als zu versuchen, kleine Bildblöcke bauen zu erarbeiten und zu malen sie einen Barcode-Schriftart zu simulieren )

beide ermöglichen Ihnen eine große Flexibilität und Sie können den Druckerhandgriff lassen die eigentliche Barcode-Bild erzeugt wird.

Ihr Programm einen individuellen ZPL / DPL-Skript senden, das den Wert enthält, die Sie als Barcodes an den Drucker per ftp gedruckt haben mögen. im Grunde, die Sie gerade „put“ eine Textdatei, die das Skript auf die IP des Druckers enthält und der Drucker übernimmt die Schriftart.

Die iTextSharp Bibliothek, während sie vorgeblich für die Erstellung von PDF-Dateien erstellen, hat auch eine Barcode-Generierung-Bibliothek, den Code39 enthält .

Wenn Sie einen Verweis auf die DLL hinzufügen, es ist so einfach wie:

Barcode39 code39 = new Barcode39();
code39.Code = "Whatever You're Encoding";

Oops, das ist C #, aber Sie bekommen die Idee. Einmal erstellt, können Sie ein Bild in fast jedes Bildformat machen und es verwenden, wie Sie wollen.

Wenn Sie Client-Seite machen, dann kann die Schriftart auf einer Arbeitsstation befindet. Auf diese Weise können Sie 3-of-9 verwenden. Ich habe 3-of-9 in mehreren Projekten verwendet und die einfachste Lösung für Sie.

Hier ist ein Beispiel für wie Code39 Barcodes in vb.net zu erzeugen. Getestet habe ich es jetzt und es funktioniert.

 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

Stattdessen Barcode-Font zu verwenden, würde ich eine .net Barcode-Generator-Komponente . Nachfolgend finden Sie eine vb.net Probe für Code 39 Barcode zu schaffen.

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

Bei meinem letzten Job arbeitete ich mit ein paar verschiedenen Bibliotheken in vb.net dafür. Wir hatten ein, und zog in ein anderes. Ich kann mich nicht an ihre Namen erinnern (ich würde sie wieder erkennen, wenn ich sie sehe), aber ich weiß, dass beide for-Pay wurden wir mehrere verschiedene Komponenten zum Zeitpunkt des Schalters ausgewertet, und ich denke, dass eine kostenlose enthalten. Wir waren ein sehr kleiner Laden und sehr Kosten empfindlich, so dass, wenn die freie Komponente überhaupt ein gut waren Sie darauf wetten, können wir es benutzt haben würden (ich glaube, wir brauchten 128b Unterstützung und es behandelt code39 nur).

Ich erinnere mich auch, dass wir Grund eingeschaltet war, dass es in der gleichen Zeit war, dass wir von .Net 1.1 bewegten 2.0 auf .NET, und die erste Komponente war zu langsam, den Übergang zu machen.

So in der Zusammenfassung, es ist etwas da draußen, aber es war keine gute 3 Jahre. Hoffentlich kann jemand anderes kommen und füllen einige tatsächlichen Namen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top