PostScript——PostScript语言教程
转载自: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处右端对齐。