水晶报表2008 条码打印 扫描

 

前几天项目上用到了水晶报表的条码打印功能

最开始用的字体,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

 

 

你可能感兴趣的:(2008)