如何在 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:添加了更多关于打印条形码的要点细节
