首页 新闻 会员 周边 捐助

关于使用C#使用ESC/POS控制小票打印的一段程序完全看不懂,请大牛解释

0
悬赏园豆:80 [已解决问题] 解决于 2013-03-22 10:32

一套餐饮系统原有C#代码,控制POS打印机打印的.

程序是这样的,使用ESC/POS指令控制打印格式,输出是使用.net System.Printing空间的类实现的,如下:

PrintSystemJobInfo newPrintJob = pq.AddJob(task.Name); task.JobNumber = newPrintJob.JobIdentifier; newPrintJob.JobStream.Write(task.Data, 0, task.Data.Length); newPrintJob.JobStream.Close();

task.Data就是指令和打印数据组成的byte[].

为了在一些没有中文字库的打印机上也能打中文,它采用了另外一种与指令不同的方式打印字符串,

大概的思路是从一些定义了很多个数据组的类中取出数据然后用指令以图形的方式打印出来的,我个人理解应该是什么点阵字库之类的吧

这种方式能很好的打印中文字的问题同时又避免使用window驱动打印输出大量图形数据的问题.

现在的问题是这种方式打出来的字颜色有点浅,我想知道怎么样能变粗点或者换大点的字体也行.主要代码如下:

View Code
private Byte[] m_commandBuffer = { 27, 42, 32, 24, 0 }; //指令 设置图形点阵,打印密度

//打印字符串方法
 protected override void PrintString(String textData)
        {
            int messageLength = textData.Length;

            for (int index = 0; index < messageLength; index++)
            {
                Char character = textData[index];
                Byte[] fontBuffer = null;

                fontBuffer = GetGaphicFontPixels(character);

                if (fontBuffer == null)
                {
                    //non printable characters
                    fontBuffer = new Byte[1];
                    fontBuffer[0] = System.Convert.ToByte('?');
                }
                else
                {
                    m_commandBuffer[3] = System.Convert.ToByte(fontBuffer.Length / 3);
                    m_output.Write(m_commandBuffer, 0, m_commandBuffer.Length);
                }

                m_output.Write(fontBuffer, 0, fontBuffer.Length);
            }// loop through all characters
        }

        private Byte[] GetGaphicFontPixels(Char characterCode)
        {
            int fontIndex = 0;
            Byte[] pixelBuffer = null;

            if ((characterCode >= 0x0020) && (characterCode <= 0x00FF))
            {
                //General punctuation
                fontIndex = characterCode - 0x0020;
                pixelBuffer = Font0020_MingLiu_12x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x2000) && (characterCode <= 0x206F))
            {
                //General punctuation
                fontIndex = characterCode - 0x2000;
                pixelBuffer = Font2000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x4E00) && (characterCode <= 0x4FFF))
            {
                fontIndex = characterCode - 0x4E00;
                pixelBuffer = Font4E00_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x5000) && (characterCode <= 0x5FFF))
            {
                fontIndex = characterCode - 0x5000;
                pixelBuffer = Font5000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x6000) && (characterCode <= 0x6FFF))
            {
                fontIndex = characterCode - 0x6000;
                pixelBuffer = Font6000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x7000) && (characterCode <= 0x7FFF))
            {
                fontIndex = characterCode - 0x7000;
                pixelBuffer = Font7000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x8000) && (characterCode <= 0x8FFF))
            {
                fontIndex = characterCode - 0x8000;
                pixelBuffer = Font8000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            else if ((characterCode >= 0x9000) && (characterCode <= 0x9FAE))
            {
                fontIndex = characterCode - 0x9000;
                pixelBuffer = Font9000_MingLiu_24x24.CharacterCode[fontIndex];
            }
            return pixelBuffer;
        }

类似Font2000_MingLiu_24x24 这些类里都定义了很多个十六进制数组.我截取一部分在图片里

问题补充:

次凹, 这么大个cnblogs都没有人会吗

IT屌丝的主页 IT屌丝 | 初学一级 | 园豆:184
提问于:2012-12-03 14:03
< >
分享
最佳答案
0

这是一个24x24 大小的点阵字库。  字体是 mingliu。 24x24是标准大小, 还有16x16的。 其实就是打印一个小小的bitmap

你可以在网上找找工具 可以转换你指定的字库到byte array的。  换个黑体的 文字颜色就深了

收获园豆:30
gunsmoke | 老鸟四级 |园豆:3592 | 2012-12-05 10:10
其他回答(1)
0

16进制的应该都是文字,你可以试着转换成文字以后看下是什么,然后再考虑怎么改,应该就简单了,

收获园豆:25
只会造轮子 | 园豆:2274 (老鸟四级) | 2012-12-05 10:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册