惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
C
Cybersecurity and Infrastructure Security Agency CISA
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
S
Securelist
I
Intezer
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
P
Privacy International News Feed
Recent Announcements
Recent Announcements
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
爱范儿
爱范儿
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
WordPress大学
WordPress大学
S
Secure Thoughts
K
Kaspersky official blog
N
News | PayPal Newsroom
O
OpenAI News
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tor Project blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
D
Docker
Hugging Face - Blog
Hugging Face - Blog
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
博客园 - 司徒正美
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
P
Palo Alto Networks Blog

博客园 - 夏狼哉

.Net framework 的浏览器定义文件 Windows按名称排序问题 IE的文档模式, 及Textarea呈现bug一例 SilverLight与WCF服务双工通讯第二篇:Net.Tcp binding SilverLight与WCF服务双工通讯第一篇:PollingDuplexHttpBinding SilverLight通过Net.TCP(NetTCPBinding)方式调用WCF服务 WCF与Asp.Net Web Application的深度整合方法 C#与Outlook交互收发邮件 分布式版本控制系统Mercurial(二):web server的架设 分布式版本控制系统Mercurial(一):Mercurial基本功能介绍 C#将汉字转换为拼音首字母 nbsp空格 VS2010 targetFramework 错误 在网络上共享条码打印机 WCF身份验证之二:使用MessageHeader进行验证 WCF身份验证之一:使用证书进行验证 Windows CE 5.0 Emulator C#打印条码与ZPL 应用程序在网络上通信的实现(C#)
[条码打印]使用斑马语言(ZPL)打印汉字
夏狼哉 · 2011-03-31 · via 博客园 - 夏狼哉

默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟windows里面的字体库肯定不是一回事, 起初我觉得最好能通过上传字体来实现打印汉字, 但是大概研究了一下, 发现这个太复杂, 而且字体库文件也无从搞到, 所以换了方向, 考虑将汉字画成图片, 通过打印图片的方式来实现打印汉字.

所以总的过程为: 将需要打印的汉字在服务器上通过GDI画成图片, 然后将图片按照条码打印机的要求序列化成字符串上传到打印机, 最后通过打印图片命令将其打印出来.

具体的实现方式为:

1. 绘图.

protected Bitmap CreateImage(string data, Font f) 
{ 
    if (string.IsNullOrEmpty(data)) 
        return null; 
    var txt = new TextBox(); 
    txt.Text = data; 
    txt.Font = f; 
    //txt.PreferredSize.Height只能取到一行的高度(连边距) 
    //所以需要乘以行数, 但是必须先减掉边距, 乘了以后,再把边距加上. 
    //5是目测的边距 
    var image = new Bitmap(txt.PreferredSize.Width, (txt.PreferredSize.Height - 5) * txt.Lines.Length + 5); 
    var g = Graphics.FromImage(image); 
    var b = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Black, Color.Black, 1.2f, true); 
    g.Clear(System.Drawing.Color.White); 
    g.DrawString(data, f, b, 1, 1); 
    return image; 
} 

将需要打印的汉字和字体作为参数传入, 即可得到一副图片.

2. 转换并序列化图片.

protected string ConvertImageToCode(Bitmap img) 
{ 
    var sb = new StringBuilder(); 
    long clr = 0, n = 0; 
    int b = 0; 
    for (int i = 0; i < img.Size.Height; i++) 
    { 
        for (int j = 0; j < img.Size.Width; j++) 
        { 
            b = b * 2; 
            clr = img.GetPixel(j, i).ToArgb(); 
            string s = clr.ToString("X");

            if (s.Substring(s.Length - 6, 6).CompareTo("BBBBBB") < 0) 
            { 
                b++; 
            } 
            n++; 
            if (j == (img.Size.Width - 1)) 
            { 
                if (n < 8) 
                { 
                    b = b * (2 ^ (8 - (int)n));

                    sb.Append(b.ToString("X").PadLeft(2, '0')); 
                    b = 0; 
                    n = 0; 
                } 
            } 
            if (n >= 8) 
            { 
                sb.Append(b.ToString("X").PadLeft(2, '0')); 
                b = 0; 
                n = 0; 
            } 
        } 
        sb.Append(System.Environment.NewLine); 
    } 
    return sb.ToString();

} 

这是将图片转换为条码打印机能够支持的点阵图.

3. 通过ZPL将图片上传:

var t = ((img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)) * img.Size.Height).ToString(); 
var w = (img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)).ToString(); 
string zpl = string.Format("~DGR:imgName.GRF,{0},{1},{2}", t, w, imgCode);

其中, img是上述CreateImage函数的返回结果. imgCode是ConvertImageToCode函数的返回结果. imgName是随便起的图片名字.

这样, 就可以通过继续向zpl添加绘图命令来打印汉字了.

例如, 以下一段示例代码:

^XA
^FO10,10
^XGR:imgName.GRF,1,1^FS
^XZ

具体如何将zpl指令发送到打印机, 请参考我以前的一篇文章:

http://www.cnblogs.com/Moosdau/archive/2009/10/16/1584627.html