[轉貼]Linux系統下複雜文字打印

Linux系統下複雜文字打印<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

陳樸 吳健

中國科學院軟件研究所 北京 100080

電子郵件:[email protected]


摘要

   我國有56個少數民族,其中大部分民族語言文字都屬於複雜文字。而現在Linux環境下的打印系統還不完善,對複雜文字的處理還有很多問題。本文首先說明了複雜文字打印的難點,然後,分析了現在流行的Linux環境下的打印實現方式,重點針對KDE下的打印給出了打印的流程,最後,提出了在現有的Linux桌面環境下的複雜文字打印需解決的問題。

1.   引言

我國有56個少數民族,但是長期以來,少數民族語言信息化研究開發與產業化由於受到“規劃、組織、資金、人才、技術”諸方面因素所限,遠遠落後於漢語信息技術。不但成爲影響我國實現全社會信息化的技術瓶頸,同時也成爲制約我國提高綜合國力的不利因素。國家863重大專項“民族語言版本Linux操作系統及辦公套件研發”(項目編號:2003AA1Z2110)就是要研發完整的Linux系統少數民族語言操作系統及辦公套件,重點解決少數民族語言的文字輸入、顯示、打印等關鍵技術。

Linux系統的本地化包含三個方面的內容:輸入、顯示、和打印。其中輸入和顯示都可以按照國際化的標準來實現,如C LocaleX Localegettext等等。但在國際化標準中並沒有涉及打印。複雜文字的打印需要不同的原理和實現方法來實現。

本文對Liunx環境下的蒙、藏、維,複雜民族語言文字打印分析了實現的過程的難點並針對難點提出了改進的方案。當前有多個流行Linux的平臺,如KDEGNOME等,它們的打印實現方式各不相同,使用不同的函數庫。

2.   複雜文字打印的難點

目前UNIX上有許多套打印程序,基本上它們的輸出檔都是Postscript檔,這是因爲有一個GPL Postscript文檔打印程序,它就是GhsotscriptGhostscript有很好的可移植性,它所支持的打印設備範圍幾乎包括了目前市面上所有可見的設備。而且它的品質就和高端的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級別1PostScript級別2PostScript級別3。對於複雜文字的打印,需要統一PostScript中使用的PostScript字體名稱。

            Linux打印機制模型

在當前的linux環境下還沒有一套統一的打印實現機制,最常見的需要打印的文件格式是普通文本文件和PostScript文件。 對於普通文本文件的打印一般需要先轉換爲PostScript文件再打印。

現有的PS文件生成方式大都是以開發軟件的庫或是應用軟件自已處理,例如:GNOME(libgnomeprint), QT, OpenOffice.org等等流行的linux桌面環境GnomeKDE各自提供自己的打印實現方式,並由CUPS(通用UNIX打印系統 )來進行打印的管理。一般來說將屏幕上看到的文字打印到紙上, 要經過兩步: 1. 應用程序生成 postscript 文件; 2. 將該文件送到打印機 (直接或通過 ghostscript).下圖顯示了GNOMEKDE的打印實現流程(如圖1):

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

1Linux打印模型

         CUPS 使用互聯網打印協議(Internet Printing Protocol IPP)作爲管理打印的基礎等。此外,新版本的CUPS還增加了網絡打印機瀏覽功能和以PostScript 打印機規範爲基礎的其他選項功能。

當前,並不是每個打印機都支持Postscript文件的直接打印,只有一些激光打印機才支持Postscriptd打印。因此,CUPS 還使用一個專門的 GNU Ghostscript和一個映射文件RIP 以實現對非PostScript 規範打印機的支持。

            複雜文本打印

LinuxKDE環境下利用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章