Вы не можете определить ограничение и расширение за один шаг, но вы можете определить X как ограничение Y, а Y как расширение Z, поэтому шаг расширения будет добавлять два атрибута, а шаг ограничения будет затем ограничить один из них.
Это - мой текущий 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
Я не знаю о библиотеках - вся работа штрихкода, которую я сделал, был со шрифтами штрихкода. Выезд, свободный 3 9, если Вы используете "3 из 9" форматов.
Протесты 3 9:
удостоверьтесь, что весь текст находится в верхнем регистре, запускают и заканчивают каждый штрихкод звездочкой
При выборе Code39 Вы могли бы, вероятно, кодировать из этого кода, который я написал
http://www.atalasoft.com/cs/blogs/loufranco/archive/2008/03/24/code-39-barcode-generation.aspx
Я записал это для использования нашего инструментария для формирования изображения, но Вы могли переписать его для использования Изображения/Графики.NET довольно легко.
Вот библиотека рендеринга штрихкода с открытым исходным кодом для языков.NET: http://www.codeplex.com/BarcodeRender
Это может представить некоторую обычную кодировку.
Лицензия выглядит мягкой, и это, кажется, применимо и в и в коммерческих приложениях с открытым исходным кодом (однако, IANAL, Вы могли бы хотеть проверить его лицензию сами.)
Вот другой, также открытый исходный код, с помощью лицензии Apache 2.0: http://sourceforge.net/projects/onecode/
Обычно, когда Вы знаете от запуска, Вы ищете компоненты с открытым исходным кодом, лучше обойти Google и непосредственно начать искать на SourceForge (это имеет замечательную систему фильтрации для результатов поиска, можно отфильтровать языком, который, вероятно, представляет интерес для Вас), или на CodePlex Microsoft (где выбор обычно более ограничен, но там Вы идете.)
Вы печатаете к стандартному принтеру или фактическому принтеру штрихкода (зебра или datamax)? у и зебры и datamax есть их собственные языки сценариев - на самом деле больше как языки разметки. ZPL и DPL соответственно. Мне нравится зебра больше, и их документация является намного более чистой.
Если у Вас нет законного принтера штрихкода, я предлагаю покупать один и делаю следующее.... (это будет намного более чисто, чем попытка разработать создание небольших блоков изображения и рисование их для моделирования шрифта штрихкода),
оба позволяют Вам большую гибкость, и можно позволить принтеру обработать создание фактического изображения штрихкода.
имейте свою программу, отправляют специализированный сценарий ZPL/DPL, который включает значения, которые Вы хотите распечатать как штрихкоды к принтеру через ftp. в основном Вы просто "помещаете" текстовый файл, который содержит сценарий к IP принтера, и принтер заботится о шрифте.
При рендеринге стороны клиента затем, шрифт может находиться на рабочей станции. Таким образом, можно использовать 3 9. Я использовал 3 9 в нескольких проектах и простом решении для Вас.
iTextSharp библиотека, в то время как якобы для создания создания PDFs, также имеет библиотеку поколения штрихкода, которая включает Code39.
После того как Вы добавляете ссылку на DLL, это столь же просто как:
Barcode39 code39 = new Barcode39();
code39.Code = "Whatever You're Encoding";
Ой, это - C#, но Вы получаете идею. После того, как созданный, можно представить изображение в примерно любом формате изображения и использовать его, как Вы желаете.
В моем последнем задании я работал с парой различных библиотек в vb.net для этого. Мы имели один и переместились в другой. Я не могу помнить их имена (я распознал бы их снова, если бы я видел их), но я действительно знаю, что и были для платы, мы оценили несколько различных компонентов во время переключателя, и я думаю, что включал свободный. Мы были очень небольшим магазином и очень чувствительный к стоимости, поэтому если бы свободный компонент хорошо работал вообще, можно держать пари, что мы использовали бы его (я думаю, что нам было нужно 128b поддержка, и он только обработал code39).
Я также помню, что обосновывают, что мы переключились, был то, что это было одновременно, мы переместились от.Net 1.1 до.Net 2.0, и первый компонент был слишком медленным созданием перехода.
Так, таким образом, там существует что-то, но это не было несколько никаких хорошие 3 года назад. Надо надеяться, кто-то еще может приехать и заполнить некоторые подлинные имена.