如何使用zxing.net处理Code128中的特殊字符

问题描述:

我创建了一个SSRS报告,其中包含一些Code128条形码。条码是使用最新的zxing.net库生成的。我想在Code128条形码中包含制表符(char(9))。但它会失败,以下异常消息:如何使用zxing.net处理Code128中的特殊字符

System.ArgumentException:坏字符输入:

不用说,它的工作原理就像一个没有制表性格魅力。

在报告中使用GetBarCodeHorizontal来生成条形码。然而,用于测试目的,我把它包成一个Visual Studio VB项目:

Class MainWindow 
    Public Function GetBarCodeHorizontal(ByVal s As String, ByVal width As Integer) As Byte() 
     Dim writer As New ZXing.BarcodeWriter() 
     Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream() 

     writer.Format = ZXing.BarcodeFormat.CODE_128 
     writer.Options = New ZXing.Common.EncodingOptions 
     writer.Options.Width = width 
     writer.Options.Height = 60 
     writer.Options.PureBarcode = False 
     'writer.Options.Hints.Add(ZXing.EncodeHintType.CHARACTER_SET, "UTF-8") 

     Dim bmp As System.Drawing.Bitmap = writer.Write(s) 

     bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 
     Dim imagedata As Byte() 
     imagedata = ms.GetBuffer() 
     Return imagedata 
    End Function 


    Private Sub MainWindow_OnLoaded(sender As Object, e As RoutedEventArgs) 
     Try 
      Dim barCodeHorizontal = GetBarCodeHorizontal("3999999 80 1XXXXXX8 r1XX3", 200) 
     Catch ex As Exception 
      Console.WriteLine(ex) 
     End Try 
    End Sub 
End Class 

问题:

  • 我怎样才能解决这个问题?
  • 这是zxing库的限制吗?
  • 是否有任何合适的解决方法(或甚至另一个库)?
+0

你为什么试图在条码中使用标签?也许有一点背景,我们可以提出一个替代方案。 – Nefariis

+0

条形码ist用于将信息插入基于控制台的传统系统。该选项卡用于切换到下一个字段。条形码应该如下所示:[MaterialNumber] [Tab] [Quantity] [Tab] [Batch] [Tab] [Location]。你知道另一个与SSRS合作的图书馆吗? – Joel

+1

您是否可以使用另一个字符切换到下一个字段,如管道“|”? zxing是标准 - 这里有一些其他的选项,虽然 - http://*.com/questions/8116990/looking-for-best-barcode-scanner-library-besides-zxing ...我会看看如果我可以改变第一个问题....你将遇到的问题是“表格式”不是任何编码表(utf-8,iso等)的一部分,所以我没有看到“表格式”的方式可以永远工作的图书馆...也许如果你能找到一个有它的表,那么找到支持该表的图书馆 - 但除此之外...... – Nefariis

我结束了another (free) library事实证明,工作得很好。

还有一个tutorial如何将条形码嵌入到SSRS中用于此特定库。

对于那些在这里感兴趣的是我的代码创建条形码:

Public Function GetBarcode(ByVal text As String, ByVal barcodeWidth As Integer, ByVal barcodeHeight As Integer) As Byte() 
     Dim b As System.Drawing.Bitmap 
     Dim bar As New BarcodeLib.Barcode 
     bar.Alignment = BarcodeLib.AlignmentPositions.CENTER 

     bar.IncludeLabel = False 
     b = bar.Encode(BarcodeLib.TYPE.CODE128, text, barcodeWidth, barcodeHeight) 
     Dim bitmapData As Byte() = Nothing 
     Using ms As New System.IO.MemoryStream() 
      b.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 
      bitmapData = ms.ToArray() 
     End Using 
     Return bitmapData 
    End Function 

条形码数据直接从查询中涉及如下所示:

SELECT  MilkrunID, Code, Quantity, Batch, PickLocation, Code + CHAR(9) + CAST(Quantity AS NVARCHAR(20)) + CHAR(9) + Batch + CHAR(9) + PickLocation AS Barcode 
FROM   Tbl_ReportData_ProductionReplenishment_MilkrunSummary 

CHAR(9)创建一个标签。