前几天项目上用到了水晶报表的条码打印功能
最开始用的字体,code39 code128都试了,可以正常打印,但是扫描枪不识别,
据说code39值两边加*可以扫描到,我没能成功
又在网上找到以下方法,可以打印和扫描。
大致思路是:用一个程序文件生成条码图片(此例规则是Code39,参数Code是要生成条码的值),
然后在报表页面加入一个图片控件,再用该图片控件动态抓取条码图片,显示到报表控件上。
Code39Handler.ashx
就是生成条码图片的文件,参数是Code,加到项目里面,直接访问文件就能看到生成的条码图片,
例如:http://localhost/..../Code39Handler.ashx?Code=123456
代码:
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
/// <summary>
/// 用 .NET 繪圖 API,搭配條碼最普遍的 Code 39 編碼規則 (一般超商的讀條碼機都可讀),產生條碼圖檔
/// </summary>
public class Code39Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
//context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");
//Logic to retrieve the image file
//context.Response.ContentType = "image/jpeg";
//context.Response.WriteFile("MyImage01.jpg");
string mycode = context.Request["code"];
string 字串;
string 字元;
//字串 = "*-%$*"
字串 = "*" + mycode + "*"; //Code 39 的特性是前、後置碼會標識「星號(*)」,表示開始和結束
int 畫布高 = 35;
int 畫布寬 = 0;
int 筆x = 0;
int 筆y = 20;
//int 筆寬 = 0;
if (!string.IsNullOrEmpty(mycode))
{
畫布寬 = 字串.Length * 13;
Bitmap BMP = new Bitmap(畫布寬, 畫布高, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics G = Graphics.FromImage(BMP);
G.TextRenderingHint = TextRenderingHint.AntiAlias;
G.Clear(Color.White);
Brush 筆刷1 = new SolidBrush(Color.White);
G.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
G.FillRectangle(筆刷1, 0, 0, 畫布寬, 畫布高);
for (int i = 0; i < 字串.Length; i++)
{
//取得 Code 39 碼的規則
字元 = this.genBarcode(字串.Substring(i, 1).ToUpper());
for (int j = 0; j < 4; j++)
{
if (字元.Substring(j, 1).Equals("0"))
{
G.DrawLine(Pens.Black, 筆x, 0, 筆x, 筆y);
}
else
{
G.DrawLine(Pens.Black, 筆x, 0, 筆x, 筆y);
G.DrawLine(Pens.Black, 筆x + 1, 0, 筆x + 1, 筆y);
筆x += 1;
}
筆x += 1;
if (字元.Substring(j + 5, 1).Equals("0"))
{
G.DrawLine(Pens.White, 筆x, 0, 筆x, 筆y);
}
else
{
G.DrawLine(Pens.White, 筆x, 0, 筆x, 筆y);
G.DrawLine(Pens.White, 筆x + 1, 0, 筆x + 1, 筆y);
筆x += 1;
}
筆x += 1;
} //end of loop
if (字元.Substring(4, 1).Equals("0"))
{
G.DrawLine(Pens.Black, 筆x, 0, 筆x, 筆y);
}
else
{
G.DrawLine(Pens.Black, 筆x, 0, 筆x, 筆y);
G.DrawLine(Pens.Black, 筆x + 1, 0, 筆x + 1, 筆y);
筆x += 1;
}
筆x += 2;
} //end of loop
int x = 0;
int addx = 13;
G.DrawString("-", new Font("Arial", 10, FontStyle.Italic), SystemBrushes.WindowText, new PointF(x, 20));
x += addx;
for (int k = 0; k < mycode.Length; k++)
{
G.DrawString(mycode.Substring(k, 1), new Font("Arial", 10, FontStyle.Italic), SystemBrushes.WindowText, new PointF(x, 20));
x = x + addx;
}
G.DrawString("-", new Font("Arial", 10, FontStyle.Italic), SystemBrushes.WindowText, new PointF(x, 20));
BMP.Save(context.Response.OutputStream, ImageFormat.Jpeg);
G.Dispose();
BMP.Dispose();
}
else
{
畫布寬 = 100;
Bitmap BMP = new Bitmap(畫布寬, 畫布高, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics G = Graphics.FromImage(BMP);
G.TextRenderingHint = TextRenderingHint.AntiAlias;
G.Clear(Color.White);
//未給參數時顯示的提示內容
G.DrawString("無條碼產生", new Font("宋体", 12, FontStyle.Regular), SystemBrushes.WindowText, new PointF(0, 20));
BMP.Save(context.Response.OutputStream, ImageFormat.Jpeg);
G.Dispose();
BMP.Dispose();
}
}
// 規則可參考網址 1:http://blog.csdn.net/xuzhongxuan/archive/2008/05/28/2489358.aspx
// 規則可參考網址 2:http://blog.163.com/zryou/blog/static/6903184200971704226450/
/// <summary>
/// Code 39 碼的規則。
/// Code 39 碼可使用的字元如下:0~9、A~Z、+、-、*、/、%、$、. 及空白字元。
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public string genBarcode(string code)
{
switch (code)
{
case "0":
code = "001100100";
break;
case "1":
code = "100010100";
break;
case "2":
code = "010010100";
break;
case "3":
code = "110000100";
break;
case "4":
code = "001010100";
break;
case "5":
code = "101000100";
break;
case "6":
code = "011000100";
break;
case "7":
code = "000110100";
break;
case "8":
code = "100100100";
break;
case "9":
code = "010100100";
break;
case "A":
code = "100010010";
break;
case "B":
code = "010010010";
break;
case "C":
code = "110000010";
break;
case "D":
code = "001010010";
break;
case "E":
code = "101000010";
break;
case "F":
code = "011000010";
break;
case "G":
code = "000110010";
break;
case "H":
code = "100100010";
break;
case "I":
code = "010100010";
break;
case "J":
code = "001100010";
break;
case "K":
code = "100010001";
break;
case "L":
code = "010010001";
break;
case "M":
code = "110000001";
break;
case "N":
code = "001010001";
break;
case "O":
code = "101000001";
break;
case "P":
code = "011000001";
break;
case "Q":
code = "000110001";
break;
case "R":
code = "100100001";
break;
case "S":
code = "010100001";
break;
case "T":
code = "001100001";
break;
case "U":
code = "100011000";
break;
case "V":
code = "010011000";
break;
case "W":
code = "110001000";
break;
case "X":
code = "001011000";
break;
case "Y":
code = "101001000";
break;
case "Z":
code = "011001000";
break;
case "*":
code = "001101000";
break;
case "-":
code = "000111000"; //好像辨識不出來
break;
case "%":
code = "100101000"; //好像辨識不出來
break;
case "$":
code = "010101000"; //好像辨識不出來
break;
default:
code = "010101000"; //都不是就印 $
break;
}
return code;
}
public bool IsReusable {
get {
return false;
}
}
}
把文件加到项目里,打开加好图片控件的报表,右击图片控件,选择[设置对象格式]---[图片]选项卡,最下面有[图形位置]一栏,打开, 下面最大空白框里就写刚才访问Code39Handler.ashx的路径就行。到这里基本就完成了,也可以有很多补充的。。。。。。
注意:
vs自带的报表图片控件是没有【图形位置】这一项的。
一定要把报表装到vs里,否则不显示条码,会显示原图片
CrystalReports2008 下载链接,用浏览器下载老会断...何解?? 用迅雷下载就好好的
https://smpdl.sap-ag.de/~sapidp/012002523100009989492010E/cr2008_sp3_fullbuild.zip
密钥: CFKOA-YOTTM2M-OOUFAFF-N43M
注册号: 6707437608
原文链接:http://www.cnblogs.com/WizardWu/archive/2010/09/14/1825523.html
分享到:
相关推荐
总的来说,这个压缩包提供了一种使用水晶报表进行二维码和条形码打印的方法,这对于制造业和其他需要跟踪和记录产品信息的行业来说非常有用。通过学习和应用这些源码,开发者能够提升他们的报表设计和打印能力,满足...
在本文中,我们将深入探讨如何在C#中利用水晶报表(Crystal Reports)打印二维码和Code128条形码。这个示例项目“DemoQrCode”提供了完整的代码和资源,使得开发者可以直接运行并学习相关功能。 首先,让我们了解...
在本主题中,我们主要关注的是如何在水晶报表中集成二维码,以及与之相关的Code128和Ean-13条形码格式。 二维码(Quick Response Code)是二维条形码的一种形式,它可以存储大量的信息,如网址、文本、联系信息等,...
总的来说,水晶报表提供了一种灵活且强大的方法来生成和打印条形码,配合特定的条码字体,可以满足各种业务场景下的条码需求。无论是Code 39还是Code 128,只需简单的几步操作,我们就能在报表中生成清晰可读的条码...
在IT行业中,条形码打印是一项重要的技术应用,特别是在物流、零售、仓储管理等领域。"打印控件 条码打印 条码打印(含原代码)"这个标题表明我们将讨论如何利用特定的打印控件来实现条形码的生成与打印,并且提供了...
在IT行业中,条形码和二维码是数据交换与识别的重要工具,特别是在物流、仓储、零售等领域。Code128条码是一种高密度的条码标准,可以编码所有的128个ASCII字符,包括数字、字母和一些特殊字符。在本项目中,我们将...
在水晶报表中,我们可以利用两个关键函数来生成一维码:一个是编码函数,它将文本信息转换为条形码格式;另一个是字体函数,提供特定的一维码字体,如Code128或EAN13,使得打印机能够正确地打印出条形码。具体操作...
4. **水晶报表**:在报表设计中,水晶报表(Crystal Reports)支持添加条形码字段,这使得在报表生成时动态插入条形码成为可能。 5. **PDF417和QR码**:除了传统的线性条形码,还有二维条码如PDF417和QR码。这些更...
VS2008水晶报表中条码打印字体c39hrp24dhtt.ttf,在前后加入*后便可实现一维条码扫描。
常用的39码 条码字型,Font字体。自己一直在用的,打印、扫描都很好用。 将文件拷贝到C:\windows\fonts下
QR码是一种二维条形码,广泛用于存储网址、文本、联系信息等,便于快速扫描和读取。 描述中提到“基于Oracle9i的水晶报表9开发中使用QRCode的调查分析”,意味着该调查深入探讨了如何在早期版本的Oracle数据库系统...
1062 利用条形码销售商品 635 23.3 其他 636 1063 简易摄像头程序 636 1064 超市摄像头定时监控系统 638 1065 利用短信猫收发短信息 639 1066 利用短信远程关闭计算机 641 1067 短信息采集烟草销售数据...
条形码是一种广泛使用的自动识别技术,它将数据编码为一系列黑白相间的线条,通过扫描设备读取并解码为数字或字母信息。在C#中,生成条形码通常涉及以下步骤: 1. 选择条形码类型:常见的有Code 39、Code 128、EAN-...
实例040 打印条形码 141 实例041 打印学生个人简历 145 实例042 打印商品入库单据 148 实例043 批量打印学生证书 150 实例044 动态绑定水晶报表 153 实例045 设计信封标签报表 157 实例046 设计...
4. 收银结算:收银台功能包括扫描条形码、计算总价、打印小票等。这涉及到与硬件设备的交互,如条形码扫描器和打印机。C#提供丰富的设备驱动支持,通过COM接口或.NET Framework的System.IO.Ports命名空间实现串口...
实例040 打印条形码 141 实例041 打印学生个人简历 145 实例042 打印商品入库单据 148 实例043 批量打印学生证书 150 实例044 动态绑定水晶报表 153 实例045 设计信封标签报表 157 实例046 设计汇款单...