默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟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

转载于:https://www.cnblogs.com/Moosdau/archive/2011/03/31/2001404.html

[条码打印]使用斑马语言(ZPL)打印汉字相关推荐

  1. ZPL打印二维码、汉字

    ZPL打印二维码.汉字 ^XA ^PW3500 ^JMA ^PR2 --打印速度 ^~SD2 --打印浓度 ^LH40,0 ^CI26 --解决中文字符解析不出来 ^FO200,10{1}^XGR:i ...

  2. Windows中使用C语言实现打印彩色文字到命令行窗口

    本文记录的是在Windows中使用C语言自定义一个可以打印彩色文字的printf函数,函数原型如下: int colorful_printf(WORD color, const char* forma ...

  3. PTA L1_002 打印沙漏(C语言)

    PTA L1_002 打印沙漏(C语言) 用C语言打印一个沙漏 一.题目概要 二.题目分析 三.解题思路 (一).给定的字符可以打印几行 (二).剩余的字符数 (三).如何输出沙漏 四.代码一览 五. ...

  4. I00029 C语言程序-打印九九乘法表

    这是小时候背的九九乘法表,是中文版,不是数字版,用C语言程序打印出来了. C语言程序如下: /* I00029 C语言程序-打印九九乘法表 */#include <stdio.h> #in ...

  5. 2016: C语言实验——打印金字塔

    2016: C语言实验--打印金字塔 Description 输入n值,打印下列形状的金字塔,其中n代表金字塔的层数. Input 输入只有一个正整数n. Output 打印金字塔图形,其中每个数字之 ...

  6. c语言打印字符的函数参数,C语言格式化打印函数vsnprintf()的实现

    Linux内核的格式化打印函数是printk(),它与printf()函数是类似的,都是根据格式字符串把可变参数列表转化成字符序列,然后输出到控制台. printf()是打印到标准输出stdout. ...

  7. 【C语言练习——打印空心三角形】

    活动地址:毕业季·进击的技术er 夏日炎炎,热浪中我们迎来毕业季,这是告别,也是迈向新起点的开始.这是一个毕业的月份,每年看到很多毕业生都离校上班,在校生准备考试和暑假实习,都非常感慨,不管怎样,作为 ...

  8. 【C语言练习——打印上三角及其变形(带空格版)】

    活动地址:毕业季·进击的技术er 夏日炎炎,热浪中我们迎来毕业季,这是告别,也是迈向新起点的开始.这是一个毕业的月份,每年看到很多毕业生都离校上班,在校生准备考试和暑假实习,都非常感慨,不管怎样,作为 ...

  9. 【C语言练习——打印空心上三角及其变形】

    活动地址:毕业季·进击的技术er 夏日炎炎,热浪中我们迎来毕业季,这是告别,也是迈向新起点的开始.这是一个毕业的月份,每年看到很多毕业生都离校上班,在校生准备考试和暑假实习,都非常感慨,不管怎样,作为 ...

最新文章

  1. Python 用while 实现循环 到特定条件退出循环(input 输入错误之后重新输入)
  2. 浅谈ThreadPool 线程池(引用)
  3. SSL/TSL双向认证过程与Wireshark抓包分析
  4. HTML怎么把文字分栏_JS将HTML生成PDF并下载
  5. bat 复制文件夹_怎么生成电脑上文件夹的目录结构
  6. leetcode 756. Pyramid Transition Matrix | 756. 金字塔转换矩阵(BFS)
  7. html设置文字超过字数_css限制文字显示字数长度,超出部分自动用省略号显示,防止溢出到第二行...
  8. jaxb 处理_休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程
  9. 使用宝塔部署node项目_使用宝塔面板进行项目的自动部署WebHook
  10. 08-图7 公路村村通 (30 分
  11. 为k8s-master节点添加/移除污点taints
  12. ModelSim6.3 使用教程By Sunev
  13. 一条汇编指令是如何在计算机的硬件中进行执行的
  14. Scrum板与Kanban如何抉择?kxqmoznsc板与按照rlooie
  15. apk软件去广告 傻瓜教程
  16. python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——学霸君
  17. mac连接服务器打不开网页,Mac电脑联接网络但是浏览器打不开网页
  18. [软件人生]各大学的软件工程硕士
  19. winds rsync_Winds —关于对开源软件做出第一贡献的深度教程
  20. 仿基因编程原理导论(里面的几个重要的概念正在做修正,所以这只能算是一个原理的初稿。)

热门文章

  1. 终极的人工智能,会让人类生存还是毁灭?
  2. 网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?
  3. linux服务器下tomcat版本升级
  4. 牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!
  5. 【网申投递汇总】截止目前为止,还可以网申的公司 持续更新
  6. 计算机限制ip访问,如何对某个端口限制IP访问 比如 针对1521端口 只允许某个IP访问Unix系统 -电脑资料...
  7. 价值34万亿的WLAN,如何走好“最后一公里”?
  8. Polyfill是什么?
  9. JSqlParser4.3版本无法解析mysql中JSON_OBJECT函数抛出ParseException异常
  10. windows api 扫雷游戏