摘 要: 針對可變數(shù)字印刷中常用的頁面描述語言及其文件格式,,通過研究PostScript文件結(jié)構(gòu)和PDF文件結(jié)構(gòu),,介紹了如何實(shí)現(xiàn)PostScript文件與PDF文件間的數(shù)據(jù)轉(zhuǎn)換,給出兩種文件間轉(zhuǎn)換算法流程圖,,并利用PostScript解釋器Ghostscript提供的API接口,,實(shí)現(xiàn)了PostScript文件和PDF文件間的轉(zhuǎn)換,。轉(zhuǎn)換結(jié)果表明,,該轉(zhuǎn)換算法轉(zhuǎn)換效果比較好,實(shí)現(xiàn)了所見即所得,。
關(guān)鍵詞: PostScript,;PDF,;數(shù)據(jù)轉(zhuǎn)換
在可變數(shù)據(jù)印刷系統(tǒng)中,,每個(gè)電子頁面的內(nèi)容(如文字,、圖形、圖像)經(jīng)過頁面描述語言合成后產(chǎn)生相應(yīng)的可變數(shù)據(jù)印刷頁面,,最終形成特定的數(shù)據(jù)文件,。PostScript文件(簡稱PS)和PDF文件是目前存儲可變數(shù)據(jù)印刷頁面常用的文件格式,因此,,研究這兩種文件格式之間的數(shù)據(jù)轉(zhuǎn)換對可變數(shù)據(jù)印刷的發(fā)展具有一定的意義,。而當(dāng)前PS文件與PDF文件之間的轉(zhuǎn)換主要有兩種方式[1]:(1)通過專業(yè)的軟件(如Acrobat Distiller)轉(zhuǎn)換;(2)通過虛擬打印機(jī)來實(shí)現(xiàn),。
但是這兩種方式都不利于自主研究數(shù)據(jù)印刷系統(tǒng)的開發(fā),。本文根據(jù)PS文件格式和PDF文件格式的特點(diǎn),,利用PS解釋器Ghostscript提供的API接口,通過VC6.0實(shí)現(xiàn)了PS文件和PDF文件的相互轉(zhuǎn)換,,并給出相應(yīng)的代碼,。
1 PostScript和PDF文件結(jié)構(gòu)
1.1 PostScript文件
PostScript是由Adobe公司開發(fā)的頁面描述語言,其最大特點(diǎn)是可以將印刷品中包含的文字,、圖形,、圖像、字體和顏色等各種元素用一種計(jì)算機(jī)數(shù)據(jù)來表現(xiàn)和描述,,然后經(jīng)過RIP(光柵圖像處理器)快速地解釋為可控制打印設(shè)備輸出用的點(diǎn)陣信息,。用PostScript語言所描述的頁面文件稱為PS文件,其后綴名為.ps或.eps,。
PostScript程序可訪問的所有數(shù)據(jù)都是以對象(Object)形式存在的[2],,對象由操作符產(chǎn)生、管理和撤銷,。常用的對象有整數(shù)和實(shí)數(shù),、布爾型、數(shù)組,、壓縮數(shù)組,、串、名字,、字典等[3-4],。程序中的數(shù)據(jù)存儲在堆棧中并通過堆棧被操作符管理執(zhí)行。
PostScript語言解釋器對語句的執(zhí)行是逐句解釋執(zhí)行,,控制比較靈活,,一切操作均通過堆棧進(jìn)行。例如用粗線畫一個(gè)圓:
%%Title:用粗線畫一個(gè)圓
/inch{72 mul} def
4.25 inch 5.5 inch
2.5 inch
0 360 arc
1.75 inch setlinewidth
stroke
showpage
以‘%’開頭的第一段語句表示注釋,,第二段語句定義了名字對象‘inch’,,接著定義圓的中心位置(4.25,5.5),,半徑2.5,;然后畫角度為360°的圓;最后定義粗線的寬度1.75,,畫出粗線的路徑進(jìn)行顯示,。
1.2 PDF文件
便攜式文件格式PDF(Portable Document Format)是Adobe公司繼PostScript后于1993年推出的一種電子文件格式[5]。它具有能夠完整地保存任何原文檔中的文字,、格式,、顏色、圖形,、可加密等優(yōu)秀特性,,廣泛應(yīng)用于數(shù)據(jù)印刷系統(tǒng)中,。
PDF文件主要由四部分組成:文件頭(Header)、文件體(Body),、交叉引用表(Cross-referrence table)和文件尾(Trailer)。PDF作為一種結(jié)構(gòu)化的文件格式,,它是由一些具有特定數(shù)字標(biāo)號的“對象”的模塊所組成,。其文檔結(jié)構(gòu)是一種樹形結(jié)構(gòu),,通過文件尾(Trailer)可以找到文件體的根對象Catalog[6],根對象包含PDF文檔的大綱(Outline),、頁面組對象(Pages Tree)等。文檔結(jié)構(gòu)具體層次關(guān)系如圖1所示,。
其中頁面對象(Page)作為PDF中最重要的對象,包含了該頁面的文字,、圖片、頁面大小等信息,。頁面中包含的信息是包含在一個(gè)稱為流(stream)[7-8]的對象里,這個(gè)流的長度(字節(jié)數(shù))必須直接給出或指向另外一個(gè)對象,。
2 文件格式轉(zhuǎn)換算法的實(shí)現(xiàn)
根據(jù)前兩節(jié)的PostScript文件結(jié)構(gòu)可知,,要實(shí)現(xiàn)PS文件到PDF文件的轉(zhuǎn)換,首先需要對PS文件中的不同信息(文字,、圖形和圖像等)進(jìn)行解析,,然后轉(zhuǎn)換為對應(yīng)的PDF對象。兩者間轉(zhuǎn)換的總流程主要為:
?。?)導(dǎo)入要轉(zhuǎn)換的PostScript文件,,初始化PS解釋器;
?。?)開始掃描PS文件,,記錄當(dāng)前代碼段所在頁。判斷頁信息是否已經(jīng)到末尾,,是則退出,,否則繼續(xù)向下掃描,;
(3)讀取PS頁面描述信息,,對其中的文本信息,、圖形信息和圖像信息分別進(jìn)行提取并處理;
?。?)將第三步中處理的文本,、圖形和圖像信息進(jìn)行重構(gòu),然后分別轉(zhuǎn)換為相對應(yīng)的PDF對象,;
?。?)判斷PS文件是否掃描結(jié)束,是則回到第(2)步,,否則回到第(3)步,;
(6)轉(zhuǎn)換算法結(jié)束,。
圖2為PS文件轉(zhuǎn)換為PDF文件的總流程圖,。
由于PostScript文件對文本、圖形和圖像的描述機(jī)制各不相同,,因此,,其相應(yīng)的信息提取算法也不盡相同。在PostScript文件中,,圖像是取樣值的矩形數(shù)值,,每個(gè)取樣值表示某種彩色。按行或者列掃描圖像矩形所得的一串取樣數(shù)據(jù)定義了一個(gè)圖像,。除了矩形數(shù)組之外,,PS程序中還包括一些圖像參數(shù):源圖像的格式、圖像取樣數(shù)據(jù)的數(shù)據(jù)源,、圖像空間坐標(biāo)等,。因此,對PS文件中圖像的提取主要是將圖像的參數(shù)和圖像取樣數(shù)據(jù)進(jìn)行提取,,其對應(yīng)的提取算法流程圖如圖3所示,。
在標(biāo)準(zhǔn)的PostScript文件中,文本大都是以字庫[9]的形式進(jìn)行保存,,因此在PostScript中的字符可以由PS解釋器根據(jù)字庫提取出對應(yīng)的字符,。對PS文件中文本信息的提取流程如圖4所示,主要過程如下:
?。?)掃描文檔,,記錄當(dāng)前頁面信息。判斷是否已掃描到文件尾,,是則跳轉(zhuǎn)到第(5)步,,否則跳到第(2)步,;
(2)繼續(xù)掃描,,判斷是否掃描到文本提示符,,是則跳到第(3)步,,否則跳回第(1)步,;
(3)根據(jù)文本提示符獲取相應(yīng)的字庫詞典,,查找字庫獲取PS所描述的字符,;
(4)保存第(3)步提取的文本信息,;
?。?)結(jié)束文本掃描。
掃描文件時(shí)通過尋找關(guān)鍵操作符函數(shù)FindStringInBuffer(),,可以得到需要的操作符位置,。源程序如下:
size_t FindStringInBuffer(char*buffer,char*search,,size_t buffersize)
{
char*buffer0=buffer,;
size_t len=strlen(search);
bool fnd=false,;
while (!fnd)
{
fnd=true,;
for(size_t i=0;i<len,;i++)
{
if(buffer[i]!=search[i])
{
fnd=false,;
break,;
}
}
if (fnd) return buffer-buffer0,;
buffer=buffer+1,;
if (buffer-buffer0+len>=buffersize)
return-1;
}
return-1,;
}
由于PS解釋器的實(shí)現(xiàn)比較復(fù)雜,,本文通過利用PS解釋器Ghostscript提供的API接口函數(shù)對PS文件進(jìn)行解釋轉(zhuǎn)換。首先通過接口函數(shù)gsapi_new_instance()新建一個(gè)要轉(zhuǎn)換的實(shí)例,。轉(zhuǎn)換過程主要在接口函數(shù)gsapi_init_with_args()中進(jìn)行,,即初始化PS解釋器并將輸入PS對象轉(zhuǎn)換為對應(yīng)的PDF對象,。主要轉(zhuǎn)換程序如下:
if(code=gsapi_new_instance(&minst, NULL))
{
printf("Can′t create Ghostscript instance\n"),;
return 1,;
}
code=gsapi_init_with_args(minst,gsargc,,(char**)gsargv),;
code1=gsapi_exit(minst);
if((code==0)||(code==e_Quit))
code=code1,;
gsapi_delete_instance(minst),;
if((code==0)||(code==e_Quit))
return 0;
3 效果及結(jié)論
本文的程序在VC6.0上編譯通過,,并可以將輸入的PS文件(my.ps)轉(zhuǎn)換為PDF文件(my.pdf),。轉(zhuǎn)換前后的結(jié)果如下:
由圖5和圖6可以看出,轉(zhuǎn)換前后的圖像幾乎完全一樣,。由圖7中文本的轉(zhuǎn)換結(jié)果可以看出,,轉(zhuǎn)換的字符內(nèi)容一樣。通過修改輸入文件名和輸出文件名類型,,例如輸入文件為.pdf格式文件,,輸出文件為.ps文件,也可以實(shí)現(xiàn)PDF文件到PS文件的轉(zhuǎn)換,。因此,,在設(shè)計(jì)開發(fā)可變數(shù)據(jù)印刷系統(tǒng)時(shí),可以將該程序作為數(shù)據(jù)轉(zhuǎn)換的一部分嵌入到印刷軟件系統(tǒng)中,,具有一定的實(shí)用性,。但是,由于PS解釋器并非獨(dú)立設(shè)計(jì),,受到其接口函數(shù)的限制,,程序的延伸性不是很好。
參考文獻(xiàn)
[1] 張志偉,,孔凡讓,,吳欣.PostScript格式文獻(xiàn)中數(shù)學(xué)表達(dá)式的提取方法[J].計(jì)算機(jī)應(yīng)用與軟件,2008,,25(11):157-159.
[2] USA Adobe Systems Inc. PostScript language reference mannal. Addison Wesley Protessional,, 1990.
[3] 何明,匡燕玲,,李小龍,,等.頁面描述語言PostScript及其轉(zhuǎn)換程序[J]. 北京工業(yè)大學(xué)學(xué)報(bào),2004,20(4):102-104.
[4] 徐福培,,潘志庚.頁面描述語言及其程序設(shè)計(jì)[M].南京:南京大學(xué)出版社,,1994.
[5] USA Adobe Systems Inc. Document management-Portable document format-Part 1:PDF 1.7[J]. Adobe Systems Incorporated, 2008,, PDF 32000-1.
[6] 李珍,,田學(xué)東.PDF文件信息的抽取與分析[J].計(jì)算機(jī)應(yīng)用,2003,,23(12):145-148.
[7] 王婉,,韓逸秋,徐福培.PDF文件格式及其向PS文件轉(zhuǎn)換的研究[J].計(jì)算機(jī)科學(xué),,2001,,28(9):123-127.
[8] 吳一民,,朱檬,,羅綿川.基于.NET平臺PostScript文件解析標(biāo)引系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)應(yīng)用,2009(10):5863.
[9] 段華偉,,黃靈閣.計(jì)算機(jī)文字處理技術(shù)現(xiàn)狀[J].印刷質(zhì)量與標(biāo)準(zhǔn)化,,2004(5):39-41.