Barcode zeichnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Zum Font-Namen: Kommt auf den zu generierenden Code an. Code39 wäre eine Möglichkeit. Die kannst Du dann Deinem Programm mitgeben und dann wohl zur Laufzeit einbinden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich denke mir fehlt hier noch ein großer Punkt an Hintergrundwissen. Wie binde ich den Font denn zur Laufzeit ein?

    2 of 5 Interleaved wäre der Code meiner Wahl, aber es tut bestimmt auch ein anderer. Haben die Prüfziffern einen Einfluss auf die Darstellung des Codes?

    Hiermit habe ich es versucht, aber das ist wie gewohnt eine Ziffernfolge:

    VB.NET-Quellcode

    1. Friend Class Form1
    2. Private ReadOnly Barcode As New Font("Code 39", 24)
    3. Private Sub Print()
    4. Using dlg As New PrintPreviewDialog
    5. Me.PrintDocument1.DocumentName = "Test"
    6. dlg.Document = Me.PrintDocument1
    7. dlg.PrintPreviewControl.Zoom = 1.0
    8. dlg.ShowDialog()
    9. End Using
    10. End Sub
    11. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    12. e.Graphics.DrawString("1234567890", Barcode, Brushes.Black, New Point(300, 300))
    13. End Sub
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. Print()
    16. End Sub
    17. End Class

    Kostenlos gefunden habe ich jetzt nur eine Truetype-Schriftartendatei für LibreBarcode128, ich schätze mal die muss ich irgendwie einbinden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es hängt auch davon ab, was die lesende Gegenstelle imstande ist zu lesen und auszuwerten.
    Üblicherweise arbeite ich mit Code128, weil der gängig ist und auch sicherer zu lesen als 2/5i

    Oder ich nehme gleich QR-Code.

    Wer soll deinen Barcode letztendlich denn lesen und auswerten?

    Haudruferzappeltnoch schrieb:

    e.Graphics.DrawString("1234567890", Barcode, Brushes.Black, New Point(300, 300))
    Wenn du keine Prüfziffer verwendest, glaube ich nicht, dass das ein gewöhnlicher Barcode-Leser als gültig erkennt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Also einbinden habe ich nun verstanden, denke ich, leider weiterhin keine Änderung die Ziffern bleiben Ziffern:

    VB.NET-Quellcode

    1. Friend Class Form1
    2. Private Barcode As Font
    3. Private ReadOnly myFont As New PrivateFontCollection
    4. Sub New()
    5. InitializeComponent()
    6. PreLoad()
    7. End Sub
    8. Private Sub PreLoad()
    9. Dim path = Application.StartupPath & "\Barcode128.ttf"
    10. myFont.AddFontFile(path)
    11. Barcode = New Font(myFont.Families(0), 24)
    12. End Sub
    13. Private Sub Print()
    14. Using dlg As New PrintPreviewDialog
    15. Me.PrintDocument1.DocumentName = "Test"
    16. dlg.Document = Me.PrintDocument1
    17. dlg.PrintPreviewControl.Zoom = 1.0
    18. dlg.ShowDialog()
    19. End Using
    20. End Sub
    21. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    22. e.Graphics.DrawString("1234567890", Barcode, Brushes.Black, New Point(300, 300))
    23. End Sub
    24. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    25. Print()
    26. End Sub
    27. End Class


    @petaod Ich hab gerade mal geschaut Barcode 128 und QR-Code würde auch gehen. Ob das Lesegerät das lesen kann, weiß ich leider noch nicht wie oben beschrieben habe ich noch gar keinen Barcode. Ich denke mal um Prüfzifferen kann ich mir hinterher Gedanken machen, erstmal muss ich einen maschinenlesbaren String erzeugen können.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    erstmal muss ich einen maschinenlesbaren String erzeugen können
    Wenn er maschinenlesbar sein soll, musst du dich an das Protokoll des verwendeten Barcodes halten.
    Bei Code128 z.B. benötigst du zwingend StartCode, Prüfziffer und EndCode damit das Lesegerät den Code als gültig erkennt.

    Theorie
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ändert nix, außer dass es syntaktisch klappt. Das PrintDocument übernimmt es nicht.
    Bilder
    • Result.png

      3,83 kB, 432×337, 86 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Merkwürdig. Ich hab einfach mal den FOnt installiert, dann geht das auch im PrintDocument. Scheint ein blöder Bug zu sein, wenn ich einem Label den Font zugewiesen hab wurde der Barcode angezeigt. Auch beim malen auf's Form ging das. Ohne zu installieren müsste man ein Image rendern und das dann malen um eine installation zu umgehen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Barcodes von Hand zu erzeugen kann eine Herausforderung sein.
    Die Library Spire.Barcode kann so ziemlich alles erzeugen, Barcodes, QR-Codes...
    Und gibt es als kostenlose Communtiy Edition. Auch als nuget-Package.
    Wenn du dich registrierst, kriegst du sogar einen kostenlosen Key, um das ice-blue-Logo zu entfernen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jou, merkwürdig.
    wenn ich im PrintDocument.Print-Event einen Arial-Font erzeuge (Bold, Italic, Underline), klappt das.
    Ein Barcodefont kommt zwar im DrawString-Befehl an, wird aber iwie verworfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm ich hab das Ganze auf ne PictureBox gemalt, dann kommt da auch ein Barcode bei rum, dann wollte ich das als Bild auf mein PrintDocument packen, aber da verschwindet der Barcode diesmal ganz.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim g = picBCode.CreateGraphics
    3. g.DrawString("1234567890", Barcode, Brushes.Black, New Point(20, 40))
    4. picBCode.DrawToBitmap(PrepBitmap, New Rectangle(0, 0, 240, 128))
    5. Print()
    6. End Sub
    7. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    8. e.Graphics.DrawImage(PrepBitmap, 350, 300)
    9. End Sub

    Was Prüfziffer und Startcode angeht, welche Zeichen muss ich im String denn angeben für CODE A oder FNC1?

    Wie mache ich es denn mit einem QR-Code? Das geht ja nicht mit Font, da wird der Bug dann ja auch entfallen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @Haudruferzappeltnoch Probier mal diesen hier (getestet):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Text
    2. Public Class Form1
    3. Dim myFonts As New PrivateFontCollection
    4. Dim myFont As Font
    5. Dim bmp As New Bitmap(200, 100)
    6. Public Sub New()
    7. InitializeComponent()
    8. Me.myFont = Me.Font ' initial setzen
    9. End Sub
    10. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    11. Dim path = "D:\Projekte\___diverse Snippets\Font\Barcode.ttf" ' Pfad zu Deinem Font
    12. If Not IO.File.Exists(path) Then
    13. MessageBox.Show("Nein")
    14. Return
    15. End If
    16. Me.myFonts.AddFontFile(path)
    17. Me.myFont = New Font(myFonts.Families(0), 20)
    18. Me.PictureBox1.Invalidate()
    19. End Sub
    20. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    21. e.Graphics.DrawString("Blaklsdvölkkjadfv", Me.myFont, Brushes.Black, New Point(30, 100))
    22. Using g = Graphics.FromImage(bmp)
    23. g.Clear(Color.White)
    24. g.DrawString("Blaklsdvölkkjadfv", Me.myFont, Brushes.Black, New Point(10, 10))
    25. End Using
    26. 'bmp.Save("d:\temp\barcode.png") ' Testausgabe
    27. End Sub
    28. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    29. e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
    30. e.Graphics.DrawImage(bmp, New PointF(100, 100))
    31. e.Graphics.DrawImage(bmp, New RectangleF(100, 100, 500, 250), New RectangleF(0, 0, 200, 100), GraphicsUnit.Pixel)
    32. End Sub
    33. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    34. Using dlg = New PrintPreviewDialog
    35. dlg.Document = Me.PrintDocument1
    36. dlg.ShowDialog()
    37. End Using
    38. End Sub
    39. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!