10

アプリケーションから Code39 でエンコードされたバーコードを作成したいと考えています。

これにフォントを使用できることは知っていますが、サーバーにフォントを登録する必要があり、かなり悪い経験があったため、使用しないことをお勧めします。

この質問をした後に私が作成したものの例は、回答にあります

4

10 に答える 10

11

これは私の現在の分離コードで、多くのコメントがあります。

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
于 2008-10-01T09:03:26.030 に答える
6

ライブラリについては知りません。私が行ったバーコード作業はすべて、バーコード フォントに関するものでした。「3 of 9」形式を使用している場合は、無料の 3-of-9 をチェックしてください。

3-of-9 の警告:

すべてのテキストが大文字であることを確認してください 各バーコードの最初と最後にアスタリスクを付けてください

于 2008-09-29T16:50:38.497 に答える
6

Code39を選択した場合、おそらく私が書いたこのコードからコード化できます

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

イメージ生成用のツールキットを使用するために作成しましたが、.NET イメージ/グラフィックスを使用するように簡単に書き直すことができます。

于 2008-09-29T16:12:50.367 に答える
3

.NET 言語用のオープン ソース バーコード レンダリング ライブラリは次のとおりです: http://www.codeplex.com/BarcodeRender

いくつかの通常のエンコーディングをレンダリングできます。

ライセンスは無害に見え、オープン ソース アプリと商用アプリの両方で使用できるようです (ただし、IANAL については、ライセンスを自分で確認することをお勧めします)。

これもオープンソースで、Apache 2.0 ライセンスを使用しています: http://sourceforge.net/projects/onecode/

一般に、最初からオープン ソース コンポーネントを探していることがわかっている場合は、Google をバイパスして直接SourceForgeで検索を開始することをお勧めします (検索結果の優れたフィルタリング システムがあり、おそらく興味深い言語でフィルタリングできます)。 ) または Microsoft のCodePlex (通常、選択肢はより限られていますが、ここまでです。)

于 2008-09-29T16:33:39.257 に答える
1

標準のプリンターまたは実際のバーコードプリンター(zebraまたはdatamax)に印刷していますか?zebraとdatamaxはどちらも独自のスクリプト言語を持っており、実際にはマークアップ言語に似ています。それぞれZPLとDPL。私はゼブラの方が好きで、彼らのドキュメントはずっときれいです。

正規のバーコードプリンターをお持ちでない場合は、購入して次の手順を実行することをお勧めします。(小さな画像ブロックを作成してペイントしてバーコードフォントをシミュレートするよりもはるかにクリーンです)

どちらも柔軟性が高く、実際のバーコード画像の作成をプリンタに任せることができます。

プログラムに、バーコードとして印刷したい値を含むカスタマイズされたZPL/DPLスクリプトをftp経由でプリンターに送信させます。基本的には、スクリプトを含むテキストファイルをプリンタのIPに「配置」するだけで、プリンタがフォントを処理します。

于 2008-10-05T23:42:14.557 に答える
1

iTextSharpライブラリは、表向きは PDF を作成するためのものですが、Code39 を含むバーコード生成ライブラリもあります。

DLL への参照を追加すると、次のように簡単になります。

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

おっと、これは C# ですが、おわかりいただけたでしょうか。作成したら、ほぼすべての画像形式で画像をレンダリングし、必要に応じて使用できます。

于 2008-11-17T05:57:50.537 に答える
0

クライアント側をレンダリングする場合、フォントはワークステーションに常駐できます。このようにして、3-of-9 を使用できます。私はいくつかのプロジェクトで 3-of-9 を使用してきましたが、これが最も簡単な解決策です。

于 2008-09-29T16:57:27.827 に答える
-1

私の最後の仕事では、これのために vb.net のいくつかの異なるライブラリを使用しました。私たちは1つ持っていて、別のものに移動しました。それらの名前は思い出せません (見ればまたわかるでしょう) が、どちらも有償であることは知っています。切り替え時にいくつかの異なるコンポーネントを評価しました。 1。私たちは非常に小さなショップであり、非常にコストに敏感だったので、無料のコンポーネントが少しでも優れていれば、それを使用していたに違いありません (128b のサポートが必要で、code39 しか処理できなかったと思います)。

また、切り替えた理由は、.Net 1.1 から .Net 2.0 への移行と同時に行われたことと、最初のコンポーネントの移行が遅すぎたことも覚えています。

つまり、要約すると、そこには何かがありますが、3 年前はあまり良くありませんでした。うまくいけば、他の誰かが来て、いくつかの実際の名前を記入してくれることを願っています.

于 2008-09-29T16:14:14.327 に答える