随笔 - 46  文章 - 16 评论 - 1171 trackbacks - 23

.net asp web c# vb VS2005 VS2008 VS2003

    姓名 景春雷
    网名 1-2-3
    生日 1980.2.29
    城市 沈阳
以前只在电影里看到过黑人总统。没想到这么快就变成现实了。 11-6 10:24

与我联系

搜索

 

常用链接

我参与的团队

我的标签

随笔分类(46)

随笔档案(45)

文章分类(15)

相册

收藏夹(2)

积分与排名

  • 积分 - 153816
  • 排名 - 261

最新评论

阅读排行榜

评论排行榜


摘要

本文介绍一个免费的、完整的、very easy 的在Web页和RDLC报表中呈现、打印条码的解决方案。

效果

笔者最近遇到了一个B/S结构的项目,需要在报表中打印条码。效果如下


恰巧,笔者不久前在网上找到了一个免费的条码控件,请见下图


这是由昆明科本软件有限公司推出的一款十分不错的条码控件,支持十余种国际通用的条码格式,生成的图片的大小和样式可调。可以由此下载科本条形码主页,现在已经升级到了1.5版,附带示例工程。(我使用的时候还是1.0版,包括本篇文章的示例代码所使用的也是1.0版控件)。

可惜这个控件只支持Windows程序。我想在Web程序中使用,能办到么?答案是肯定的,因为这个控件非常体贴地提供了一个 MakeImage() 函数,直接使用这个函数就能获得条码图片。哈哈,看过本系列第三篇《动态生成图片》的朋友可能已经心中雪亮了,没错,使用同样的路数就可以将它用在Web程序中了。我为制作了一个示例程序,可以在本文的最后下载。
 
示例程序详解

MyHandler.cs与第三篇看起来差不多,只不过生成图片的工具由 GDI+ 变成了条码控件。为了使用条码控件,需要在 mylib.system.web 类库里添加对条码控件(“barcode.dll”)和System.Windows.Form的引用




为了使用RDLC报表,我们的数据源由第三篇中的数组改成了一个Domain Object:
VisitorTraffic.cs

VisitorTraffic 类的两个属性 website_name 和 visitor_traffic 分别表示网页名称和访问量。静态函数 find_all() 通过硬编码的方式返回3条有用的数据。VisitorTraffic 类放置在Web应用程序的 App_Code 文件夹下。

Default.aspx 中放置一个 GridView 控件和和一个 ReportViewer 控件。在Page_Load() 时初始化这两个控件。
Default.aspx

Default.aspx.cs

GridView 的设置基本保持第三篇的样子没变,在此就不在赘述了。下面着重介绍一下在RDLC报表里呈现条码的方法。在RDLC报表里使用外部图片,需要
    - 在代码中将报表对象的 EnableExternalImages 属性设为 true。
    - 将“图像”控件放置在表控件中。
       
    - 将“图像”控件的“Source”属性设为“External”。
    - 将“图像”控件的“Value”属性设为图片的地址。
    在进行到上面的第四步(将“图像”控件的“Value”属性设为图片的地址)时,麻烦出现了。天杀的比尔居然要求在“Source”属性为“External”的情况下,“Value”必须以 http://, https://, ftp://, file:, mailto:, 或 news: 之一开头。换句话说,不允许我将Value设成 "~/MyHandler.jxd?data="+ Fields!visitor_traffic.Value 这种相对路径。可是我在RDLC里如何能得到 MyHandler.jxd 的完整路径呀?!我曾经试过不用图像控件,直接在“访问量”字段中写 "<img src='~/MyHandler.jxd?data=" + Fields!visitor_traffic.Value + "' />"。期望能骗过RDLC,直接输出IMG标记,结果RDLC十分智能地把所有的“ <”字符全部替换成了&lt;   痛哭十分钟...
    最后只好用了比较龌龊的方法:先在 Default.aspx.cs 中取得 MyHandler.jxd 的完整URL,然后通过报表参数(参数名为barcode_url)传递给RDLC报表对象(Default.aspx.cs 第26~33行)。而图像控件的Value属性就变成:Parameters!barcode_url.Value + Fields!visitor_traffic.Value

下载本篇全部源代码

本系列到此就结束了。我们并没有介绍太多HTTP处理程序的理论知识,对HTTP Handler的利用也仅仅局限于将它作为一个“虚拟页面”,您看得一定十分不过瘾吧 ?HTTP 处理程序的另外一个重要的应用是实现URL重写,Scott Mitchell 的 《URL Rewriting in ASP.NET》对这个主题进行了深入的探讨,并给出了一个完整的解决方案。《ASP.NET 2.0高级编程》一书有对HTTP模块的详细描述,可以在线免费试读。希望本系列可以作为您通往精通HTTP处理技术之路的第一块垫脚石,再见。

本系列共6篇文章
    实战 HTTP 处理程序(HTTP Handler) (6)——条码随意打   <- you are here.
    实战 HTTP 处理程序(HTTP Handler) (5)——不用临时文件,直接打开动态生成的文件
    实战 HTTP 处理程序(HTTP Handler) (4)——与Web程序共享Session
    实战 HTTP 处理程序(HTTP Handler) (3)——动态生成图片
    实战 HTTP 处理程序(HTTP Handler) (2)——向HTTP 处理程序传递参数   
    实战 HTTP 处理程序(HTTP Handler) (1)——创建一个最简单的 HTTP Handler  

 

posted on 2007-09-05 09:11 1-2-3 阅读(4660) 评论(30)  编辑 收藏 网摘 所属分类: 实战HTTP处理程序系列

FeedBack:
#1楼  2007-09-05 09:46 poul [未注册用户]
谢谢楼主的分享,觉得写的很好,希望看到楼主更多的作品出现...
  回复  引用    
#2楼  2007-09-05 09:50 Clark Zheng      
最后一篇终于枪毙了沙发,哈哈
  回复  引用  查看    
#3楼  2007-09-05 09:50 Clark Zheng      
无语。。。
  回复  引用  查看    
#4楼  2007-09-05 10:15 邓林海      
条码,不错
  回复  引用  查看    
#5楼  2007-09-05 10:28 idzi [未注册用户]
正在找这方面的东西呢……谢谢LZ分享
  回复  引用    
#6楼  2007-09-05 12:35 hehe      
如果MakeImage() 函数能将传递过去的数字实时生成条码图片的话,那么用水晶报表也可以完全实现.只需要定义一个包含大二进制对象的dataset,呈现时,动态生成条码图片然后转换成二进制赋值对象,最后将dataset抛给水晶报表就行了.
  回复  引用  查看    
#7楼  2007-09-05 12:36 过江      
你可以打印出来,可是你能读入系统么?
  回复  引用  查看    
#8楼  2007-09-05 12:42 hehe      
其实打印条码,在水晶报表下有个最简单的方法就是装barcode字体,装上后,在报表里设置一下显示控件的的属性就可以了.呈现时绝对时标准barcode.
不过这种方式对客户端有一定的要求(需要装这种字体),而且不知道在webform上行不行,没试过.
  回复  引用  查看    
#9楼  2007-09-05 12:44 hehe      
to 过江
当然可以读入系统了.
用扫描器就可以了,生产上都是这样用的啊!
  回复  引用  查看    
#10楼 [楼主] 2007-09-05 14:10 1-2-3      
@hehe
没错,其实RDLC也可以通过字段读取二进制的图片数据,然后使用Database类型的图片显示出来,这样会更简单。不过如果希望 Domain Object “干净些”的话,还是弄个专门的提供条码服务的模块比较好。
  回复  引用  查看    
#11楼 [楼主] 2007-09-05 14:26 1-2-3      
@hehe
我们没有找到免费的条码字体。要钱的条码字体也试用过,要求每个客户端都必须安装同一款条码字体,否则条码会显示不出来。
  回复  引用  查看    
#12楼 [楼主] 2007-09-05 14:27 1-2-3      
@过江
我们测试过,可以用扫描器扫描的。
  回复  引用  查看    
#13楼  2007-09-05 14:36 魔佛之间      
我们都使用下面的条码字体,简单明了通用。打开报表时会自动下载字体,所以安装也不是问题。

C39324L4.TTF
C39336L3.TTF
  回复  引用  查看    
#14楼 [楼主] 2007-09-05 15:11 1-2-3      
@魔佛之间
在哪里可以下载呀?共享一下,谢谢。
  回复  引用  查看    
#15楼  2007-09-05 15:16 Hunter [未注册用户]
我不知道你们在WEB 页面上打印出来后, 有没有用扫描枪扫过. 大部分的WEB 出来的条码, 会变形, 不能被扫描枪识别的. 在2006 年初的时候我使用过很多方法, 都没有成功.
  回复  引用    
#16楼 [楼主] 2007-09-05 15:26 1-2-3      
@Hunter
我们主要使用RDLC报表导出PDF文件,然后打印这个PDF文件,扫描没问题的。有一个程序使用这个方法已经使用了近半年了,没有接到扫描不了的反馈。
  回复  引用  查看    
#17楼  2007-09-05 16:02 Hunter [未注册用户]
导出PDF 是可以实现的. 我当时是想使用WEB 的直接打印, 或者在WEB 页做个按钮一点直接打印条码, 不希望有中间的过程. 所以一直没有找到好的解决办法.
  回复  引用    
#18楼  2007-09-05 20:38 hehe      
to Hunter
楼主好像在第一篇,解决了你的问题.
to 1-2-3
后来我看了下,原来那个字体确实是公司卖的.
确实很感谢你写的文章.
  回复  引用  查看    
#19楼  2007-09-05 21:21 静水≈深流      
好文 学习ing
  回复  引用  查看    
#20楼  2007-11-26 16:05 Leo.fan [未注册用户]
楼主:

能不能提供一个C/S下的例子呢?是那种连续打印或多张的.
多谢你的分享.

  回复  引用    
#21楼 [楼主] 2007-11-26 16:26 1-2-3      
@Leo.fan
在CS程序中因为不能使用HTTP Handler所以不能使用本文的方法,但是可以通过字段读取二进制的图片数据,然后使用Database类型的图片显示出来。今天快下班了,明天我会传一个例子上来。
  回复  引用  查看    
#22楼 [楼主] 2007-11-27 11:44 1-2-3      
@Leo.fan
我把WinForm的DEMO放在这了,有什么问题再联系!
source7.rar

运行,直接点击“生成报表”即可看到效果了。

  回复  引用  查看    
#23楼  2008-01-09 09:06 ruan [未注册用户]
非常感谢楼主提供的这些资料,我自己的项目问题解决了,但是我发布到网络上的时候,会出错,后来,公司网管根据出错显示的提示,把需要的dll文件都上传到bin文件夹里,总算可以运行了。
但是又遇到一个问题,运行可以了,但条码图显示不出来,我一直以为是服务器的问题。后来我本机运行(关掉net05开发环境,从iis调用),一样出现条码图显示不了的问题。可从net05里面运行,又可以。不知何解?
  回复  引用    
#24楼 [楼主] 2008-01-09 09:53 1-2-3      
@ruan
您的问题我没有遇到过。
根据您的描述:“IIS运行程序不出现条码,而使用VS的调试环境可以显示条码”可以初步判定问题是出在程序发布这一块。
您可以试试这样调试:
首先建立一个空的测试用的页面,在上面放一个button,两个Textbox
然后在Button1的Click事件里,写如下代码:
BarcodeControl barcode = new BarcodeControl();
barcode.BarcodeType = BarcodeType.CODE128B;
TextBox1.Text = barcode.BarcodeType.ToString(); // 看看barcode 对象是否能正常装载
barcode.Data = "123";

MemoryStream stream = new MemoryStream();
barcode.MakeImage(ImageFormat.Png, 1, 50, true, false, null, stream);

TextBox2.Text = stream.Length.ToString(); // stream.Length 不为0说明生成图片没问题
stream.Close();

编译后发布到IIS里面,浏览这个测试用的页面,看看结果如何。如果还是不行请再联系!
  回复  引用  查看    
#25楼  2008-01-25 10:25 ruan [未注册用户]
很感谢楼主的回复,由于年底事情太多,所以一直没有时间上来看您的回复
我按照楼主的方法,但是不明白BarcodeControl、MemoryStream是什么类?
项目里找不到该类
不知道要去哪里引用,请指教

对了,而且我也下载了楼主的“本篇全部源代码”这个案例
运行了source6\WebSites\HttpHandlerDemo这个例子(我的项目是按照该案例做的)
但结果也是一样。从iis下运行不能生成条码图,页面其他都可以运行生成并显示。
但从net项目中调用,是没问题的

我百思不得其解,往楼主帮我指点迷津

为了更好的交流,请楼主看到留言,希望能跟我联系下
我的QQ:20669309 注:条码随意打

再次感谢楼主对我的回复及帮助
  回复  引用    
#26楼 [楼主] 2008-01-25 10:33 1-2-3      
@ruan
BarcodeControl 是条码控件,我把它放在了WebSites\项目文件夹\bin\了;MemoryStream是.net提供的一个用于创建支持存储区为内存的流的类。
你的问题真的很奇怪,我在QQ中加你了,再详细聊聊。
  回复  引用  查看    
#27楼 [楼主] 2008-01-25 11:46 1-2-3      
ruan的问题找到原因了。因为本文提供的示例项目所使用的是“MyHandle.jxd”。而“jxd”这个扩展名在IIS里默认是没有注册的,所以就造成了在VS2005里运行能显示条码,可是发布到IIS里就不好用了。

解决的方法有2种:
1. 把Web.config里的“MyHandle.jxd”改为“MyHandle.ashx”,然后把页面里面所有的“MyHandle.jxd”都改为“MyHandle.ashx”。(原理请看《实战 HTTP 处理程序(HTTP Handler)(1) 》第28楼的总结。

2. 发布后,在IIS里注册“jxd”这个扩展名。方法请见 《实战 HTTP 处理程序(HTTP Handler)(1) 》正文。
  回复  引用  查看    
出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar

  回复  引用    
#29楼  2008-05-09 11:09 田斌 [未注册用户]
高手我的QQ:48010724我想问几个关于条形码的问题
  回复  引用    
#30楼 [楼主] 2008-05-09 21:13 1-2-3      
@田斌
刚刚加了你了。
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-08 13:54 编辑过