Linux系统下复杂文字打印

类别:软件工程 点击:0 评论:0 推荐:

Linux系统下复杂文字打印

陈朴 吴健

中国科学院软件研究所 北京 100080

电子邮件:[email protected]

摘要

   我国有56个少数民族,其中大部分民族语言文字都属于复杂文字。而现在Linux环境下的打印系统还不完善,对复杂文字的处理还有很多问题。本文首先说明了复杂文字打印的难点,然后,分析了现在流行的Linux环境下的打印实现方式,重点针对KDE下的打印给出了打印的流程,最后,提出了在现有的Linux桌面环境下的复杂文字打印需解决的问题。

1.   引言

我国有56个少数民族,但是长期以来,少数民族语言信息化研究开发与产业化由于受到“规划、组织、资金、人才、技术”诸方面因素所限,远远落后于汉语信息技术。不但成为影响我国实现全社会信息化的技术瓶颈,同时也成为制约我国提高综合国力的不利因素。国家863重大专项“民族语言版本Linux操作系统及办公套件研发”(项目编号:2003AA1Z2110)就是要研发完整的Linux系统少数民族语言操作系统及办公套件,重点解决少数民族语言的文字输入、显示、打印等关键技术。

Linux系统的本地化包含三个方面的内容:输入、显示、和打印。其中输入和显示都可以按照国际化的标准来实现,如C Locale、X Locale、gettext等等。但在国际化标准中并没有涉及打印。复杂文字的打印需要不同的原理和实现方法来实现。

本文对Liunx环境下的蒙、藏、维,复杂民族语言文字打印分析了实现的过程的难点并针对难点提出了改进的方案。当前有多个流行Linux的平台,如KDE、GNOME等,它们的打印实现方式各不相同,使用不同的函数库。

2.   复杂文字打印的难点

目前UNIX上有许多套打印程序,基本上它们的输出档都是Postscript档,这是因为有一个GPL Postscript文档打印程序,它就是Ghsotscript。Ghostscript有很好的可移植性,它所支持的打印设备范围几乎包括了目前市面上所有可见的设备。而且它的品质就和高端的Postscript打印机一样好,甚至也完全支持彩色列印的功能。

所以在Linux的环境下使用Postscript做为输出文档格式是很自然的选择。但是要让Postscript文档支持复杂文字的打印也不是一件很容易的事,这有两方面的原因。

原因1,是Postscript基本上所使用的字型格式中主要是为单位元组字集(single byte character)所设计。对于像复杂文字这种一般是双位元组的字集在当初设计时并未考虑,但因为Postscript语言是一种绘图语言,所以我们当然可以把这些复杂文字当做图形来处理,不过Postscript所直接支持的一些文字打印功能就不能用了,并且还会增大Postscript文件的大小。

原因2,如果要保持这些文字的特性则需要至少有一种相应语言的Postscript打印字体。在打印机中一般只安装有英文的某些字体,如果要能正确地打印出少数民族复杂文字,如维文、藏文等文字,则需要Ghostscript将生成的Postscript文件加入这些复杂文字的字型信息,这些信息要来自Postscript字体。但现在还没有这些民族语言的可用的Postscript字体,常用的只是TureType字体或者是OpenType字体。

一下首先介绍Postscript,然后,分析KDE环境下的打印实现过程,最后,提出如何使KDE(即:QT库)支持复杂文字的打印。

               标准数据流—PostScript数据流

PostScript是一种与设备无关的打印机语言,即在定义图像时可以根本不考虑输出设备的特性(如打印机的分辨率、纸张大小等),而且它对文本和图形实行同样的处理过程,这就给处理字体带来了极大的灵活性。由于PostScript的设备无关特性,在输出到特定输出设备,譬如对分辨率、纸张大小、进纸盒进行选择时,PostScript通过打印机描述(PostScript Printer Description )文件来实行各种打印机的不同特性。PPD文件主要提供以下与打印机有关的特定信息: 默认/最高分辨率,是否支持半色调监控,用户设定的监控信息,页面大小定义,页面可打印区域,默认字体(通常为Courier),是否支持双面打印等等。由于PostScript十分复杂,一般的打印控制器难以胜任,通常由打印机中专门的光栅图像处理器(Raster Image Processor)来完成这一转换过程。

PostScript数据流是符合PostScript语言规范的数据流。PostScript语言包括三个级别:PostScript级别1、PostScript级别2和PostScript级别3。对于复杂文字的打印,需要统一PostScript中使用的PostScript字体名称。

            Linux打印机制模型

在当前的linux环境下还没有一套统一的打印实现机制,最常见的需要打印的文件格式是普通文本文件和PostScript文件。 对于普通文本文件的打印一般需要先转换为PostScript文件再打印。

现有的PS文件生成方式大都是以开发软件的库或是应用软件自已处理,例如:GNOME(libgnomeprint), QT, OpenOffice.org等等。流行的linux桌面环境Gnome和KDE各自提供自己的打印实现方式,并由CUPS(通用UNIX打印系统 )来进行打印的管理。一般来说将屏幕上看到的文字打印到纸上, 要经过两步: 1. 应用程序生成 postscript 文件; 2. 将该文件送到打印机 (直接或通过 ghostscript).下图显示了GNOME和KDE的打印实现流程(如图1):

图1:Linux打印模型

         CUPS 使用互联网打印协议(Internet Printing Protocol :IPP)作为管理打印的基础等。此外,新版本的CUPS还增加了网络打印机浏览功能和以PostScript 打印机规范为基础的其他选项功能。

当前,并不是每个打印机都支持Postscript文件的直接打印,只有一些激光打印机才支持Postscriptd打印。因此,CUPS 还使用一个专门的 GNU Ghostscript和一个映射文件RIP 以实现对非PostScript 规范打印机的支持。

            复杂文本的打印

在Linux的KDE环境下利用PostScript语言及其解析器(GhostScript)实现复杂文字的打印要解决三个方面的问题:

1.   定义PostScript规则

PostScript语言中与显示字符相关的操作流程是:

1)   选择字体和字体的大小

2)   笔尖移动到书写的起始位置

3)   书写字符

要完全类似西文打印实现复杂文字的打印,就要给这种复杂文字指定PostScript字库。如果正确地定义了这些字库就能正确地打印。

2.   使GhostScript可以解释PostScript文件

    定义一种PostScript字库并对这种字库进行正确的解释,这一工作通常是由PostScript解释器软件提供并完成的。

3.   应用程序和转换程序输出合乎规则的Postscript文件

以上两个问题都解决了以后,一个完整的复杂文字打印体系就可以建立起来。剩下就是如何使应用程序把文本文件等格式转换为PostScript文件的转换程序必须输出符合第一条规则的PostScript文件。

为使应用程序和转换程序输出合乎规则的PostScript文件,需要注意一下的问题:

1)   复杂文字和西文的分段

    由于对复杂文字和西文的字符串,PostScript程序要分别使用复杂文字或者是西文的PostScript字库进行书写,所以书写PostScript文件首先要注意的问题就是要把输入文本字符严格的分段。对复杂文字的字符串,先要把当前字库设置为这种复杂文字的字库,然后再进行书写;对西文的书写,首先要把当前的字库设置为西文的PostScript字库。如果分段有问题,解析器在解析PostScript文件时,将会发生编码范围错误而无法继续下去。

2)   字库的大小匹配

    分段书写字符,要对字库的大小匹配。可以根据西文字符的大小确定复杂文字的字符大小。一般复杂文字比西文字要略高,其底部比西文字略低一些。如果西文选用的固定宽度字符,而且要上下对齐,一般应该将西文字符横向的压缩至复杂文字的一般的宽度,而西文字符的高度要放大一些。一般固定宽度的西文文字偏胖偏扁,这可以通过PostScript语言对西文字库进行变换实现。

3)   折行

    有时一个复杂文字和西文的字符串过长,作为一个整体书写将使文字超出页面的右边界。这时就要把这个字符串再细分,使第一部分写在头一行而不超出边界,其他的部分写在下面一行或几行里。有些标点符号不能放在每行的开头或结尾,就应该提前或推迟若干个字符折行,并对整行字距调整。

4)   行距

    如果复杂文字的行距比西文版面的行距稍大,应该调整。

QT的打印将文本的输出和文本的打印结合在一起,由QPrinter类来生成Postscript打印文件。该文件将所使用的所有字型可以从TrueType字体文件中取出并将其嵌入,然后将每个字的Unicode码和字型一一对应,字符的输出位置由PostScript语言来进行定义。如:

19 Y<0001000200020003000400020005000400060007>[7 0 7 0 7 0 7 0 7 0 7 0 7 0 7 0 7 0 0

这段代码代表在纵向19的位置输出7个字符。这七个字符的字型信息来自TrueType字体文件并以PostScript语句书写,如:

/uniA8B1{{1000 0 32 -10 927 769 _sc

254 715 _m

274 699 294 682 315 664 _c

325 655 336 651 348 652 _c

355 652 360 658 364 668 _c

366 678 364 694 356 716 _c

………………………………..

其中/uniA8B1是一个藏文的Unicode代码,在它后面是PostScript语法的字型信息。

 

            结论

对于QPrinter生成的PostScript文件,如果不嵌入字型信息,则需要在语言中指定所使用的字体,而且该PostScript字体必须在PostScript解释器系统中存在。如果指定的字体没有找到,PostScript解释器会使用默认的字体名称进行显示,一般这个默认的字体名称不能解释一些复杂字体的字体名称,这时会出现显示在屏幕上的文字和打印出来的文字不同的情况。因而系统创建的PostScript中的字体名称需要规定,并且PostScript解释器系统中应该包括这些字体的名称。具体的需要:统一postscript文件内容的格式;统一postscript生成工具所使用的字体;统一字体的安装方式,路径;4.统一字体内部的字体名称,例如字体family名称,字体full名称,字体ps名称都统一为相同的名称。

 

            参考文献

[1]  The KDEPrint Handbook. Kurt Pfeifle. Version 1.00. Kurt Pfeifle, Danka Deutschland GmbH.

[2]   PostScript®LANGUAGE REFERENCE. third edition, Adobe Systems Incorporated, First printing February 1999。

[3]  Linux程序设计权威指南. 机械工业出版社,于民俭、陈向阳、方汉,2001年第四版。

[4]   Supporting Downloadable PostScript Language Fonts, Technical Note #5040, Adobe Systems Incorporated

本文地址:http://com.8s8s.com/it/it35795.htm