2016-05-24 15 views
0

Ich versuche, einen Barcode in meinem RDL-Bericht einzubetten, der von Microsoft SQL Server-Berichts-Generator 3.0 entwickelt wird.Hinzufügen von Barcode zu Berichts-Generator 3.0

Ich habe einige vorgeschlagene Lösungen im Internet gefunden, eine davon ist, eine DLL Referenz hinzuzufügen und fügen Sie einige Code, aber es hat nicht funktioniert und es immer DLL nicht geladen, fand ich eine andere Lösung mit einem API als Quelle eines Bildes, aber das wäre keine brauchbare Lösung für mich, da ich nicht immer eine Internetverbindung in meinem Server habe.

Gibt es eine Möglichkeit, Code 128 Schriftart in meinem Bericht zu verwenden? Oder eine andere Lösung, die keine Internetverbindung benötigt?

+0

Ich habe hatte Glück mit dieser Schriftart: http://www.squaregear.net/fonts/free3of9.shtml –

Antwort

3

Nach vielen Recherchen gelang es mir, Barcode in meinem Bericht einzubetten und es unter Verwendung Code 128 Schriftart laufen zu lassen.

die Schriftart an sich ist nicht genug, da Sie den Text zuerst vorbereiten müssen, damit der Barcode scanfähig ist, folgende Lösung erfordert nicht, die Schriftart auf den Klientenmaschinen zu installieren, Sie müssen nur installieren es auf dem Server:

  1. Zuerst müssen Sie Code 128 Schriftart installieren, wenn Sie nicht bereits getan! Sie können es von here herunterladen.

  2. Öffnen Sie Ihren Bericht oder erstellen Sie einen neuen Bericht.

  3. Wir brauchen System.DrawingDLL Datei als Verweis hinzuzufügen:

    Dies kann, indem Sie auf den Berichtseigenschaften erfolgen (Rechtsklick außerhalb des Körpers ->Berichtseigenschaften), klicken Sie auf Referenzen Registerkarte, klicken Sie auf Hinzufügen Schaltfläche in Hinzufügen oder Entfernen von Baugruppen Abschnitt, klicken Sie auf die Schaltfläche Öffnen ... Suchen Sie nach C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll Datei, und klicken Sie auf Öffnen Sie.

    Sie sollten etwas davon haben:

    enter image description here


  1. Jetzt müssen wir einige benutzerdefinierte Code zu dem Bericht hinzuzufügen:

Gehen Sie zu Code Tab im Bericht t Eigenschaften, kopieren und den folgenden Code ein und klicken Sie Ok:

Function StringToBarcode(value As String) As String 
    Dim charPos, minCharPos As Integer 
    Dim currentChar, checksum As Integer 
    Dim isTableB As Boolean = True, isValid As Boolean = True 
    Dim returnValue As String = String.Empty 

    If (value Is Nothing OrElse value.Length = 0) Then 
    Return String.Empty 
    End If 

    'Check for valid characters 
    For charCount As Integer = 0 To value.Length - 1 
    currentChar = Asc(value.Substring(charCount, 1)) 
    If (Not (currentChar >= 32 AndAlso currentChar <= 126)) Then 
     isValid = False 
     Exit For 
    End If 
    Next 

    If Not (isValid) Then Return returnValue 
    charPos = 0 
    While (charPos < value.Length) 
    If (isTableB) Then 
     'See if interesting to switch to table C 
     'yes for 4 digits at start or end, else if 6 digits 
     If (charPos = 0 OrElse charPos + 4 = value.Length) Then 
     minCharPos = 4 
     Else 
     minCharPos = 6 
     End If 
     minCharPos = IsNumber(value, charPos, minCharPos) 

     If (minCharPos < 0) Then 
     'Choice table C 
     If (charPos = 0) Then 
     'Starting with table C 
     'char.ConvertFromUtf32(205) 
      returnValue = Chr(205).ToString() 
     Else 
      'Switch to table C 
      returnValue = returnValue + Chr(199).ToString() 
     End If 
     isTableB = False 
     Else 
     If (charPos = 0) Then 
      'Starting with table B 
      returnValue = Chr(204).ToString() 
      'char.ConvertFromUtf32(204); 
     End If 
     End If 
    End If 

    If (Not isTableB) Then 
     'We are on table C, try to process 2 digits 
     minCharPos = 2 
     minCharPos = IsNumber(value, charPos, minCharPos) 

     If (minCharPos < 0) Then 
     'OK for 2 digits, process it 
     currentChar = Integer.Parse(value.Substring(charPos, 2)) 
     If (currentChar < 95) Then 
      currentChar = currentChar + 32 
     Else 
      currentChar = currentChar + 100 
     End If 
     returnValue = returnValue + Chr(currentChar).ToString() 
     charPos += 2 
     Else 
     'We haven't 2 digits, switch to table B 
     returnValue = returnValue + Chr(200).ToString() 
     isTableB = True 
     End If 
    End If 

    If (isTableB) Then 
     'Process 1 digit with table B 
     returnValue = returnValue + value.Substring(charPos, 1) 
     charPos += 1 
    End If 

    End While 

    'Calculation of the checksum 
    checksum = 0 
    Dim loo As Integer 
    For loo = 0 To returnValue.Length - 1 
    currentChar = Asc(returnValue.Substring(loo, 1)) 
    If (currentChar < 127) Then 
     currentChar = currentChar - 32 
    Else 
     currentChar = currentChar - 100 
    End If 
    If (loo = 0) Then 
     checksum = currentChar 
    Else 
     checksum = (checksum + (loo * currentChar)) Mod 103 
    End If 
    Next 

    'Calculation of the checksum ASCII code 
    If (checksum < 95) Then 
    checksum = checksum + 32 
    Else 
    checksum = checksum + 100 
    End If 

    ' Add the checksum and the STOP 
    returnValue = returnValue + _ 
    Chr(checksum).ToString() + _ 
    Chr(206).ToString() 

    Return returnValue 
End Function 

Function IsNumber(InputValue As String, CharPos As Integer, MinCharPos As Integer) As Integer 
    MinCharPos -= 1 
    If (CharPos + MinCharPos < InputValue.Length) Then 
    While (MinCharPos >= 0) 
     If (Asc(InputValue.Substring(CharPos + MinCharPos, 1)) < 48 _ 
     OrElse Asc(InputValue.Substring(CharPos + MinCharPos, 1)) > 57) Then 
     Exit While 
    End If 
    MinCharPos -= 1 
    End While 
    End If 
    Return MinCharPos 
End Function 

Public Function Code128(ByVal stringText As String) As Byte() 
    Dim result As Byte() = Nothing 

    Try 
    result = GenerateImage("Code 128", StringToBarcode(stringText)) 
    Catch ex As Exception 
    End Try 

    Return result 
End Function 

Public Function GenerateImage(ByVal fontName As String, ByVal stringText As String) As Byte() 
    Dim oGraphics As System.Drawing.Graphics 
    Dim barcodeSize As System.Drawing.SizeF 
    Dim ms As System.IO.MemoryStream 

    Using font As New System.Drawing.Font(New System.Drawing.FontFamily(fontName), 30) 
    Using tmpBitmap As New System.Drawing.Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb) 
    oGraphics = System.Drawing.Graphics.FromImage(tmpBitmap) 
    oGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel 
    barcodeSize = oGraphics.MeasureString(stringText, font) 
    oGraphics.Dispose() 
    End Using 

    Using newBitmap As New System.Drawing.Bitmap(barcodeSize.Width, barcodeSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb) 
    oGraphics = System.Drawing.Graphics.FromImage(newBitmap) 
    oGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel 

    Using oSolidBrushWhite As New System.Drawing.SolidBrush(System.Drawing.Color.White) 
    Using oSolidBrushBlack As New System.Drawing.SolidBrush(System.Drawing.Color.Black) 
    oGraphics.FillRectangle(oSolidBrushWhite, New System.Drawing.Rectangle(0, 0, barcodeSize.Width, barcodeSize.Height)) 
    oGraphics.DrawString(stringText, font, oSolidBrushBlack, 0, 0) 
    End Using 

    End Using 

    ms = New System.IO.MemoryStream() 
    newBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 
    End Using 
    End Using 

    Return ms.ToArray() 
End Function 

  1. ein Bild in Ihren Bericht einfügen, und wählen Sie Datenbank als die Bildquelle, und verwenden als image/pngMIMI Typ:

    enter image description here


  1. Klicken Sie auf fx Taste in Verwenden Sie dieses Feld Taste, und diese Funktion =Code.Code128(Fields!your_field_name.Value), drücken Ok und Ok verwenden.

    enter image description here


  1. Führen Sie den Bericht, jetzt haben Sie einen Barcode :)

    enter image description here

0

Es gibt einige sehr komplexe Lösungen, aber ich konnte dies nur mit einer Schriftart tun. Stellen Sie sicher, dass Sie am Anfang und Ende des Werts Sternchen haben. Möglicherweise müssen Sie die Schriftart auf Ihrem Computer installieren, falls dies nicht bereits geschehen ist. Ich habe SSDT in Visual Studio verwendet, aber der Berichts-Generator sollte auch funktionieren. Bitte senden Sie ein Update, wenn Sie auf ein bestimmtes Problem oder einen Fehler stoßen.