zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    鼠标滑动带动画下拉展开的滑动门代码
    很靓很大气的简约红色CSS菜单代码
    用Cookie来保存菜单当前位置代码
    单击单选按钮切换对应的菜单代码
    仿微软中国的滑动门导航菜单代码
    C#创建SQLServer的存储过程
    通过应用程序域AppDomain加载和卸载程序集(转载)
    多线程学习笔记一(转载)
    C#实现Treeview节点"正在载入..."效果
    JavaScript 学习笔记之函数理解二
  • 原文地址:https://www.cnblogs.com/liyropt/p/2062202.html
Copyright © 2011-2022 走看看