如何在 SSRS 报告中嵌入条形码






4.79/5 (30投票s)
如何在 SSRS 中使用 barcodelib 生成的条形码(请注意,条形码字体在运行时不起作用)。
引言
以下摘录将展示如何在 SSRS 报告中成功嵌入条形码(类似于 Crystal Reports,但略有不同)。使用条形码字体很好,但它们无法在 SSRS 报告服务器上发布的报告中使用。此外,条形码字体可能相当昂贵。感谢 Brad Barnhill,他发表了一篇精彩的文章,世界变得更美好了。
要继续执行以下步骤,您需要从他的文章中下载二进制文件barcodelib
。
背景
因此,我首先尝试使用免费的条形码字体来使其工作,但如引言中所述,结果失败了。您可以尝试一下,您会认为它有效,直到您发布报告。
接下来,我尝试编写一些自定义代码来生成一个Bitmap
,在其中使用Graphics.DrawString
和Barcode
字体,然后将其返回为Byte[]
。太好了,它奏效了,但导出的 PDF 报告的图像质量急剧下降,因为首先,它是一个 TrueType 字体……所以渲染、转换和打印的条形码有时可以被扫描,但遗憾的是,条形码扫描器有时会失败,因为图像不够好而无法读取。所以使用我自己的代码和一个免费字体还不够好。在浏览了许多论坛和想法后,我找到了 Brad 的文章,并想尝试一下,因为它直接渲染条形码,而不是字体到图像的转换。
使用 Brad Barnhill 提供的 barcodelib 似乎可以完美生成条形码,即使在打印后也能获得出色的质量,并且配置高度灵活,可以旋转、带有或不带有标签,支持各种条形码格式等。
那么,如何将这些自定义 DLL 东西集成到 SSRS 中?好吧,请看下面。
Using the Code
首先,您将 barcodelib.dll (来自 Brad Barnhill 的文章 Barcode Image Generation Library)复制
到“随处可见
”。更具体地说(以我使用 SSRS 2008 和 VS 2008 的示例为例)->
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\
C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies
C:\Program Files (x86)\Microsoft Visual Studio 9\Common7\IDE\PrivateAssemblies
然后,您在 Report->Properties 中添加对 .NET 选项卡中 System.Drawing
的引用,以及
使用浏览选项卡对报表服务器的 bin 文件夹中的 barcodelib.dll 的另一个引用。
然后,添加类名“Barcodelib.Barcode
”和实例名“bar
”。
现在它看起来应该像这样
在报表 Properties
的 Code 部分,您现在添加以下代码
Public Function Convert(Text As String) As Byte()
Dim b As System.Drawing.Bitmap
' Dim bar As New BarcodeLib.Barcode
bar.Alignment = BarcodeLib.AlignmentPositions.LEFT
bar.IncludeLabel = False
bar.RotateFlipType = Drawing.RotateFlipType.RotateNoneFlipNone
b = bar.Encode(BarcodeLib.TYPE.CODE39Extended, Text, 400, 30)
Dim bitmapData As Byte() = Nothing
Using ms As New System.IO.MemoryStream()
b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp)
bitmapData = ms.ToArray()
End Using
Return bitmapData
End Function
您是否认出了前面提到的实例“bar
”在这里被使用了?
您可以根据需要更改条形码的格式设置(例如,增强函数以接受参数),旋转、条形码类型等。请参阅引言中提到的有关 barcodelib
功能的文章!非常感谢 Brad!
并调整大小(在本例中为 400x30),也许能满足您的期望。通过反复试验,玩得开心。
SSRS 图像属性(请参阅下方)需要一个 byte[]
。所以它们会得到一个,快速将 bitmap
写入 memorystream
并获取 byte[]
。其他方法,例如使用 Marshal.Copy
也可以工作,但在我们目前处理的 SSRS 嵌入式代码场景中会引入更多麻烦。
现在一切都准备就绪,我们进入有趣的部分。
您向报告中添加一个 Image 以包含条形码。转到 Image 属性:
将图像源设置为“Database
”,MIME 类型设置为“Image/bmp
”,并将字段的表达式设置为以下内容
“Code
”访问您嵌入的代码的命名空间,我们在其中调用 barcodelib
来生成 Barcode
。
您可以将“*Test1234*
”替换为您要编码的条形码内容,例如来自 datasource
。
First(Fields!myfield.Value)
报告的预览将生成一个整洁的条形码,部署/发布的版本在报表服务器上也会生成 :-)。太简单了,不是吗?
voilà - 都完成了!
关注点
有几件事需要注意。
- 确保您的图像大小足够大,或者允许自动增长,或者设置为“按比例缩放”。如果条形码失真或被裁剪,则可能无法被
barcodescanner
读取,因为它的一半丢失了。 Code39Extended
似乎需要一个星号来开始和结束条形码。这意味着您的文本需要以*
开头并以*
结尾。然后读取的条形码内容将是*
星号之间的内容。这可能也适用于某些其他条形码格式。- 确保以高分辨率打印报告,以便条形码正常显示,而不是模糊不清。使用彩色打印,因为原始条形码图像是 24 位位图,灰度化可能会使其模糊。在我的激光打印机上,我使用彩色、单面和光栅打印作为选项。
- 如果您将报告部署到另一台远程计算机,请确保您已将
barcodelib
部署到该计算机的报表服务器的 bin 目录。 - 使用 VS2012 时可能存在问题,请参阅 此链接。
本网站上有很多关于条形码主题的其他非常有趣的文章,请留意!
历史
- 2014-09-09:添加了关于 VS2012 嵌入自定义库时问题的提示
- 2014-06-27:添加了更多关于打印条形码的要点细节