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);
    }
    
  • 相关阅读:
    SQL 2012 Group By Rollup, Grouping
    SQL 2012 Restore HeaderOnly
    EasyPerformanceCounterHelper
    并发异步处理队列 .NET 4.5+ (改进性能计数器) 2013-11-16
    CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5
    csc.rsp Nuget MVC/WebAPI 5.0、SignalR 2.0、Rx、Json、Azure、EntityFramework、OAuth、Spatial
    MEF Parts Sample
    免费超高速卡片式病人基本信息列表控件
    微观云计算系列谈之一:基本概念
    golang 无法将Slice类型[]a 转换为 Slice[]b
  • 原文地址:https://www.cnblogs.com/liyropt/p/2062202.html
Copyright © 2011-2022 走看看