文章出處

PostScript(PS格式)講解一、PostScript概述Postscript既是一種頁面描述語言,也是一種高級解釋型腳本語言。由于它與設備的無關性,使得它無論在那種平臺上,都能忠實的再現原貌,從而被廣泛應用于打印出版行業,同時由于它是一種解釋型腳本,所以它也可以像一般編程語言一樣用來解決某些問題。和我們熟悉的pdf文件相比,兩者有幾個明顯的區別:1.pdf有嚴格的文件結構(文件頭,所有對象,交叉引用表,文件尾,線性化pdf也有固定格式)和文檔結構(由catalog穿起來的邏輯結構),ps則沒有這些;2.ps的數據類型有十幾種,pdf只有8種;3.ps有一般編程語言所具有的結構控制條件語句,比如if,ifelse,for,forall,loop,以及function等等,而pdf沒有;4.pdf最終是要顯示出來給別人看的,ps不僅限于這個目的,它還可以做為腳本實現一定非顯示的功能;5.ps語言中的標準操作符有400多個,有的一個操作符有好幾種使用方式(參數類型和數量不同),而且ps沒有保留字,這些標準操作符完全可以通過ps腳本改變其原來的含義;6.ps文件一般都是沒有加密的,所以文件很大,pdf相對要小很多。 通常,一個postscript語言的閱讀器,應該包含以下幾個大部分:掃描器,解釋器,操作數棧,執行棧,字典棧,圖形狀態棧,虛擬內存區,字體處理塊,顏色處理塊,以及最后的輸出功能,下面將詳細說明。 二.Postscript詳細介紹 1.基本類型的數據結構簡單OBJECTS復合OBJECTSbooleanarrayfontIDdictionaryintegerfilemarkgstate (LanguageLevel 2)namepackedarray (LanguageLevel 2)nullsaveoperatorstringreal   Array:能容納不同類型的對象;可以通過index來訪問其中的元素;對array的訪問必須有下表安全檢查,array長度有最大實現限制;要支持嵌套;值的存儲符合復合對象的特征。String:它的元素值必須是0-255之間;長度受程序實現的限制;要能處理轉義字符’/’;值的存儲要符合復合對象的特征。Dictionary:用來存儲鍵-值對,要實現在字典中插入一個條目;能查詢一個鍵并得到它關聯的值;字典在創建的時候要指定最大條目數,當插入一個條目的時候超過最大條目數,ps level1返回一個dictfull錯誤,level2以上則自動擴展,最大條目數受字典實現的限制;能支持和字典相關的操作符的實現;值的存儲要符合復合對象的特征。File:解釋器和運行環境之間用來交流的一個可讀或可寫的字符流。要支持像磁盤文件這樣可以永久保存的類型,也要支持動態生成的類型;一個file對象要創建并打開一個文件;支持其他操作符的讀寫操作;支持類似read,readline,write,writeline等等的操作;Save:save操作符獲取當前local虛擬內存的狀態快照并返回描述此快照的save object,restore則把local虛擬內存的狀態恢復到save產生的快照狀態。Restore要實現以下功能:丟棄自從對應的save以來所有在local虛擬內存上產生的對象,歸還占用的空間;恢復save時local虛擬內存中的所有復合對象(不包括string);隱式調用grestoreall操作符,把graphics state的狀態恢復到save的時候的狀態;關閉自save以來所有打開的文件(local虛擬內存起作用的時候打開的)。Restore不會影響操作數棧,字典棧,執行棧,以及global虛擬內存。Save 和 restore可以嵌套。Gstate:一組圖形控制參數,分為兩大類:設備無關的包括CTM,position,path,clipping path,clipping path stack,color space,color,font,line width,line cap,line join,miter limit,dash pattern,stroke adjustment;設備無關的包括color rendering,overprint,black generation,undercolor removal,transfer,halftone,flatness,smoothness,device。要實現以上特性的存取操作。 2.掃描器。 這個是實現瀏覽器的基礎,從字符流中按照postscript語法解析成一個一個的對象,ps‘編碼方式有3種:ASCII, binary token, 和 binary object sequence。其中ASCII的編碼方式很普遍,所以只考慮這種方式的編碼。掃描器要能識別一下幾種ps元素:A.空白符。除了注釋和串中的以外,空白符當作分割對象的單位,連續的空白符當作一個處理;CR和LF以及CR+LF都當作換行處理。B.注釋。除了在字符串中,%之后直到換行的所有字符。C.數字。包括3中類型:符號整數(比如0,+5,-3),實數(比如-.002,34.5,-3.62,123.6e10, 1.0E-5,1E6,-1.,0.0),指數(比如8#1777,16#fff,2#100)。D.string。有3種形式:()包括的字面文本;<>包括的十六進制編碼文本;<~~>包括的ASCII-Base85編碼數據。其中()中的數據處理依據以下原則:如果()內包含配對的(),則不需要特殊處理;如果有單個的(或),用/來處理;用/處理的其他轉義字符。E.名字。由常規字符組成又不能解釋為數字的詞法單位就當作名字處理。除了空白符和界定符之外的所有字符都可以出現在名字中。/引導一個字面名字,但它本身不是名字的一部分。F.數組。[和]界定一個數組,從[開始收集元素,]則構造一個包含這些元素的數組對象。[和]是操作符。G.過程。{和}界定一個可執行數組。H.字典。<<和>>構造一個字典,過程和[]幾乎一樣,里面包括key1 value1 key2 value2… keyn valuen這樣的對,構造后的字典由解釋器放入字典棧。 3. operand stack,execution stack,dictionary stack,graphic state stack,clipping path stack。 這5個棧和后面的虛擬內存以及gstate是postscript執行環境的主要部分。A.操作數棧。可以存放任意postscript對象,因為postscript是操作數在前,操作符在后的語法規則,所以解釋器遇到操作數都是先壓入操作數棧,直到遇到操作符再從棧頂拿操作數。同時,操作數棧中還可以存放執行的中間結果。操作數棧直接被ps解釋器控制,大多數ps操作符可以直接push和pop操作。B.執行棧。存放可執行的對象,當解釋器延遲當前可執行對象去執行另外一個對象的時候,就把當前可執行對象壓入執行棧,等執行了之后再執行它。這個也相當于postscript程序的調用堆棧。受ps解釋器控制,ps程序可以讀,但是不能寫。C.字典棧。只存放字典對象,從最底往上,3個對象依次是systemdict,globaldict,userdict。其中systemdict是一個只讀的字典,定義了所有標準的操作符(400多個)globaldict和userdict包括了用戶自己在虛擬內存中定義的一些變量和操作符,配合save等操作符使用。直接受ps解釋器控制,但是只能保存dictionary對象,且最下面的3個字典(systemdict,globaldict,localdict)不能被pop,只有bengin,end,clearstack可以改變dictionary stack。典型示例:/average {add 2 div} def40 60 avergage執行步驟:1.把名字average和過程{add 2 div}壓入操作數棧2.遇到def后,查找字典棧,如果這個操作符沒有被重新定義,則它的意義是把操作數棧棧頂的兩個元素(average和{add 2 div})pop出來,在當前字典中添加一個條目,key是average,value是{add 2 div}。3.把40和60依次壓入操作數棧。4.遇到average,在字典棧中查找,執行它關聯的值(這里是){add 2 div}。這個步驟的執行過程是先執行add,從操作數棧棧頂pop出兩個數(40和60),相加,然后把結果100壓入操作數棧;遇到2壓入操作數棧;遇到div,在字典棧中查找,如果它沒有被重新定義,則pop出操作數棧棧頂的兩個數,做除法運算,然后把結果50壓入操作數棧。D.圖形狀態棧。用來維護一組控制文本和圖像顯示狀態的參數。設備無關類參數:1.CTM。當前轉換矩陣,把位置從用戶坐標轉換到設備坐標。2.position。用戶空間當前點的坐標。3.path。由path構造操作符創建并增加,并隱含的做為類似fill,clip,stroke等操作符的參數。4.clipping path。設置當前的裁剪區域。5.clipping path stack。一個clipping path的stack,存放由clipsave保存而且沒有被cliprestore釋放的clipping path。6.color space。要被解釋的顏色值的種類,比如Device Gray。7.color。描繪操作符使用的顏色,和color space有關,一般1-4個值。8.font。用字典來表示當前字體的繪圖形狀集合。9.line width,line cap,line join,miter limit。線條相關的特性。10.dash pattern。線條被stroke的時候,線的虛實類型描述。設備相關參數:1.color rendering。如何把CIE-based color轉換成device color的一組參數。2.overprint。是否覆蓋周邊顏色。3.black generation。RGB轉換成CMYK的時候,用來產生黑色的一個過程。4.undercolor removal。計算CMY減少的總量,用產生的黑色做補償。E.clipping path stack。由clipsave和cliprestore控制的一個棧,存放clipping path。由于這個棧是graphics state stack的一部分,所以grestore和setgstate會替換整個clipping path stack。 4.解釋器。在掃描器分析出一個對象和它的屬性、類型的時候,解釋器就要負責解釋它。主要包括一下幾個方面:A.對注釋的處理。遇到不是串中的%時,過濾掉%到換行符(或文件結束符)之間的所有字符,當作一個空白字符處理。B.對數字的處理。分析出來的數字一律壓入操作數棧;C.對名字的處理。名字有3類:前面有/的文法名字,無前綴的可執行名字,帶前綴//的立即替換名字。第一種名字壓入操作數棧,第二種名字壓入執行棧,第三種名字由解釋器查找字典,找到后壓入操作數棧。D.對字典的處理。當<<執行時,把一個mark對象壓入操作數棧,>>執行時這個字典會被創建,然后壓入字典棧。E.對數組和打包數組的處理。解釋器遇到數組時,會順次執行數組里面的元素。F.對過程對象的處理。解釋器遇到過程對象的時候并不會立即執行,而是先壓入操作數棧,等到明確被調用時才會被執行。 5.虛擬內存。虛擬內存是psotscript中的一個特殊概念,沒有規定物理實現方式,但不管怎么實現,都要符合一下原則。虛擬內存包括4個部分:A.local虛擬內存。Local虛存是一個類似棧的存儲池。在它上面申請內存或修改變量都受制于save和restore。一般而言,local虛擬內存主要是維護當前頁面用到的一些參數和變量,作用范圍是當前頁面(save和restore之間)。B.global虛擬內存。Global虛擬內存是一個沒有固定規律的存儲池,在一個程序中,在global虛存中申請內存或修改變量不受save和restore影響。一般是維護整個文件級別的一些參數,用來保證每頁開始的時候初始狀態都是相同的。C.local和global之間的交互。包括local和global狀態的轉變,local和global之間存儲數據的相互操作的實現等等。D.Local虛擬內存在save-restore機制影響下的行為。當一個restore發生時,自上一個save以來,所有在local虛擬內存中申請的內存都會被釋放,所有打開的文件都要關閉,同時會恢復gstate的狀態。就愛閱讀www.92to.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/63587.html

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()