一种阿拉伯语在POS机上打印的实现方法
技术领域
本发明涉及嵌入式设备领域,尤其是一种阿拉伯语在POS机上打印的实现方法。
背景技术
名词解释:
POS:pointofsale,销售终端;
非等宽字体:类似阿拉伯语这种每个字符的宽度不同的字体。
目前POS平台使用的打印机主要有两种,针式打印机和热敏打印机。这两种POS打印机仍然采用了传统的点阵字体打印方式,以提取的点阵字体作为打印字模。考虑到点阵字体不能随意改变大小的情况,传统的点阵字体打印方式,一般事先选取好基准大小的字库,然后通过放大或缩小算法来对这些基准字库进行变形,从而得到所需大小的字体。传统的打印单据的格式一般由客户定制,所以可以通过定制的修改来达到比较好的打印结果。
但是随着POS领域客户群体的扩大,打印单据的排版格式需求在变化,新的语种需求也在增加。传统的点阵字体打印单据方式,已不能满足客户的需求。
首先,传统的点阵字体打印方式一般只能打印等宽字体,如果用来打印阿拉伯语这类非等宽字体,会在放大的时候出现曲线变形或者出现锯齿,从而影响实际的打印效果。
其次,由于点阵字体不能随意改变大小,传统的点阵字体打印方式,在打印含不同大小的字体的单据时,需要存储多种字体文件或者是通过放大或缩小算法来实现,不够方便且会占用较多的资源。
再者,POS机在实际打印单据时,会出现阿拉伯语与非阿拉伯字符(如英文或数字)需要打印在同一行的情况。由于阿拉伯语与英文或数字的显示方向相反,为了避免打印出现混乱,传统的点阵字体打印方式,需要对待打印字符串中单个字符信息的位置进行定位(须先依次访问每个字符来获取其大小,而且在显示方向翻转的时候也要再次获取每个字符的大小),将阿拉伯语与非阿拉伯字符区分开来,十分麻烦且会导致打印效率变低。
发明内容
为了解决上述技术问题,本发明的目的是:提供一种打印效果好、方便、占用资源少、简单和打印效率高的阿拉伯语在POS机上打印的实现方法。
本发明解决其技术问题所采用的技术方案是:一种阿拉伯语在POS机上打印的实现方法,包括:
A、根据阿拉伯语连写与变形规则对待打印字符串数据进行变换,从而得到新字符串;
B、对新字符串进行预处理,从而将新字符串中连续的非阿拉伯字符部分水平翻转;
C、采用freetype库构建矢量字体的对象实例,并根据打印单据的宽度请求存储缓冲区;
D、采用改进的单个字符位图水平翻转变形规则对预处理后的字符串进行位图信息提取,并将提取的位图信息存储至存储缓冲区;
E、对存储缓冲区中的数据进行整体水平翻转处理,并将水平翻转处理后的存储缓冲区数据发送给打印机进行打印。
进一步,所述步骤A,其包括:
A1、根据阿拉伯语连写规则对待打印字符串数据进行连写变换处理,从而得到连写变换后的字符串;
A2、根据阿拉伯语变形规则对连写变换后的字符串进行变形变换处理,从而得到变换后的新字符串。
进一步,所述步骤A1,其包括:
A11、判断待打印字符串数据中第i个字符是否同时满足其前面一个字符存在且后面一个字符属于连写字符集,若是,则执行步骤A12,反之,则转至步骤A13,所述i为自2开始的自然数,且2≤i≤length,所述length为待打印字符串的总长度;
A12、判断第i个字符的前面一个字符是否属于变形前置字符集,若是,则将第i个字符变为连写字符集1中的对应字符,反之,则将第i个字符变为连写字符集0中的对应字符;
A13、判断i是否满足i≤length,若是,则执行i++,然后返回步骤A11,反之,则转至步骤A2。
进一步,所述步骤A2,其包括:
A21、判断连写变换后的字符串中第m个字符的前面一个字符或后面一个字符是否属于变形字符集,若是,则执行步骤A22,反之,则转至步骤A23,所述m为自1开始的自然数,且1≤m≤length;
A22、根据判断的结果将第m个字符修正为变形字符集中对应的新unicode编码;
A23、判断m是否满足m≤length,若是,则执行m++,然后返回步骤A21,反之,则转至步骤B。
进一步,所述步骤B,其具体为:
遍历新字符串,寻找新字符串中是否存在着连续的非阿拉伯字符部分,若存在,则将该部分中所有字符的位置进行水平翻转并使新字符串中其余部分字符的位置保持不变;反之,则使新字符串中所有字符的位置保持不变。
进一步,所述步骤D,其包括:
D1、根据预设的字符位图变形规则,对预处理后的字符串中当前字符的字符位图进行水平翻转;
D2、对水平翻转处理后的当前字符进行位图信息提取;
D3、将提取的当前字符位图信息存储至存储缓冲区;
D4、判断当前字符是否为预处理后的字符串中的最后一个字符,若是,则执行步骤E;反之,则以下一个字符作为新的当前字符后返回步骤D1。
进一步,所述步骤D2,其具体为:采用freetype库设置位图的大小和渲染方式,然后根据设置的结果对水平翻转处理后的当前字符进行位图信息提取。
进一步,所述设置的渲染方式为默认的256灰阶渲染方式或改进的256灰阶渲染方式。
本发明的有益效果是:通过freetype库引入矢量字体进行操作,避免了点阵字体打印阿拉伯语在放大的时候出现曲线变形或者出现锯齿的情况,打印效果较好,解决了传统POS机利用点阵字体打印阿拉伯语效果不好的缺陷;矢量字体能自由变换大小,在打印不同大小字体时,只需要下载一份矢量字体文件,无需存储多种字体文件或者是通过放大或缩小算法来实现打印,方便且占用的资源较少;在进行位图信息提取前,先对字符串中连续的非阿拉伯字符部分进行水平翻转,然后在提取位图信息时进行统一处理,不用再区分阿拉伯语与非阿拉伯字符,简单且打印效率较高。
附图说明
下面结合附图和实施例对本发明作进一步说明。
图1为本发明一种阿拉伯语在POS机上打印的实现方法的步骤流程图;
图2为本发明步骤A的流程图;
图3为本发明步骤A1的流程图;
图4为本发明步骤A2的流程图;
图5为本发明步骤B的流程图;
图6为本发明步骤D的流程图;
图7为本发明的整体算法流程图。
具体实施方式
参照图1,一种阿拉伯语在POS机上打印的实现方法,包括:
A、根据阿拉伯语连写与变形规则对待打印字符串数据进行变换,从而得到新字符串;
B、对新字符串进行预处理,从而将新字符串中连续的非阿拉伯字符部分水平翻转;
C、采用freetype库构建矢量字体的对象实例,并根据打印单据的宽度请求存储缓冲区;
D、采用改进的单个字符位图水平翻转变形规则对预处理后的字符串进行位图信息提取,并将提取的位图信息存储至存储缓冲区;
E、对存储缓冲区中的数据进行整体水平翻转处理,并将水平翻转处理后的存储缓冲区数据发送给打印机进行打印。
其中,将新字符串中连续的非阿拉伯字符部分水平翻转,是指直接将连续的数字块或英语块等非阿拉伯字符部分进行水平翻转,其它部分的位置保持不变。改进的单个字符位图水平翻转变形规则,是指以单个字符的字符位图为单位进行水平翻转(即进行矩阵翻转变换)。
其中,采用freetype库构建矢量字体库的对象实例是指,采用freetype库中支持阿拉伯文的开源字库tahoma.ttf库来构造字体库对象实例。构建好字体库对象实例后,读取字体文件时就可以根据字体文件中的索引信息从字体库中查找到待打印字符串的编码。
本发明先对字符串中连续的非阿拉伯字符部分进行了水平翻转,然后通过矩阵翻转变换一次性提取位图信息,无需再像传统的点阵字体打印单据方式那样多次提取位图信息进行长度判断,提高了处理效率,且操作更加方便。
参照图2,进一步作为优选的实施方式,所述步骤A,其包括:
A1、根据阿拉伯语连写规则对待打印字符串数据进行连写变换处理,从而得到连写变换后的字符串;
A2、根据阿拉伯语变形规则对连写变换后的字符串进行变形变换处理,从而得到变换后的新字符串。
参照图3,进一步作为优选的实施方式,所述步骤A1,其包括:
A11、判断待打印字符串数据中第i个字符是否同时满足其前面一个字符存在且后面一个字符属于连写字符集,若是,则执行步骤A12,反之,则转至步骤A13,所述i为自2开始的自然数,且2≤i≤length,所述length为待打印字符串的总长度;
A12、判断第i个字符的前面一个字符是否属于变形前置字符集,若是,则将第i个字符变为连写字符集1中的对应字符,反之,则将第i个字符变为连写字符集0中的对应字符;
A13、判断i是否满足i≤length,若是,则执行i++,然后返回步骤A11,反之,则转至步骤A2。
根据阿拉伯语连写变换规则,在进行连写变换时,本发明先根据第i个字符相邻两字符(第i-1个字符和第i+1个字符)的具体情况判断是否需要进行连写变换,若需要,则再根据前面一个字符是否属于变形前置字符集将第i个字符变换为连写字符集0或1中的对应字符。其中,连写字符集0为现有阿拉伯语连写变换规则所规定的数组0,而连写字符集1为现有阿拉伯语连写变换规则所规定的数组1。连写字符集0或1中的对应字符(即unicode编码),可以从事先给出的连写变换对照表中查询到。
参照图4,进一步作为优选的实施方式,所述步骤A2,其包括:
A21、判断连写变换后的字符串中第m个字符的前面一个字符或后面一个字符是否属于变形字符集,若是,则执行步骤A22,反之,则转至步骤A23,所述m为自1开始的自然数,且1≤m≤length;
A22、根据判断的结果将第m个字符修正为变形字符集中对应的新unicode编码;
A23、判断m是否满足m≤length,若是,则执行m++,然后返回步骤A21,反之,则转至步骤B。
根据阿拉伯语变形变换规则,变形变换可分为前连变换front(前面一个字符属于变形前置字符集1),后连变换last(后面一个字符属于变形后置字符集2),中间变换middle(前面一个字符属于变形前置字符集1,后面一个字符属于变形后置字符集2)和单独变换alone(前面一个字符不属于变形前置字符集1,后面一个字符不属于变形后置字符集2)这四种情况。在进行变形变换时,本发明根据第m个字符相邻两字符(第m-1个字符和第m+1个字符)的具体情况将第i个字符修正为变形字符集中对应的新unicode编码。其中,变形字符前置集1和变形字符集2为现有阿拉伯语变形变换规则所规定的集合1和集合2。新unicode编码可以从事先给出的变形变换对照表中查询到。
参照图5,进一步作为优选的实施方式,所述步骤B,其具体为:
遍历新字符串,寻找新字符串中是否存在着连续的非阿拉伯字符部分,若存在,则将该部分中所有字符的位置进行水平翻转并使新字符串中其余部分字符的位置保持不变;反之,则使新字符串中所有字符的位置保持不变。
图5中,k与flag均为自1开始的自然数,且2≤k≤length,0≤flag≤k。
参照图6,进一步作为优选的实施方式,所述步骤D,其包括:
D1、根据预设的字符位图变形规则,对预处理后的字符串中当前字符的字符位图进行水平翻转;
D2、对水平翻转处理后的当前字符进行位图信息提取;
D3、将提取的当前字符位图信息存储至存储缓冲区;
D4、判断当前字符是否为预处理后的字符串中的最后一个字符,若是,则执行步骤E;反之,则以下一个字符作为新的当前字符后返回步骤D1。
本发明在进行位图信息提取时,根据预设的变形规则对预处理后的字符串逐个进行水平翻转、位图信息提取和存储处理,具体过程为:
先根据预设的变形规则对预处理后的字符串中首个字符的位图进行水平翻转和位图信息提取,然后将翻转后的首个字符位图信息存储至存储缓冲区中,并重复上述过程,直至预处理后的字符串中最后一个字符翻转后的位图信息存储至缓冲区中。
进一步作为优选的实施方式,所述步骤D2,其具体为:采用freetype库设置位图的大小和渲染方式,然后根据设置的结果对水平翻转处理后的当前字符进行位图信息提取。
进一步作为优选的实施方式,所述设置的渲染方式为默认的256灰阶渲染方式或改进的256灰阶渲染方式。
其中,默认的256灰阶渲染方式是指FT_RENDER_MODE_MONO渲染方式,而改进的256灰阶渲染方式是指,将256灰阶渲染方式中像素点中色阶信息为255的点取出。
下面结合说明书附图对本发明的具体实施例作进一步详细说明。
实施例1
该实施例主要介绍本发明阿拉伯语连写与变形规则的算法流程图。
本发明对待打印字符串进行变化处理,主要是变形及连写规则的变换,其中连写规则的优先级较高。
本发明阿拉伯语连写与变形规则的算法流程如下:
(1)根据连写规则进行变换,对需连写字符string[i]进行变换,1≤i≤length。
对于string[i],如果string[i-1]存在且string[i+1]属于连写字符集,则string[i]需要连写变换,反之则不需要连写变换,且string[i]的连写变换又分为以下两种情况:
若string[i-1]属于变形前置字符集,则string[i]=Arabic_TogetherChar_Set[char_id][1];
否则,string[i]=Arabic_TogetherChar_Set[char_id][0]。上述赋值语句的含义是根据实际情况将string[i]变化到连写字符集0或1中的对应字符中。
(2)根据阿拉伯语变形规则,对需变形字符string[m]进行变换,1≤m≤length。进行变形变换又可以分为以下四种情况:
若string[m]前面字符属于变形前置字符集1,后面字符不属于变形后置字符集2,则string[m]=Arabic_Transformation_Set[char_id][front];
若string[m]前面字符不属于变形前置字符集1,后面字符属于变形后置字符集2,则string[m]=Arabic_Transformation_Set[char_id][last];
若string[m]前面与后面字符均属于变形字符集,则
string[m]=Arabic_Transformation_Set[char_id][middle]
若string[m]前面与后面字符均不属于变形字符集,则
string[m]=Arabic_Transformation_Set[char_id][alone]。
上述赋值语句的含义是根据实际情况将string[m]变化到front、last、middle和alone这四种情况的对应unicode编码中。
实施例2
该实施例主要介绍字体的大小与粗细调节及斜体字是如何实现的。
由于freetype库默认的渲染方式为256灰阶,当我们打印小号的字体时,可能导致字体模块模糊不清,缩成一个块,因此需要修改渲染方式,从而可以修正字体的轮廓粗细,以提高打印字迹的分辨率。此时,可以在提取字符的位图信息时设置采用FT_RENDER_MODE_MONO渲染方式。而对于更小的字体而言,可以将256灰阶渲染方式中将像素点的色阶信息为255的点取出,这样可以达到轮廓的细度仅为一个像素点,从而达到最高的视觉分辨率。
至于斜体字,则可以通过调用freetype的FT_Set_Transform函数来实现,具体的指令如下:
FT_Set_Transform(ftFace,matrix,pen),其中,ftFace和pen分别为变化前后的face对象,matrix为二维变换矩阵。
实施例3
该实施例主要介绍字体的排版布局。
由于阿拉伯语与英文或数字的显示方向是相反的,因此若采用传统的点阵字体打印方式,对字符串中单个字符信息的位置定位将会变得十分麻烦。因为其需要多次提取位图信息进行长度判断(必须先依次访问单个字符获取其大小,而且在显示方向翻转的时候也要再次获取每个字符的大小),从而导致打印效率变低。
为了解决上述问题,本发明结合矩阵变换与freetype库提供的变形函数提出了一种新的方法,可以有效地提高处理效率。
假设待打印字符为asd123pdf(这里用英文表示阿拉伯语,实际上英文和数字均是正常从左向右显示的,而阿拉伯语是从左向右显示的),因此其目标打印的结果应为fdp123dsa。本发明采取的具体方法为:在处理位图信息前直接将连续的数字块或英文块进行顺序的水平翻转,其它部分的位置保持不变,即首先将asd123pdf变换为asd321pdf,而后在提取位图信息的时就不用区分数字与阿拉伯字符了,直接对asd321pdf进行统一处理即可。而在提取位图信息时,本发明通过利用freetype库的字符变形规则将单个字符的位图进行水平翻转,当所有字符信息全部放至存储缓冲区buffer后,在打印的时将buffer再次进行整体水平翻转打印,即可获得最终的目标打印结果fdp123dsa。该方法的优点在于,无需多次提取位图信息进行长度判断,而是利用了矩阵翻转与freetype库提供的字形变换接口达到正确的显示方向,提高了处理效率。
为了更好说明本发明的原理,下面以英文字符(这里用英文表示阿拉伯语)为例,对本发明采用改进的单个字符位图水平翻转变形规则对预处理后的字符串进行位图信息提取这一过程进行介绍:
假设一个一维有序数组里从左往右依次存放有b,d,p,q这四个字符串数据,即待打印字符串为bdpq(bd相邻两个字符为一个字节,pd相邻两个字符为一个字节),如果在提取位图信息的时候仍按这个顺序以字节为单位进行提取,然后将位图进行整体水平逆向,结果会出错,将会变成pqbd,即每个字符均会水平翻转显示,也就是说我们在提取位图的时候先将位图再次水平翻转一次然后再对整体字符串进行翻转的话就可以正确打印了。本发明先对单个字符进行位图水平翻转,得到dbqp,然后再对dbqp进行整体位图进行逆向显示(以字节为单位)即可得到所需要的结果qpdb。当然由于非阿拉伯文仍是采用从左向右显示,所以我们在最开始处理的时候要对非阿拉伯文首先进行逆向处理,这样就可以保证所有的字符显示方向均为正确的。
实施例4
该实施例主要介绍本发明的具体实现过程。
本发明在具体实现时需要freetype库的基本支持,再配以一些依赖库如iconv等,利用其提供的字体处理函数与阿拉伯文的连写与特殊变形规则,用相应的算法实现排版布局与打印。
参照图7,本发明的总体的算法流程如下:
(1)假设待打印的字符串为string,其字符串长度为length,在打印单据上的位置为(x0,y0),首先对该字符串进行修正,具体规则参考阿拉伯语变形规则,修正后的字符串为new_string,长度为new_length。
(2)由于阿拉伯文从右向左显示,而英文与阿拉伯数字(如123等)仍是采用从左向右显示,而POS机在打印单据上的金额一般采用阿拉伯数字,所以就会存在同一行不同字符的显示方向相反的情况。因此,需采用实施例3的新方法进行排版与布局。
(3)利用freetype库构建矢量字体的对象实例,按照打印单据的宽度申请buffer用来存储位图信息。
(4)对某个字符进行位图信息的提取,这里根据需求可设置大小、粗细、斜体等渲染方式,将位图信息填入buffer,依次处理单个字符直到结束,得到总buffer。
(5)对总buffer进行水平对齐和整体水平翻转等处理,从而得到整理后的buffer数据。
(6)将整理后的buffer数据传入打印机开启打印即可。
以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。