📄 00000017.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: SuperSB (孤鹰), 信区: Linux <BR>标 题: [转载]unix环境高级编程-17 <BR>发信站: BBS 水木清华站 (Wed Mar 15 14:31:48 2000) <BR> <BR> <BR> <BR> <BR>发信人: taosm (128+64-->cool), 信区: unix <BR>标 题: unix环境高级编程--第17章 与PostScript打印机 <BR>发信站: 西十八BBS (Sat Mar 11 14:13:45 2000), 转信 <BR> <BR> <BR>第十七章 与PostScript打印机通信 <BR>17.1 引言 <BR> 我们现在开发一个可以与Postscript打印机通信的程序。PostScript打印机目 <BR>前使用很广,它一般通过RS-232端口与主机相连。这样就使得我们有可能使用第十 <BR>一章中的终端I/O函数。同样,与PostScript打印机通信是全双工的,我们发送数 <BR>据给打印机时也要准备好从打印机读取状态消息。这样,我们又有可能使用12.5节 <BR>中的I/O多路转接函数:select 和poll。我们所开发的这个程序是基于James Cla <BR>rk 所写的lprps程序。这个程序和其他一些程序共同组成lprps软件包,可以在co <BR>mp.sources.misc新闻组中找到(Volume 21,1991年7月)。 <BR>17.2 PostScript 通信机制 <BR> 关于PostScript打印机所需要知道的第一件事就是我们并不是发送一个文件给 <BR>打印机去打印-我们只是发送一个PostScript程序给打印机让它去执行。在PostSc <BR>ript打印机中通常有一个PostScript解释器来执行这个程序,生成输出的页面。如 <BR>果PostScript程序有错误,PostScript打印机(实际上是PostScript解释器)返回 <BR>一个错误消息,或许还会产生其他输出。 <BR> 下面的PostScript程序在输出页面上生成一个熟悉的字符串hello, world。( <BR>我们这里并不叙述PostScript编程,详细情况请参见Adobe Systems[1985和1986] <BR>。我们着重在与PostScript打印机的通信上)。 <BR>%! <BR>/Times-Roman findfont <BR>15 scalefont % point size of 15 <BR>setfont % establish current font <BR>300 350 moveto % x=300 y=350 (position on page) <BR>(hello, world) show % output the string to current page <BR>showpage % and output page to output device <BR> 如果我们在PostScript程序中改变setfont 为ssetfont,再把它发送到PostS <BR>cript打印机,结果是什么也没有被打印。相反的,我们从打印机得到以下消息: <BR> <BR>%% [ Error: undefined; OffendingCommand: ssetfont ]%% <BR>%% [ Flushing: rest of job (to end-of-file) will be ignored ]%% <BR> 这些错误消息随时都可能产生,这也是处理PostScript打印机复杂的地方。我 <BR>们不能只是将整个PostScript程序发送给打印机后就不管了-我们必须处理这些潜 <BR>在的错误消息。(在这一章中,我们所说的"打印机",就是指PostScript解释器。 <BR>) <BR> PostScript打印机通常通过RS-232串口与主机相连。这就如同终端的连接一样 <BR>,所以我们在第十一章中的终端I/O函数在这里也适用。(PostScript打印机也可 <BR>以通过其它方式连接到主机上,例如网络接口逐渐流行。但目前占主导地位的还是 <BR>串口相连。)图17.2 显示了典型的工作过程。一个PostScript程序可以产生两种 <BR>形式的输出:通过showpage操作输出到打印机页面上,或者通过print操作输出到 <BR>它的标准输出(在这里是与主机的串口连接)。 <BR> PostScript解释器发送和接受的是七位ASCII字符。PostScript程序可包含所 <BR>有可打印的ASCII字符。一些不可以打印的字符有着特殊的含义(参见图17.1)。 <BR> <BR>图17.1 从主机发送到PostScript打印机的特殊字符 <BR>图17.2 用串口连接与Postscript打印机通信 <BR> PostScript的文件终止符(Control-D)用来同步打印机和主机。我们发送一 <BR>个PostScript程序到打印机,然后再发送一个EOF到打印机。当打印机执行完Post <BR>Script程序后,它就发回一个EOF。 <BR> 当PostScript解释器正在执行一个PostScript程序时,我们可以向它发送一个 <BR>中断(Control-C)。这通常使正在被打印机执行的程序终止。 <BR>状态查询消息(Control-T)会使得打印机返回一个一行的状态消息。所有的打印 <BR>机消息都是如下格式: <BR>%% [ key : val ] %% <BR> 所有可能出现在状态消息中的key: val对,被分号分开。回忆前面例子的返回 <BR>消息: <BR>%% [ Error: undefined; OffendingCommand: ssetfont ]%% <BR>%% [ Flushing: rest of job (to end-of-file) will be ignored ]%% <BR> 这个状态消息具有这个格式: <BR>%% [status : idle ]%% <BR> 除了idle(没有作业)外,其它状态指示还有busy(正在执行一个PostScrip <BR>t程序)、 waiting(正在等待执行PostScript程序)、 printing(打印中)、i <BR>nitializing(初始化)和printing test page(正打印测试页)。 <BR> 现在来考虑PostScript解释器自己产生的状态消息。我们看到以下的消息 <BR>%% [ Error: error ; OffendingCommand : operator ]%% <BR>总共大约会发生25种不同的错误。通常的错误有dictstackunderflow, invalidac <BR>cess, typecheck, 和undefined。这里的operator是产生错误的PostScript操作。 <BR> <BR> 一个打印机的错误用以下形式来指示。 <BR>%% [ PrinterError: reason ]%% <BR> 这儿的reason一般是Out Of Paper(缺纸)、Cover Open(盖打开)等错误。 <BR> <BR>当错误发生时,PostScript解释器经常会发出另外一个消息 <BR>%% [ Flushing : rest of job (to end-of-file) will be ignored ] %% <BR> 我们看一下在特殊字符序列%%[和]%%中的字符串,为了处理这个消息,我们必 <BR>须分析该字符串。一个PostScript程序也可以通过PostScript的print操作来产生 <BR>输出。这个输出应当传给发送程序给打印机的用户(虽然这并不是我们的打印程序 <BR>所期望解释的)。 <BR> 图17.3 列出了PostScript解释器传送给主机的特殊字符。 <BR>图17.3 PostScript解释器传送给主机的特殊字符 <BR>17.3 假脱机打印 <BR> 我们在本章所开发的程序通过两种方式发送PostScript程序给PostScript打印 <BR>机,单独的方式或者通过BSD行式打印机假脱机系统。通常使用假脱机系统,但提 <BR>供一个独立的方式也是很有用的,如用于测试等。 <BR> Unix SVR4同样提供了一个假脱机打印系统,在AT&T手册[1991] 第一部分以l <BR>p开头的手册页中可以找到假脱机系统的详细资料。Stevens[1990]的第13章详细说 <BR>明了BSD和pre-SVR4的假脱机系统。我们在这一章中并不着重在假脱机系统上,而 <BR>在于与PostScript打印机的通信。 <BR> 在BSD的假脱机系统中,我们以如下形式打印一个文件 <BR>lpr -pps main.c <BR> 这个命令发送文件main.c到名为ps的打印机。如果我们没有指定-pps的选项, <BR>那么或者输出到PRINTER环境变量对应的打印机上,或者输出到缺省的lp打印机上 <BR>。所用的打印机参数可以在/etc/printcap文件中查到。图17.4是对应一个PostSc <BR>ript打印机的一项。 <BR> lp|ps:\ <BR> :br#19200:lp=/dev/ttyb:\ <BR> :sf:sh:rw:\ <BR> :fc#0000374:fs#0000003:xc#0:xs#0040040:\ <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -