新浪網

  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(30):配置打印機
 


FreeBSD連載(30):配置打印機

http://www.sina.com.cn 1999年12月2日 23:09 王波

配置打印機

  本地打印機通常連接到計算機的并口上,因此在安裝打印機之前,首先要查看并口的狀態是否正常。正常情況下,缺 省的硬件配置將能夠自動偵測到計算機的并口,那么在啟動時,系統將在控制台上顯示下面的信息,如果由于滾屏太快而沒有 看到這一行的話,可以使用dmesg命令進行查看:

$ dmesg | grep lpt

nlpt0: on ppbus 0
nlpt0: Interrupt-driven port

  在FreeBSD 3.0之前使用lpt作為打印機的驅動程序,這個老驅動程序對于現有具備多個模式的并口硬 件支持能力不足。3.1之后系統的并口驅動程序更新了,使用了nlpt作為新的驅動程序名字,但設備文件的名字仍然為 /dev/lpt0。以后當老版本的驅動程序徹底從FreeBSD中消失之后,驅動程序名字會恢復為lpt。

  通常不需任何配置,并口就能正常工作。此時就可以通過設備文件/dev/lpt0來直接訪問并口(0表示第一 個并口,依次類推),如果并口和打印機的電纜連接也正常,就能測試打印機是否正常,此時需要root權限。

# lptest > /dev/lpt0

  如果對于普通行式打印機,這將打印出一頁測試信息,但如果打印機是使用PostScript或其他頁面描述語 言,打印機并不一定進行打印,但打印機的狀態指示燈將閃爍。如果打印機是PostScript打印機,可以使用下面命 令來測試:

# lptest | a2ps -q -o - > /dev/lpt0

  這需要預先通過Packages Collection安裝好a2ps軟件,其中使用的-q參數表示不輸出a2ps 的狀態信息,-o -參數表示向標准輸出輸出轉化后的PS數據,如果沒有使用這個參數,則a2ps直接將PS數 據發送給lpr命令,由于此時打印系統還未設置完畢,因此需要直接輸出到打印機端口上以進行測試。

  當這個測試正常之后,就可以嘗試使用lpr命令來打印文檔了。當然此時打印系統的設置還沒有完成,缺省的設置 并不一定適合每個計算機。應該調整打印設置,使得打印系統適合本系統。

  • 打印機配置文件printcap

  當并口和打印機連接正確之后,可以進行下一步配置/etc/printcap文件了。在BSD打印系統中,使 用這個printcap文件來定義打印機,包括命名打印機、將打印緩沖區和具體的打印機相聯系等。下面的例子中配置了 兩個打印機,一個為本地的LaserJet 6P型打印機,另一個為遠程FreeBSD計算機printersvr上 的打印機。

lp|lj|ps|HP LaserJet 6P:\

:lp=/dev/lpt0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:sh:mx#0:\
:if=/usr/local/libexec/lpfilter:

rlp|remote printer:\
:rm=printersvr:rp=lp:sd=/var/spool/output/lpd/printersvr:lf=/var/log/lpd-errs:

  從上面的例子可以看出printcap文件的格式:

  printcap中的每行描述由多個部分組成,每個部分用 “:” 分隔﹔由于對打印機的描述一行寫不下,必 須使用反斜杠 “\” 分隔,這是Unix和C語言的標准做法。為了避免出現配置錯誤等問題,不要在同一個描述部分的 中間續行﹔

  每行中的第一個描述部分定義打印機的名字,通常可以用多個名字來稱呼一個打印機,例如本例中第一個HP LaserJet 6P又有另外的名字lp、lj和ps,這些名字方便用戶和不同的程序使用打印機。這些名字之間使用豎線 “|” 分隔,習慣上使用最后一個名字作為打印機的全名﹔

  每個打印機的各個定義部分定義了打印機的不同屬性,定義方式就是上例中使用的方式,定義字符串使用 “=“ ,定義數值使用 “#” 。一個打印機應該具備下面的不同屬性:

  lp(local printer)定義本地打印機使用的設備,通常為并口設備/dev/lpt0。

  rm(remote machine)定義遠程計算機的名字,這在使用遠程打印機時有用。

  rp(remote printer)的值應該為rm定義的遠程計算機上的一個打印機名。遠程打印機不需要l p來定義打印機端口,但需要使用rm和rp定義,以將打印文件發送到遠程計算機上的正確打印機中。這個打印機名應該在 遠程計算機中/etc/printcap中進行了定義。如果沒有使用rp定義而只使用了rm定義,則使用該計算機上的 缺省打印機。

  sd(spool directory)定義這個打印機使用的緩沖區目錄,這個目錄一般放在/var/spo ol的下面,并擁有合適的權限設置,以使得打印系統能正確處理緩沖區。系統缺省使用/var/spool/lpd目錄 來放置要打印的文件,不同的打印機應使用這個目錄下的不同子目錄,習慣上這個目錄名與前面定義的打印機名字相一致。

  lf(log file)定義與這個打印機相聯系的日志文件,記錄出現的錯誤信息,習慣上放在/var/lo g目錄下。

  mx(maximum size)定義緩沖區中打印文件的最大尺寸,單位為千字節,缺省值為0,表示不限制打 印文件的大小。

  if(input filter)定義一個輸入打印過濾器,過濾器程序用于將用戶打印作業的格式轉變為打印機 能夠識別的格式。

  of(output filter)定義輸出過濾器,這也是一個打印過濾器,習慣上使用if的多些,使用of 的少些。如果if和of都沒有定義,打印系統則使用缺省的過濾器/usr/libexec/lpr/lpf。

  sh(suppress header),不打印標題頁。

  mc(maximum coyies)定義最大的打印份數,缺省為0不限制打印份數。

  br(baud rate)定義串口波特率,只有在使用串口打印機時才有用。

  當將prinrcap文件設置正確之后,就能夠使用打印命令lpr來打印文本文件了,由于沒有設置打印中文或 圖形的過濾器,打印系統只能打印英文文件,它將處理過的文件直接發送到打印機上進行打印。

  • 在PostScript打印機上打印

  大多數打印機不但能打印字符,也能夠打印圖形,應用軟件通過輸出控制字符對打印機進行控制。這些控制字符就被 稱為打印機控制語言。為了將字符和圖形文件輸出到打印機上,就需要過濾器將打印文件轉化為打印機識別的打印語言。

  打印過濾器是打印程序的一個重要部分,使Unix的打印系統更為靈活,從而能適合各種不同的打印機。除了將文 檔轉換為打印機識別的語言之外,還可以對要打印的文件做其他處理,例如某些行式打印機需要文檔同時使用回車和換行,而 Unix的文本文件只使用換行,此時直接打印文檔就會造成行列不齊,這些情況下就需要一個過濾器進行轉換。

  打印機控制語言可以分為兩類,一種將操縱打印機進行繪圖的命令及其他控制命令通過特殊字符(或特殊字符引導的 命令)來表示,對普通字符文件不作處理,直接發送到打印機。此時普通英文字符文件可以直接發送到打印機上打印,但要打 印包括圖形在內的文件就是包括特殊控制字符的二進制文件,不能用文本方式進行查看。另一種為Postscript語言 ,它使用頁面描述語言來描述要打印的內容,可以直接打印的文件就是一個符合一定語法規則的文本文件,因此對于一個Po stScript打印機來講,一個普通文本文件只是一個不合乎語法的PostScript語言文件,不能被直接打印。

  因此如果要在僅支持PostScript的打印機上打印普通文檔,也必須使用識別PostScript的過濾 器進行轉換,首先將普通文本文件轉換為PostScript語言,再發送給PostScript打印機進行打印。Fr eeBSD的Packages Collection中專門有一個類別print,提供了很多打印相關的軟件包,其中 包括很多種將文本文件轉換為PostScript文件的過濾器程序,如a2ps等。其中gb2ps能將GB編碼的文本 轉換未內嵌中文的PostScript文件,從而能在PostScript打印機上將中文文件打印出來。

  因此首先應該安裝這些轉換軟件包,當安裝了這些轉換程序之后,最簡單的使用方式是先使用他們將文檔轉換為Po stscript文件,再發送給打印命令lpr,這可以通過管道來實現。一些打印工具內部就包括了使用管道,自動將生 成的Postscript數據發送給lpr命令的指令,下面的a2ps指令就直接將PostScript文件發送給l pr命令。

  $ a2ps file

  或者可以在printcap文件中設置if參數,以自動使用這些過濾器,此時要設置過濾程序從標准輸入上讀入 數據,將PostScript數據從標准輸出上輸出。

   :if=/usr/local/bin/a2ps -q -o -:

  對于要使用gb2ps來打印中文文件的情況,由于gb2ps使用參數讀入源文件、并輸出PostScript 中文文件,不使用標准輸入輸出,因此不能直接使用gb2ps作過濾器程序,而需要自己使用臨時文件保存中間結果,生成 PostSript文件之后再打印。此外,gb2ps輸出的PostScript文件都包括一頁gb2ps的版權信息 ,對于打印來講沒有必要每次都打印這個版權頁,可以使用psutils中包括的psselect程序,從原有文件中去 除第一頁,再進行打印。

  高級的過濾器程序應該能夠識別各種不同格式的文檔文件,并依據文檔的格式,使用不同的過濾器功能來進行處理, 最后生成符合打印機描述語言的打印文件。

  • PostScript與Ghostscript

  PostScript使用命令來描述頁面,雖然也是文本文件,但這里都是繪圖指令,需要一個PostScript 語言解釋器對文件中描述的指令進行解釋操作,才能得到正確的結果。因此PostScript文件在普通打印機上只 能打印出源文件,同樣普通文檔在PostScript打印機上也不能正確解釋、打印出來。下面是一個PostScript 文件的開始部分:

%!PS-Adobe-3.0

%%Creator: gb2ps
%%CreationDate: Fri Oct 31 18:36:45 1998
%%DocumentNeededResources: font Symbol
%%+ font Courier
%%+ font Times-Roman
%%DocumentSuppliedResources: file images/file.ps
%%Pages: 32
%%PageOrder: Ascend
%%Orientation: Portrait
%%EndComments
%%BeginProlog

  如果要查看PostScript的內容,則需要一個頁面語言解釋器。雖然存在不少商業PostScript解 釋器,但大部分并不見得比Ghostscript好,雖然GhostScript只是一個免費的PostScript 解釋器。GhostScript能在X Window下正確顯示PostScript文件的內容,并能實現各種強大的 PostScript處理能力。Ghostscript是一個相當復雜的程序,如果僅僅是要查看Postscript 文件的內容,可以使用命令 “gs psfile.ps” ,退出時在Ghostscript提示下輸入 “quit ” 即可。

$ gs psfile.ps

Aladdin Ghostscript 5.50 (1998-9-16)
Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS> quit

  另外,Ghostscript有一個前端程序Ghostview,能使用Ghostscript來瀏覽PostScript 文件,但使用了比較簡單的圖形操作方式。Ghostscirpt和Ghostview都可以通過Packages Collection 安裝。

  • 在非PostScript打印機上打印

  通常非PostScript打印機使用特殊的ESC序列來表示命令,而對普通文本不做特殊處理,因此文本文件 仍然被看作文本文件,能夠直接打印文本文件,因此這些非PostScript的打印機能夠直接設置為普通的文本打印機 來使用。

  然而要想充分發揮打印機的能力,打印包括圖形在內的文檔,就必須有能理解這台非PostScirpt打印機使 用的控制語言的過濾器。這些過濾器就相當于Windows下的打印機驅動,應該由生產這台打印機的廠商提供。但是很多 低檔打印機是專門為使用DOS或Windows的計算機生產的,沒有為Unix配置過濾器,因此在這些打印機上打印圖 形就遇到了困難。幸運的是,Ghostscript能夠識別很多種打印機,并能將PostScript文件在指定的設 備上打印出來。

  因此在前面的操作中生成了Postscript文件之后,就可以使用Ghostscript在一台非Post Script打印機上打印PostScript文件,下面文件將在一台Laserjet4打印機上打印test.ps 文件。

# gs -sDEVICE=ljet4 -sOutput=/dev/lpt0  test.ps

使用gs -help能列出一系列Ghostscrit支持的設備文件,有些是打印機設備,有些是代表不同的圖形格式的偽設備。
$ gs -help
Aladdin Ghostscript 5.50 (1998-9-16)
Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
Usage: gs [switches] [file1.ps file2.ps ...]
Most frequently used switches: (you can use # in place of =)
-dNOPAUSE no pause after page | -q `quiet', fewer messages
-gx page size in pixels | -r pixels/inch resolution
-sDEVICE= select device | -dBATCH exit after last file
-sOutputFile= select output file: - for stdout, |command for pipe,
embed %d or %ld for page #
Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PDF
Available devices:
appledmp iwhi iwlo iwlq hl7x0 bj10e bj200 bjc600 bjc800 lbp8 lips3 m8510
uniprint la50 la70 la75 la75plus lj250 declj250 ln03 ap3250 epson eps9mid
eps9high lp8000 lq850 epsonc st800 stcolor lp2563 dnj650c deskjet djet500
cdeskjet djet500c cdjcolor cdjmono cdj500 cdj550 cdj670 cdj850 cdj890
cdj1600 laserjet ljetplus ljet2p ljet3 ljet3d ljet4 lj4dith cljet5
lj5mono lj5gray pj pjetxl pjxl paintjet pjxl300 pxlmono bbox pxlcolor
ibmpro jetp3852 imagen cp50 necp6 oce9050 oki182 okiibm r4081 sj48 xes
bmpmono bmp16 bmp256 bmp16m ccr cgmmono cgm8 cgm24 sxlcrt dfaxhigh
dfaxlow faxg3 faxg32d faxg4 bit bitrgb bitcmyk cif miff24 inferno jpeg
jpeggray mgrmono mgrgray2 mgrgray4 mgrgray8 mgr4 mgr8 pcxmono pcxgray
pcx16 pcx256 pcx24b pcxcmyk pdfwrite plan9bm pbm pbmraw pgm pgmraw pgnm
pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pngmono pnggray png16 png256
png16m psmono psgray psrgb pswrite epswrite sgirgb t4693d2 t4693d4
t4693d8 tek4696 tiffcrle tiffg3 tiffg32d tiffg4 tiff12nc tiff24nc tifflzw
tiffpack x11 x11alpha x11cmyk x11cmyk2 x11cmyk4 x11cmyk8 x11gray2
x11gray4 x11mono nullpage
Search path:
. : /usr/local/share/ghostscript/5.50 :
/usr/local/share/ghostscript/fonts
For more information, see /usr/local/share/ghostscript/5.50/doc/Use.htm.
Report bugs to ghost@aladdin.com, using the form in Bug-form.htm.

  從這些簡單的名字中很難判斷那個設備對應于自己的打印機型號,為了找出正確的設備文件名,需要閱讀Ghost script的文檔device.txt,或者選擇相近的設備名并反復嘗試。如果萬一找不到自己的文件名,也許要升級 Ghostscript的版本,或者更新自己Ghostscript的設備驅動之后再重新安裝Ghostscript 。

  當能夠使用Ghostscript打印文檔之后,就需要將它和FreeBSD的打印過濾器集成在一起了,因此 首先要將打印的文檔轉換為PS文檔,然后將PS文檔轉換為打印機支持的格式,因此就需要更改過濾程序。例如在一個EP SON行式打印機上輸出文檔,使用的標准過濾應該是,最后兩個短橫線表示標准輸出和標准輸入:

#! /bin/sh

a2ps -q -o - | \
gs -sDevice=epson -sOutfile=- -

  • 使用apsfilter配置打印機
  • 設置打印機要手工編輯/etc/printcap文件,安裝并配置各種過濾器,安裝Ghostscript等。這些操作都非常煩瑣,幸好FreeBSD通過Ports Collection提供了一種自動配置打印機的apsfilter程序。

    Ports Collection的機制、用法將在后面討論。

    為了使用apsfilter設置打印機并配置過濾器,就需要執行下列命令:

    # cd /usr/ports/print/apsfilter/
    
    # make install

      然后,系統將自動下載、編譯安裝必要的過濾器軟件,此后將自動啟動一個設置程序,通過菜單提示讓用戶選擇打印 機的各種屬性,包括打印機的類型、端口、分辨率、紙張大小等等。最后將自動生成合適的printcap文件和各種過濾 器。這些過濾器能分辨要打印文件的類型,進行正確的處理。

      apsfilter生成的過濾器是調用包括ghostscript在內的大量其他軟件,因此上面的make過 程就需要從網絡上下載必要軟件包,可以通過預先安裝相應的Packages以減少下載任務。如果網絡太慢,下載過程可 能會出現問題導致軟件安裝問題,后面會講到如何為Ports Collection手工下載必要的軟件包。

    • 使用和控制打印機

      當一切都配置正確之后,使用打印機就非常簡單了。為了自動啟動lpd守護進程,需要將/etc/rc.con f文件中的lpd_enable項設置為lpd_enable=”Yes”,FreeBSD在下次系統啟動時會自動啟 動lpd。當lpd沒有啟動時,也不需要重起計算機,簡單使用root身份執行lpd就可以啟動這個守護進程。有了l pd守護進程,打印系統就能正常進行打印工作,并能針對整個網絡上的用戶,提供打印服務了。

      使用者可以直接使用lpr命令打印文件,或者通過管道來使用lpr命令。

    $ lpr hello.c
    
    $ ls | lpr

      如果系統中某個打印機沒有配置打印過濾器,用戶可以直接使用自己的打印過濾器,通過管道將輸出送到lpr中。 這提供了一種較靈活的配置方式,使得用戶不需要root權限,也能使用合適的打印機過濾器。下面是一個使用gs打印文 件的例子:

    $ gs -dNOPAUSE -q -sljet4 -sOutputFile=\|lpr -- tt.ps

      注意這個例子中使用反斜線取消豎線的特殊含義,將其和緊隨其后的lpr一起作為參數發送給gs,gs再將其解 釋為管道操作。可以將上面的文件編制成shell程序,這樣每次就能更方便的使用。

      當使用lpr將打印作業放入打印緩沖區之后,就能使用lpq命令來查看打印隊列的內容:

    $ lpq
    
    waiting for lp to become ready (offline ?)
    Rank Owner Job Files Total Size
    1st user 1 hello.c 151 bytes
    2nd user 2 (standard input) 3359 bytes
    3nd user 3 (standard input) 43765 bytes

      在這個例子中,由于打印機lp沒有被正常連接到系統上,因此lpq在第一行提醒使用者當前打印機不正常。由于 這台打印機工作不正常,因此用戶可能不想使用這個打印機進行打印了,而想通過其他打印機進行打印。為了避免在這台打印 機正常之后,仍然打印這個作業,需要將這個打印作業刪去。這可以通過命令lprm加上作業序號(顯示在lpq中第三列 )來完成:

    $ lprm 1
    
    dfA001freebsd.domain dequeued
    cfA001freebsd.domain dequeued

      或者使用all作參數,這將刪除該用戶的所有打印作業。用戶只能刪除自己的打印作業,只有root才能刪除其 他用戶的作業。如果root使用all參數,那么將會將這個打印機緩沖區中的所有打印作業全部清空。

      作為系統管理員,需要進一步的能力來管理打印守護程序。BSD風格的打印系統使用lpc來執行這個功能,以 root身份啟動lpc,則進入lpc的交互模式,然后使用help命令可以得到管理命令的列表。一般可以使用start all 命令來啟動所有的打印機,或者使用stop lp命令來停止一台名為lp的打印機。

    # lpc
    
    lpc > start all

      也可以用命令行的方式使用lpc,例如重新啟動所有的打印機,使用帶參數的lpc發出以下命令:

    # lpc restart all

    未完,待續。。。  



     
      新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(30):配置打印機


    網站簡介 | 網站導航 | 廣告服務 | 中文閱讀 | 聯系方式 | 招聘信息 | 幫助信息

    Copyright(C) 1999 SINA.com, Stone Rich Sight. All Rights Reserved

    版權所有  四通利方 新浪網