Как генерировать штрихкоды Code39 в vb.net

Вы не можете определить ограничение и расширение за один шаг, но вы можете определить X как ограничение Y, а Y как расширение Z, поэтому шаг расширения будет добавлять два атрибута, а шаг ограничения будет затем ограничить один из них.

10
задан sebastiaan 1 October 2008 в 09:08
поделиться

8 ответов

Это - мой текущий 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
11
ответ дан 3 December 2019 в 15:54
поделиться

Я не знаю о библиотеках - вся работа штрихкода, которую я сделал, был со шрифтами штрихкода. Выезд, свободный 3 9, если Вы используете "3 из 9" форматов.

Протесты 3 9:

удостоверьтесь, что весь текст находится в верхнем регистре, запускают и заканчивают каждый штрихкод звездочкой

6
ответ дан 3 December 2019 в 15:54
поделиться

При выборе Code39 Вы могли бы, вероятно, кодировать из этого кода, который я написал

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

Я записал это для использования нашего инструментария для формирования изображения, но Вы могли переписать его для использования Изображения/Графики.NET довольно легко.

6
ответ дан 3 December 2019 в 15:54
поделиться

Вот библиотека рендеринга штрихкода с открытым исходным кодом для языков.NET: http://www.codeplex.com/BarcodeRender

Это может представить некоторую обычную кодировку.

Лицензия выглядит мягкой, и это, кажется, применимо и в и в коммерческих приложениях с открытым исходным кодом (однако, IANAL, Вы могли бы хотеть проверить его лицензию сами.)

Вот другой, также открытый исходный код, с помощью лицензии Apache 2.0: http://sourceforge.net/projects/onecode/

Обычно, когда Вы знаете от запуска, Вы ищете компоненты с открытым исходным кодом, лучше обойти Google и непосредственно начать искать на SourceForge (это имеет замечательную систему фильтрации для результатов поиска, можно отфильтровать языком, который, вероятно, представляет интерес для Вас), или на CodePlex Microsoft (где выбор обычно более ограничен, но там Вы идете.)

3
ответ дан 3 December 2019 в 15:54
поделиться

Вы печатаете к стандартному принтеру или фактическому принтеру штрихкода (зебра или datamax)? у и зебры и datamax есть их собственные языки сценариев - на самом деле больше как языки разметки. ZPL и DPL соответственно. Мне нравится зебра больше, и их документация является намного более чистой.

Если у Вас нет законного принтера штрихкода, я предлагаю покупать один и делаю следующее.... (это будет намного более чисто, чем попытка разработать создание небольших блоков изображения и рисование их для моделирования шрифта штрихкода),

оба позволяют Вам большую гибкость, и можно позволить принтеру обработать создание фактического изображения штрихкода.

имейте свою программу, отправляют специализированный сценарий ZPL/DPL, который включает значения, которые Вы хотите распечатать как штрихкоды к принтеру через ftp. в основном Вы просто "помещаете" текстовый файл, который содержит сценарий к IP принтера, и принтер заботится о шрифте.

1
ответ дан 3 December 2019 в 15:54
поделиться

При рендеринге стороны клиента затем, шрифт может находиться на рабочей станции. Таким образом, можно использовать 3 9. Я использовал 3 9 в нескольких проектах и простом решении для Вас.

0
ответ дан 3 December 2019 в 15:54
поделиться

iTextSharp библиотека, в то время как якобы для создания создания PDFs, также имеет библиотеку поколения штрихкода, которая включает Code39.

После того как Вы добавляете ссылку на DLL, это столь же просто как:

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

Ой, это - C#, но Вы получаете идею. После того, как созданный, можно представить изображение в примерно любом формате изображения и использовать его, как Вы желаете.

1
ответ дан 3 December 2019 в 15:54
поделиться

В моем последнем задании я работал с парой различных библиотек в vb.net для этого. Мы имели один и переместились в другой. Я не могу помнить их имена (я распознал бы их снова, если бы я видел их), но я действительно знаю, что и были для платы, мы оценили несколько различных компонентов во время переключателя, и я думаю, что включал свободный. Мы были очень небольшим магазином и очень чувствительный к стоимости, поэтому если бы свободный компонент хорошо работал вообще, можно держать пари, что мы использовали бы его (я думаю, что нам было нужно 128b поддержка, и он только обработал code39).

Я также помню, что обосновывают, что мы переключились, был то, что это было одновременно, мы переместились от.Net 1.1 до.Net 2.0, и первый компонент был слишком медленным созданием перехода.

Так, таким образом, там существует что-то, но это не было несколько никаких хорошие 3 года назад. Надо надеяться, кто-то еще может приехать и заполнить некоторые подлинные имена.

-1
ответ дан 3 December 2019 в 15:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: