本文轉載自:https://www.cnblogs.com/Ansing/tag/PostScript%E8%AF%AD%E8%A8%80%E6%95%99%E7%A8%8B/
一、介紹
POSTSCRIPT語言是打印機頁面魔術的一種程序設計語言。他擁有着廣泛的圖形操作,並且可以以任意方式,包含變量,函數,以及過程的任意組合。
POSTSCRIPT頁面描述是由解析器運行的程序(gs),postscript程序通常是由其他應用程序生成的。
1.1、POSTSCRIPT作為頁面語言
POSTSCRIPT具有大量的圖形運算符,通過他可以更加詳細的描述你的頁面。
文本的字體,位置,方向,尺寸。
幾何圖形的大小,方向,寬度,直線和曲線的位置,任何大小形狀顏色的空間填充。
1.2、POSTSCRIPT作為編程語言
二、堆棧和運算
POSTSCRIPT 編程語言和其他編程語言一樣,適用於各種各樣的數據,例如數字,數組,字符串,以及字符。這種處理數據的方法被稱為POSTSCRIPT對象。
操作數據的方法有多種多樣,例如:將數據放入變量名,通過變量名稱進行處理。POSTSCRRIPT語言擁有變量,但也可以通過堆棧直接操作數據。
2.1、POSTSCRIPT堆棧
堆棧是一段用於處理數據的內存,是一種先入后出的存儲原理。
將數字入棧: 12 6.3 -99
說明:
1.將12入棧 2.將6.3,入棧,12壓棧 3.將-99 入棧,前兩個一次類推
2.2、運算
| 運算 | 代碼示例 | 結果 |
| 加 | 5 27 add | 32 |
| 減 | 8.3 6.6 sub | 1.7 |
| 除 | 13 8 div | 1.625 |
| 除返回整數 | 25 3 idiv | 8 |
| 除返回余數 | 12 10 mod | 2 |
| 乘 | 6 8 mul | 48 |
| 取反 | -27 neg | 27 |
組合運算:
6 + (3 ÷ 8)
1. 3 8 div 6 add
將3,8入棧,除運算,0.375,再講6 入棧,加運算,得6.375
2. 6 3 8 div add
將6,3,8,入棧,8為棧頂,取3,8,進行除運算,結果再與6 進行加運算
8 - (7 × 3)
1. 7 3 mul 8 exch sub
2. 8 7 3 mul sub
exch:交換棧的前兩項空間數據
清除所有棧數據: 6 8 12 32 clear => 空
復制堆棧頂部的數據: 6 dup => 6 6
刪除堆棧頂部數據: 17 8 pop => 17
旋轉數據: 7 8 9 3 1 roll => 9 7 8 : 789依次入棧,1代表從頂到底,798,978
7 8 9 3 -1 roll => 897 : -1代表從低端到頂端,879, 897
2.3、交互運算符
== 將堆棧頂端的數據打印出來,並且刪除。
pstack 將整個棧中的數據打印數來,保留數據。
三、繪圖
3.1、畫線
線:
newpath 144 72 moveto 144 432 lineto stroke showpage
說明:
我們首先調用newpath,初始化當畫筆狀態。
x y moveto,將畫筆的移動到x,y的位置
x y lineto,以x,y為終點進行畫線
stroke將構建的路徑繪制到當前頁面
showpage打印當前頁
交叉線:
newpath 72 360 moveto 144 72 rlineto 144 432 moveto 0 -246 rlineto storke showpage
說明:
x y rlineto:將畫筆位以x,y進行位移
正方形:
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto 4 setlinewidth stroke showpage
說明:
setlinewidth:設置線的寬度
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath 4 setlinewidth stroke showpage
closepath:使圖形閉合(不使用的時候在拐角的地方會出現一個小缺口)
3.2、填充圖形
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath fill showpage
fill:填充圖形
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath .5 setgray fill showpage
gray:設置透明度
多圖的疊層:
newpath
252 324 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
.5 setgray
fill showpage
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
.5 setgray
fill showpage
newpath
288 396 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
.5 setgray
fill showpage
3.3、總結
closepath 閉合圖形
lineto 繪制直線
moveto 設置繪制的起始點
newpath 初始化繪制方式
rlineto 移動
fill 繪制填充圖形
setgray 設置透明度
setlinewidth 設置線的寬度
stoke 繪制路徑
showpage 打印當前頁
四、程序變量使用
4.1、變量定義
POSTSCRIPT 變量
變量的定義是將變量名和值用def進行關聯類似:
/ppi 75 def %將ppi定義為75 /ppi ppi 1 add def %將ppi + 1的值定義為ppi ppi = 75 + 1 = 86
POSTSCRIPT 程序塊:
/inch {72 mul} def
4.2、使用程序和變量
方塊:
/box
{
72 0 rlineto
0 72 rlineto
-72 0 rlineto
closepath
}def
newpath
252 324 moveto box
.4 setgray fill
/inch {72 mul}def
/box
{
newpath moveto
1 inch 0 rlineto
0 1 inch rlineto
-1 inch 0 rlineto
closepath
}def
/fillbox
{
setgray fill
}def
3.5 inch 4.5 inch box
0 fillbox
2.75 inch 5 inch box
.4 fillbox
五、文本打印
5.1、POSTSCRIPT字體
字體是具有統一規格的字符集。其中包含數百個字符集,包含熟悉的TIMES和HELVETICA
使用POSTSCRIPT字體
在你打印文本之前,你需要指定所需的字體,這個過程需要三個步驟:
- 查找字體的信息。保存在當前環境中,他用來提供特定字體的形狀,信息。
- 將字體縮放。
- 將縮放的額字體設置為當前字體,然后打印出來
%!PS-Adobe-3.0 /Times-Roman findfont 15 scalefont setfont 72 200 moveto (typography) show showpage
/Times-Roman findfont
查找名稱為Times-Roman的字體,並把它保存到當前程序中
15 scalefont
設置字體大小為15號的Times-Roman字體
setfont
根據已經保存好的規格,對字體進行設置
5.2、動態設置字體大小
%!PS-Adobe-3.0
/scaleTimes % stack:scale
{
/Times-Roman findfont
each scalefont setfont
}def
6 scaleTimes
72 200 moveto (typography) show
showpage
/Times-Roman findfont 入棧
each scalefont setfont 入棧
6 scaleTimes意義為
6 /Times-Roman findfont each scalefont setfont
each 將 6 和 /Times-Roman 交換位置得
/Times-Roman findfont 6 scalefont setfont
默認支持的字體字體:
Times-Roman
Times-Bold
Times-Italic
Times-Boldltalic
Helvetica
Helvetica-Bold
Helvetica-Oblique
Helvetica-Boldltalic
Courier
Courier-Bold
Courier-Oblique
Courier-BoldOblique
%!PS-Adobe-3.0
/MainFont
/STSong-Light--GB-EUC-H findfont 15 scalefont def
/SloganFont
/Helvetica-Oblique findfont 7 scalefont def
/OwnerFont
/Helvetica findfont 10 scalefont def
/rightshow
{
dup stringwidth pop
150 exch sub
0 rmoveto
show
}def
/CardOutline
{
newpath
90 90 moveto
0 144 rlineto
252 0 rlineto
0 -144 rlineto
closepath
.5 setlinewidth
stroke
}def
/doBorder
{
99 99 moveto
0 126 rlineto
234 0 rlineto
0 -126 rlineto
closepath
2 setlinewidth
stroke
}def
/Diamond
{
newpath
207 216 moveto
36 -54 rlineto
-36 -54 rlineto
-36 54 rlineto
closepath
.8 setgray
fill
}def
/doText
{
0 setgray
90 180 moveto
MainFont setfont
(AAA丶死劉) rightshow
90 168 moveto
SloganFont setfont
("The Club of Lonely Hearts") rightshow
216 126 moveto
OwnerFont setfont
(Sam Spade) show
216 111 moveto
(Owner) show
}def
CardOutline
doBorder
Diamond
doText
showpage
/STSong-Light--GB-EUC-H 為中文打印(注:中文打印時候要求文件格式為gb2312,否則字庫不識別,打印出來是亂碼)
stringwidth 獲取當前字符串的寬度,寄存起為字符串寬度 ,字符串內容,寬度在頂端
dup stringwidth pop 150 exch sub 0 rmoveto show
意義為:
獲取字符串寬度,並將(150 - 字符串寬度的值,0)進行偏移,即:打印字符串在150處右端對齊。
