PS文件生成驱动
PostScript是一种页面描述性的编程语言,广泛用于打印图片和文本。PostScript脚本需要用一定的解读器解读,我们平时使用的PS文件阅读器就应该包含PostScript脚本解读模块。
一个完整的PS文件包括三部分:文件头,PostScript语言, 和文件尾。
文件头给出了PS文件的基本信息,如标题,创建者,创建时间等等;文件尾标志着PS文件结束。PostScript语言分为两块,首先是一些前言(prolog),创建者可以自己定义了一些命令,方面后面的脚本书写;然后是脚本,是PS文件的主体,用于生成图片和文本。
需要注意的是,在Linux系统下,文件开头一般都有一个magic number用于指示文件的类型,PS文件以%!PS为开头,其对应的十六进制数为0x2125 5350,这可以用命令od -x -N 64 file.ps来查看。
这道这些以后,我们就基本可以写一个PS文件生成驱动了。下面是一个简单的例子:
%!PS-Adobe-3.0 EPSF-3.0 %%For: Liyropt %%Title: Hello World %%Creator: Liyropt %%CreationDate: May 29 2011 %%BoundingBox: (atend) %%DocumentFonts: (atend) %%LanguageLevel: 1 %%Orientation: Landscape %%Pages: (atend) %%EndComments %Begin Programming %%BeginProlog /L {moveto rlineto currentpoint stroke moveto} bind def /C {rlineto currentpoint stroke moveto} bind def /D {moveto 0 0 rlineto currentpoint stroke moveto} bind def /LW {5 mul setlinewidth} bind def %%EndProlog %%BeginSetup /#copies 1 def %%EndSetup %%Page: 1 1 %%BeginPageSetup 0.072 0.072 scale 8149 250 translate 90 rotate 1 setlinejoin 1 setlinecap 1 LW 1 %%EndPageSetup 4 LW 8000 0 1150 1560 L 0 3000 5000 1200 L 1 0.5 0 setrgbcolor /Times-Roman findfont 200 scalefont setfont newpath 4283 2545 moveto (Hello, world!) show closepath newpath 1500 0 6500 1500 L 0 1500 8000 1500 L -1500 0 8000 3000 L 0 -1500 6500 3000 L closepath /inch {1500 mul} def newpath 1 inch 1 inch moveto 2 inch 1 inch lineto 2 inch 2 inch lineto 1 inch 2 inch lineto closepath fill stroke save restore showpage %End Programming %%PageBoundingBox: 220 42 529 708 %%BoundingBox: 220 42 529 708 %%Pages: 1 %%EOF
下面是产生的效果,用evince打开
产生PS文件的C语言驱动如下
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { FILE *fp; fp=fopen("pstest","w"); fprintf(fp,"%s\n","%!PS-Adobe-3.0 EPSF-3.0"); fprintf(fp,"%s\n","%%For: Liyropt"); fprintf(fp,"%s\n","%%Title: Hello World"); fprintf(fp,"%s\n","%%Creator: Liyropt"); fprintf(fp,"%s\n","%%CreationDate: May 29 2011"); fprintf(fp,"%s\n","%%BoundingBox: (atend)"); fprintf(fp,"%s\n","%%DocumentFonts: (atend)"); fprintf(fp,"%s\n","%%LanguageLevel: 1"); fprintf(fp,"%s\n","%%Orientation: Landscape"); fprintf(fp,"%s\n","%%Pages: (atend)"); fprintf(fp,"%s\n","%%EndComments"); fprintf(fp, "\n\n%s\n\n","%Begin Programming"); fprintf(fp,"%s\n","%%BeginProlog"); fprintf(fp,"%s\n","/L {moveto rlineto currentpoint stroke moveto} bind def"); fprintf(fp,"%s\n","/C {rlineto currentpoint stroke moveto} bind def"); fprintf(fp,"%s\n","/D {moveto 0 0 rlineto currentpoint stroke moveto} bind def"); fprintf(fp,"%s\n","/LW {5 mul setlinewidth} bind def"); fprintf(fp,"%s\n","%%EndProlog"); fprintf(fp,"%s\n","%%BeginSetup"); fprintf(fp,"%s\n","/#copies 1 def"); fprintf(fp,"%s\n","%%EndSetup"); fprintf(fp,"%s\n","%%Page: 1 1"); fprintf(fp,"%s\n","%%BeginPageSetup"); fprintf(fp,"%s\n","0.072 0.072 scale"); fprintf(fp,"%s\n","8149 250 translate 90 rotate"); fprintf(fp,"%s\n","1 setlinejoin 1 setlinecap 1 LW 1"); fprintf(fp,"%s\n","%%EndPageSetup"); fprintf(fp,"%s\n","4 LW 8000 0 1150 1560 L 0 3000 5000 1200 L"); fprintf(fp,"%s\n","1 0.5 0 setrgbcolor"); fprintf(fp,"%s\n","/Times-Roman findfont"); fprintf(fp,"%s\n","200 scalefont"); fprintf(fp,"%s\n","setfont"); fprintf(fp,"%s\n","newpath"); fprintf(fp,"%s\n","4283 2545 moveto"); fprintf(fp,"%s\n","(Hello, world!) show"); fprintf(fp,"%s\n","closepath"); fprintf(fp,"%s\n","newpath"); fprintf(fp,"%s\n","1500 0 6500 1500 L 0 1500 8000 1500 L -1500 0 8000 3000 L 0 -1500 6500 3000 L "); fprintf(fp,"%s\n","closepath"); fprintf(fp,"%s\n","/inch {1500 mul} def"); fprintf(fp,"%s\n","newpath"); fprintf(fp,"%s\n","1 inch 1 inch moveto"); fprintf(fp,"%s\n","2 inch 1 inch lineto"); fprintf(fp,"%s\n","2 inch 2 inch lineto"); fprintf(fp,"%s\n","1 inch 2 inch lineto"); fprintf(fp,"%s\n","closepath"); fprintf(fp,"%s\n","fill"); fprintf(fp,"%s\n","stroke"); fprintf(fp,"%s\n","save restore showpage"); fprintf(fp, "\n\n%s\n\n","%End Programming"); fprintf(fp,"%s\n","%%PageBoundingBox: 220 42 529 708"); fprintf(fp,"%s\n","%%BoundingBox: 220 42 529 708"); fprintf(fp,"%s\n","%%Pages: 1"); fprintf(fp,"%s\n","%%EOF"); fclose(fp); }