11.4 高級打印機設置 11.4.2 Header Pages 如果你有很多使用者使用不同的打印機,那麼你也許會覺得需要打印header pages.Header pages,也稱做banner 或burst pages,是用來辨認打出來的工作是屬於誰的。通常header pages 以粗體的大字,可能再加上外框打出來的,如此,使用者才能快速的在一堆打出的結果找到屬於自己的部分。不過header page 的缺點就是每個工作都會多使用一張紙來打印header page.它的功用可能不會超過一分鐘,而最後的下場都是丟進資源回收箱或是垃圾筒。(不過header pages 是一份工作一張,而不是一個文件一張,所以紙張的浪費可能沒有你想象的那麼嚴重)。 如果你的打印機可以直接打印純文本的話,那麼LPD 可以自動為你的輸出加上headerpages.如果你的打印機是PostScript 的,那麼你將會需要額外的程序來產生header page;請閱讀在PostScript 打印機上打印Header Pages 這一節。 11.4.2.1 啟用header pages 在簡單的打印機設置這節裡,我們在/etc/printcap 文件裡利用設置sh 以不打印headerpage (sh 即“suppress header”的意思)。如果某一台打印機要打印header pages 的話,那麼只要將sh 關鍵詞刪除就行了。 看起來是不是很簡單? 沒錯。你也許需要提供一個輸出用過濾程序將初始化句柄送給打印機。下面是一個適用於Hewlett Packard PCL 兼容打印機使用的輸出用過濾程序: #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf “\033&k2G” exit 2 第39 頁FreeBSD 使用手冊 exec /usr/libexec/lpr/lpf 我們用of 關鍵詞來指定輸出用過濾程序的路徑。請閱讀輸出用的過濾程序這一節以取得更多的信息。 下面是一個為我們先前提到的打印機teak 在teak 文件裡設置要打印header pages 及輸出用過濾程序的例子: # # /etc/printcap for host orchid # teakhplaserjetHewlett Packard LaserJet 3Si::lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0::if=/usr/local/libexec/hpif::vf=/usr/local/libexec/hpvf::of=/usr/local/libexec/hpof: 現在,當使用者用teak 打印時,它們每個工作都會有一張header page.如果使用者們願意花時間自己找出自己打出的東西,那麼它們可以用lpr -h 命令設置不打出header pages;請閱讀Header Page 參數以得知更多lpr 的參數。 注意: LPD 打完header page 後會送出form feed 字符。如果你的打印機送出紙張的命令不是用這個字符,你可以在/etc/printcap 文件中用ff 關鍵詞指定。 11.4.2.2 控制header pages 如果選擇要打印header pages,LPD 將會產生出long header,這將使用者、機器以及工作名稱以大字打印在一整頁上。這裡有一個例子(kelly 從rose 這台印機打印outline 這個工作): k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y 第40 頁ll FreeBSD 使用手冊 k k e e l l y yy k k eeee lll lll yyy y y y y yyyy t l i t l oooo u u ttttt l ii n nnn eeee · o u u t l i nn n e e · o u u t l i n n eeeeee · o u u t l i n n e · o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD 在打印完這些後會送出form feed 字符,使得真正的打印工作會以新的一頁開始打印(除非你在/etc/printcap 文件為指定的打印機設置了sf (supress form feeds))。第41 頁FreeBSD 使用手冊 如果你希望LPD 打印short header,那麼在/etc/printcap 文件裡使用sb (short banner)即可。這樣打出來的header page 看起來會像下面這個樣子: rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 LPD 的默認值是先打印header page 再打印工作。如果你想要調換順序,那麼在/etc/printcap 裡使用hl (header last) 即可。 11.4.2.3 統計打印 如果我們打印LPD 內建的header pages,那麼在做統計時可能會遇到一個問題:headerpages 得免費提供。為什麼?因為只有控制打印header page 的輸出用過濾程序可以在打印header pages 時做打印統計,但是這個過濾程序卻沒有使用者及機器的資料或是一個統計資料文件,所以無法向使用者收錢。我們也不能在文字過濾程序或是轉換用過濾程序(這些過濾程序可以直接取得使用者及機的資料)將統計結果都“多加上一頁”,因為使用者可以用lpr -h 命令設置不要打印header page,而你可能就向這些使用者多收了打印header page 的費用。基本上,lpr -h 是許多較環保的使用者喜好的參數,你無法鼓勵別人不去使用它。而修改每個過濾程序使它們都可以打出header page 也是不可行的(雖然這麼做就可以正確的計費)。因為LPD 並不會把使用者有沒有使用-h 的信息傳給過濾程序,這麼一來,即使使用者下了lpr -h 的命令要求不打印header page,它仍然會因為得到一張header page 而多收取了這個費用。 那麼,有什麼好辦法呢? 你可以: 1. 接收LPD 的缺點,不收取打印header page 的費用。 2. 安裝可以取代LPD 的程序,比如說LPRng 或是PLP。請參考標准Spooler 之外的選擇 這一節所介紹其它可以替代LPD 的程序。 3. 撰寫一個聰明的輸出用過濾程序。在打印header page 及純文本時,如果沒有文字(輸入用)過濾程序,那麼一般的輸出用過濾程序只做初始化打印機以及一些簡單的字符轉換工作。如果有設置文字過濾程序,那麼LPD 只會用輸出用過濾程序來做打印header page的工作。事實上,輸出用過濾程序可以根據從LPD 產生的header page 資料來判斷打印工作的使用者及機器而加以收費。唯一的問題就是輸出用過濾程序會無法取得記錄使用情況的記錄文件(由af 關鍵詞所指用的記錄文件不會被傳入),但是如果你的記錄文件是固定的,你可以這個文件直接設置在輸出用過濾程序裡。如果你考慮要用這種方式來第42 頁FreeBSD 使用手冊處理的話,那麼在/etc/printcap 文件使用sh (short header) 關鍵詞使判斷的工作較容易。上述的做法其實可能是很麻煩的,比較起來,使用者應該會較感謝讓打印header page免費的管理者。 # Check arguments # 11.4.2.4 在postscript 打印機上打印header pages 前面提到LPD 可以為打印機產生合適的純文本header page,當然,因為PostScript 不能直接打印純文本,所以LPD 產生header page 的工能在PostScript 打印機上是用不到的—或是幾乎用不到。 一個直接產生header page 的方法是讓所有的轉換用過濾程序及文字過濾程序產生header page.過濾程序可以讓使用者及機器的參數產生合適的header page.這個方法的缺點就是即使使用者以lpr -h 的方式送出工作,它們仍然會得到header pages.讓我們來試試這個方法。下面的script 可以接收三個參數(使用者名稱、機器名稱以及工作名稱)並產生PostScript 打印機能打印的header page: #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # 第43 頁if [ $# -ne 3 ]; then exit 1 fi # # user=$1 host=$2 job=$3 date=‘date‘ # # exec cat