HowTo: VB .NET Barcodes und Reports

27. Apr 2009 9:54 (bearbeiten)


Wir haben in den letzten Tagen nach einer Möglichkeit gesucht, in Crystal Reports Barcodes anzuzeigen, und zwar so, dass man sie nachher mit einem Barcode Scanner auch wieder einlesen kann.

Um dies zu tun habe ich nach einer kostenlosen Open-Source Variante gesucht.

Nach unzähligen Versuchen fand ich dann endlich das Barcode Rendering Framework ZEN auf Codeplex.com.

Das Framework kann über Verwendung der drei DLLs als Verweis recht simpel eingebunden werden. Es beherrscht folgende Varianten:

  • Code 11 (mit oder ohne Prüfsumme)
  • Code 25 standard/interleaved (mit oder ohne Prüfsumme)
  • Code 39 (mit oder ohne Prüfsumme)
  • Code 93 (nur mit Prüfsumme)
  • Code 128 (nur mit Prüfsumme)
  • Code EAN 13 (nur mit Prüfsumme)
  • Code EAN 8 (nur mit Prüfsumme)
  • Code PDF417 2D (mit Prüfsumme)

Im Prinzip wird im Code unten folgendes gemacht:

  • Barcode Bild erstellen und als temporäre Datei abspeichern
  • Das abgespeicherte Bild in ein Dataset laden, damit wir es im Report anzeigen können

Das Dataset, das der Report verwendet, besitzt nur zwei Spalten. Eine namens ImageFilename (vom Typ String) welche den Dateinamen des temporären Barcode Bildes enthält, und eine namens Image (vom Typ base64Binary bzw. System.Byte()), die das Bild selbst enthält.

  1. Public Sub ShowRepDemo()
  2.  
  3. ' Barcode-Bild erstellen und als temporäre Datei abspeichern
  4. Dim tmpfile As String
  5. tmpfile = My.Computer.FileSystem.GetTempFileName & ".bmp"
  6. Zen.Barcode.BarcodeDrawFactory.Code128WithChecksum.Draw("Dies ist ein Barcode 128 Test", 30).Save(tmpfile)
  7.  
  8. Dim ds As New dsMain
  9.  
  10. ' Barcode Bild in Datatable schreiben
  11. ds.dtImage.AdddtImageRow(tmpfile, Nothing)
  12.  
  13. ' Image binär in Datatable schreiben
  14. For index As Integer = 0 To ds.Tables(0).Rows.Count - 1
  15. If Not String.IsNullOrEmpty(ds.Tables(0).Rows(index).Item("ImagePath").ToString) Then
  16. LoadImage(ds.Tables(0).Rows(index), "Image", ds.Tables(0).Rows(index).Item("ImagePath").ToString)
  17. End If
  18. Next
  19.  
  20. ' Report öffnen
  21. Dim rptdoc As New repDemo
  22. rptdoc.SetDataSource(ds.Tables(0))
  23.  
  24. Dim rv As New CrystalDecisions.Windows.Forms.CrystalReportViewer
  25. rv.Dock = DockStyle.Fill
  26. Me.Controls.Add(rv)
  27. rv.ReportSource = rptdoc
  28.  
  29. End Sub
  30.  
  31. ' Bild in DataTable schreiben
  32. Private Sub LoadImage(ByVal objDataRow As DataRow, ByVal strImageField As String, ByVal FilePath As String)
  33. Try
  34. Dim fs As System.IO.FileStream = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
  35. Dim Image() As Byte = New Byte(fs.Length) {}
  36. fs.Read(Image, 0, CType(fs.Length, Integer))
  37. fs.Close()
  38. objDataRow(strImageField) = Image
  39. Catch ex As Exception
  40. Throw New Exception(ex.Message)
  41. End Try
  42.  
  43. end Sub

Tags ¦ , , , und