線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3931
推到 Plurk!
推到 Facebook!

如何在 Linux 下列印

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-14 02:15:06 IP:218.175.xxx.xxx 未訂閱
如何在 Linux 下列印 http://www.imacat.idv.tw/tech/lnxprint.html     
目錄
前言 
零、最最快速的安裝說明 
接好印表機 
安裝設定 LPRng 
安裝設定 samba 
安裝設定 Windows 下的網路印表機 
一、 Linux 列印基本概念 
二、實際列印流程 
三、設定指南 
接好印表機 
安裝 Ghostscript 
安裝 PostScript 轉換程式 
安裝設定 ifhp 
安裝設定 LPRng 
安裝設定 samba 
安裝設定 Windows 下的網路印表機 
四、註釋 
五、參考資料 
前言
這是我自己寫的「如何列印」,原本只是一篇小筆記,因為設定印表機的過程很累很複雜,為了怕我自己日久生疏,而寫給自己看的。後來越寫越長,寫成了完整的 Linux 列印設定教學。    本文是採用 samba - LPRng - ifhp filter - ghostscript uniprint 驅動程式搭配的列印架構。如果妳是用別的搭配方式,設定會有所不同。    本文作者是我一個人,未曾受過各個列印程式作者的授權,也未曾和各個作者討論,內文所述不能代表各列印程式的正式文件。本文或有疏失、遺漏、偏頗、錯誤之處,還請不吝告知,謝謝。    零、最最快速的安裝說明:
如果妳只是要把印表機分享給 Windows 工作站用,或只是要設定一個 Windows 工作站用的 print server ,完全不要在 Linux 下印表,請依下列步驟。如果妳真的是要「在 Linux 下設定印表機」,要在 Linux 下列印,或想更深入瞭解 Linux 下列印的架構,請跳過這一段。    接好印表機:
把印表機接到 LPT1 ,做下述測試:    % echo "Hello, world!" >> /dev/lp0    如果印表機有反應,把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[1]    安裝設定 LPRng :
下載最新版的 LPRng : http://www.lprng.com/ 。 
解壓縮、編譯安裝 LPRng : 
% tar xzf LPRng-x.x.x.tgz
% cd LPRng-3.x.x
% ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --disable-setuid
% make
% make test
% su
$ make install    設定 /etc/printcap 如下: 
# 最簡化的 printcap 設定,只給 samba 客戶端列印使用
lp:
        :lp=/dev/lp0
        :sd=/var/spool/lpd/%P    測試: 
$ checkpc -f
$ echo "Hello, world!" | lpr    這時印表機應該會有反應。把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[註 24] 
安裝設定 samba :
下載、安裝 samba : http://www.samba.org/samba/samba.html 。(這不在本文的範圍內,請自行參考 samba 的安裝設定說明。) 
設定列印分享:在 /etc/smb.conf (或 /usr/local/samba/lib/smb.conf ), [printers] 節中設定如下: 
[printers]
        comment = Printers
        printable = yes
        browsable = no
        public = no
        valid users = @users
        
        printing = lprng
        path = /var/spool/lpd/samba
        print command = /usr/bin/lpr -P%p -r %s
        lpq command = /usr/bin/lpq -P%p
        lprm command = /usr/bin/lprm -P%p %j
        lppause command = /usr/sbin/lpc hold %p %j
        lpresume command = /usr/sbin/lpc release %p %j
        queuepause command = /usr/sbin/lpc -P%p stop
        queueresume command = /usr/sbin/lpc -P%p start    存檔後,記得要開一個 /var/spool/lpd/samba 的目錄,擁有者是 root ,權限是 1777 。 
測試:用 testparm 檢查 smb.conf , 
$ /usr/local/samba/bin/testparm    如果沒有問題,重開 samba ,回到 Windows 工作站,從網路上的芳鄰中重新整理,看看能不能看得到這臺印表機。[註 26] 
安裝設定 Windows 下的網路印表機:
這部份請參考 Windows 的說明,和印表機說明書的安裝設定說明。記得要印一張測試頁,測試看看    一、 Linux 列印基本概念
 style="float: right;" /> 
Linux 列印的基本做法如下:    依要列印的檔案的類型,以各種不同的 xxx2ps PostScript 轉換程式,統一轉為列印專用的標準 PostScript 格式。 
將轉換後的 PostScript 格式資料傳送給 PostScript 印表機模擬程式 Ghostscript 。 Ghostscript 配合印表機的驅動程式,將 PostScript 格式資料再轉為低階印表機指令,傳送給印表機埠上的印表機。         二、實際列印流程
圖中虛線為 Windows / samba 網路印表機列印資料傳送流程。    
由 samba 列印分享送出資料。(可省略。) 
由 LPRng 列印程式( lpr )列印檔案,主要設定檔為 /etc/printcap 。 
由 ifhp 或其她列印濾鏡( filter )配合 file ,判斷檔案類型後分別處理,設定檔為 /etc/ifhp.conf 。 
若不是 raw 或純文字等可以直接列印的檔案格式,則由各種 PostScript 轉換程式統一轉為 PostScript 格式。 
由 Ghostscript (with uniprint) PostScript 印表機模擬器處理 PostScript 格式的資料,轉為低階印表指令印出。 
三、設定指南
我們從最下層往上設定起:    接好印表機:
把印表機接到 LPT1 ,做下述測試:    % echo "Hello, world!" >> /dev/lp0    如果印表機有反應,把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[1]    安裝 PostScript 印表機模擬器 Ghostscript (with uniprint) :
印表機硬體通訊傳輸一切正常,可以直接列印英文後,接下來我們要讓她列印 PostScript 文件。如果妳的印表機本身就是 PostScript 印表機,(那妳一定非常有錢,不然就是在公司或學校電算中心,)可以直接列印 PostScript ,可以跳過這一段。    PostScript 是列印專用的文件格式,是 1985 年由 Adobe 制定的。[2] 大多數雷射印表機都可以直接列印 PostScript 文件。不過我想妳和我的便宜噴墨(或點矩陣)印表機,應該都辦不到,所以我們繼續往下看。    Ghostscript 是 PostScript 印表機模擬程式,透過軟體模擬,可以讓非 PostScript 印表機,也能印出 PostScript 文件。如此一來,就可以把我們的廉價印表機,當成貴貴的 PostScript 印表機來用了。[3]    Ghostscript 的工作是轉譯印表指令,將 PostScript 指令,轉譯成各種印表機專用的低階列印指令,送印表機執行。因此, Ghostscript 需要知道各種印表機的指令語言。這就是所謂的「驅動程式」。有的印表機 Ghostscript 有隨附驅動程式,有的沒有。沒有隨附驅動程式的時候,妳可以上 LinuxPrinting 印表機資料庫找,有沒有別人寫過妳印表機的 Ghostscript 驅動程式,下載來用。除非是 uniprint 驅動程式,否則下載後,要再重新編譯 Ghostscript 。    uniprint (Unified Printer Drivers) 原先是設計給 Epson Stylus Color 系列的一種 Ghostscript 驅動程式規格,下載後可以直接存檔使用,不用重新編譯 Ghostscript 。 uniprint 驅動程式的附檔名是 .upp 。[4]    安裝 Ghostscript 前要先安裝 zlib 、 libpng 、 jpeg 。這些不在本文範圍內,請參考各自的安裝說明。 
下載最新版的 Ghostscript :[5] 
AFPL Ghostscript: http://www.ghostscript.com/ 。 
GNU Ghostscript: http://www.cs.wisc.edu/~ghost/ 。 
下載時,要連同 Ghostscript 字型一起下載安裝: http://www.cs.wisc.edu/~ghost/doc/AFPL/get700.htm 。 
解壓縮、編譯安裝 Ghostscript : 
% tar xzf gnu-gs-6.52.tar.gz 或 ghostscript-x.xx.tar.gz
% cd gsx.xx
% ln -s src/unix-gcc.mak Makefile    編輯 Makefile ,修改安裝的位置: 
prefix = /usr    接著安裝: 
% make
% make test
% su
$ make install    然後,到 /usr/share/ghostscript/ 下,解壓縮 Ghostscript 字型: 
$ cd /usr/share/ghostscript/
$ tar xzf ghostscript-fonts-std-x.x.tar.gz
$ tar xzf ghostscript-fonts-other-x.x.tar.gz    設定妳的印表機型號和驅動程式。請查 Ghostscript 印表機說明,找到妳印表機的代號,或是妳印表機的 uniprint 驅動程式名稱。如果沒有,妳可以上 LinuxPrinting 印表機資料庫找別人寫的驅動程式。[6] 下載驅動程式後,如果不是 uniprint ,妳要重新編譯 Ghostscript ;否則,只要存到 /usr/share/ghostscript/x.xx/ 下,和其她 .upp 驅動程式存在一起,就可以了。 
測試: /usr/share/ghostscript/x.xx/examples/ 下有一些 PostScript 範例檔,我們來印看看。如果妳的印表機不是 uniprint 驅動程式, 
$ cd /usr/share/ghostscript/x.xx/examples/
$ gs -sDEVICE=xxxxxxxx -sOutputFile=/dev/lp0 tiger.ps    xxxxxxxx 是妳印表機的代號;如果是 uniprint , 
$ cd /usr/share/ghostscript/x.xx/examples/
$ gs @xxxxxxxx.upp -sOutputFile=/dev/lp0 tiger.ps    xxxxxxxx.upp 是 uniprint 驅動程式檔名。如果 Ghostscript 可以順利讀到驅動程式,就會印出一隻大老虎了。[7] 妳可以把這一行設定成 alias ,加在 ~/.bashrc 下: 
alias gs="gs -sDEVICE=xxxxxxxx -sOutputFile=/dev/lp0"    安裝各種 xxx2ps PostScript 轉換程式:
可以列印 PostScript 後,要印其她的檔案,只要統一轉為 PostScript ,就可以印了。 PostScript 的轉換程式很多也很瑣碎,安裝設定都很簡單,在這裏就不詳述了。以下列出幾種常見的 xxx2ps PostScript 轉換程式:    純文字 ASCII text : a2ps http://www-inf.enst.fr/~demaille/a2ps/ 。[8] 
HTML 文件 : html2ps http://www.tdb.uu.se/~jan/html2ps.html 。 
PDF 文件: pdf2ps ,附在 ghostscript 中。[9] 
圖檔: netpbm http://netpbm.sourceforge.net/ 。[10][11] 
安裝完後,記得要測試轉換後的 PostScript 檔能不能印。    $ echo "Hello, world" | a2ps -o - | gs -
$ html2ps < /usr/local/apache/htdocs/index.html | gs -
$ gs mypdf.pdf
$ giftopnm < mygif.gif | pnmtops | gs -
$ jpegtopnm < myjpeg.jpg | pnmtops | gs -
$ pngtopnm < mypng.png | pnmtops | gs -
$ bmptoppm < mybmp.bmp | pnmtops | gs -
$ tifftopnm < mytiff.tif | pnmtops | gs -
$ ...    以後要列印,只要用 PostScript 轉換程式轉為 PostScript ,就一切 OK 囉。到此,我們已經可以「列印」了。不管要印什麼,都通行無阻。    安裝設定列印資料濾鏡 ifhp filter :
可以列印還不夠。印不同的檔案,要跑不同的轉換程式,把檔案格式轉來轉去。這樣太麻煩了。我們需要一個智慧型程式,自動判斷檔案類型,呼叫要用的轉換程式。這就是 filter 列印資料濾鏡。 filter 的原理其實很簡單,有興趣的話,看完以下的說明,妳也可以自己寫一個試試看。    現成的 filter 有很多,比較普遍的如 lpdomatic (LPD-O-Matic)[12] 、 tops 、 magicfilter[13] 、 apsfilter[14] 、 rhs-printfilters[15] ……等等。 ifhp 是 LPRng 同一個 team 寫的 filter ,我自己用的是 ifhp ,所以以下以 ifhp 來說明:    下載最新版的 ifhp : http://www.lprng.com/ 。 
解壓縮、編譯安裝 ifhp : 
% tar xzf ifhp-x.x.x.tgz
% cd ifhp-x.x.x
% ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man
% make
% make test
% su
$ make install    設定 /etc/ifhp.conf 檔: 
設定妳的印表機那一節:打開 /etc/ifhp.conf 檔,找找看有沒有妳的印表機那一節 [ xxxxxxxx ] , xxxxxxxx 是妳的印表機的 Ghostscript 驅動程式名稱。如果妳是下載的驅動程式,那妳要自己新增一節。以 uniprint 驅動程式為例: 
[ xxxxxxxx.upp ]
status
pjl@
pcl@
ps@
text
gs_converter=  \%s{gs_unidriver} 
gs_device=xxxxxxxx.upp    xxxxxxxx.upp 是妳下載的 uniprint 驅動程式檔名。這樣 ifhp 才能從妳指定的印表機代號,找到妳的印表機該如何設定。 
設定檔案類型的對應表:在妳印表機的那一節最後面,加上以下 file_output_match 的設定(或蓋掉原來的 file_output_match 設定): 
file_output_match = [
        *postscript*                raw        \%s{gs_converter}
        *text*                        text [16]
        *01-*                        text
        *pcl*                        filter        \%s{pcl_converter}
        *pjl*                        filter        \%s{pjl_converter}
        *html*                        filter        \%s{html_converter}
        *pdf*                        raw        \%s{pdf_converter}
        *37)*                        raw        \%s{pdf_converter}
        *jpeg*                        filter        \%s{jpeg_converter}
        *gif*                        filter        \%s{gif_converter}
        *png*                        filter        \%s{png_converter}
        *pc_bitmap*                filter        \%s{bmp_converter}
        *tiff*                        filter        \%s{tiff_converter}
        *gzip_compressed*        filter        \%s{gzip_decompress}
        *data*                        raw
]    \%s{string} 會被代換為之前 string= 設定的字串。列印時, ifhp 會呼叫 /usr/bin/file 判斷檔案類型,從傳回來的結果字串,和這些樣式比對,如果符合,就執行後面設定的指令。[17] 如果後面沒有指令了,就當成最終轉換結果送出。例如: 
% file myphoto.jpg
myphoto.jpg: JPEG image data, JFIF standard    "JPEG image data, JFIF standard" 符合 *jpeg* (不分大小寫),於是就執行 jpeg_converter 。妳可以依 file 執行傳回的結果字串,設計新樣式。 
設定轉換程式(各種 xxx_converter ):找到 a2ps_converter= 那一行,在下面加上這幾行: 
html_converter= /usr/bin/html2ps 2>/dev/null
pdf_converter= \%s{gs_converter}
jpeg_converter= /usr/bin/jpegtopnm | /usr/bin/pnmtops -noturn[18]
gif_converter= /usr/bin/giftopnm | /usr/bin/pnmtops -noturn[19]
png_converter= /usr/bin/pngtopnm | /usr/bin/pnmtops -noturn
bmp_converter= /usr/bin/bmptoppm | /usr/bin/pnmtops -noturn
tiff_converter= /usr/bin/tifftopnm | /usr/bin/pnmtops -noturn    執行時, ifhp 會用 pipe 輸出入重導( | ),從標準輸入 stdin 傳入原始檔案,而從標準輸出 stdout 取得轉換結果。 
測試:列印 /tmp/myfile , 
$ /usr/libexec/filters/ifhp -Tdev=/dev/lp0,model=xxxxxxxx < /tmp/myfile    如果印出來沒問題, ifhp 就設定好了。[20] 到此,可以告一個段落,我們終於有了一個智慧型的列印程式,可以自動視情況列印各種檔案了。妳可以把上面那一行設定成 alias ,加在 ~/.bashrc 下: 
alias ifhp="/usr/libexec/filters/ifhp -Tdev=/dev/lp0,model=xxxxxxxx"    然後喝杯咖啡,休息一下。 ^_*' 
安裝設定 LPRng :
我們終於有了一個智慧型列印資料濾鏡 ifhp ,可以自動視情況分配檔案格式的轉換工作,再把最終結果送到印表機。只要用 ifhp ,要印什麼都可以印了。總算結束了吧?    還沒有。列印工作遠比想像中複雜。不只要能印,還要能「管理」:同時要印好幾個檔案的時候,妳要讓檔案排隊列印,或是把重要的檔案抽出來先印,還要把送錯了的檔案取消掉,或是在卡紙的時候,暫停列印。更何況, /dev/lp0 的權限是 660 ,我們不可能讓每個人都有權限,直接寫到 /dev/lp0 去。[21]    所以我們需要列印管理程式 LPRng ,管理所有的列印工作。    下載最新版的 LPRng : http://www.lprng.com/ 。 
解壓縮、編譯安裝 LPRng : 
% tar xzf LPRng-x.x.x.tgz
% cd LPRng-x.x.x
% ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --disable-setuid[22]
% make
% make test
% su
$ make install    設定 /etc/printcap 檔:[23] 若是妳乖乖照我說的,以 ifhp 配合 Ghostscript uniprint 的話,(妳還真聽話啊…… ^^; ) /etc/printcap 設定如下: 
# 配合 ifhp filter 和 Ghostscript uniprint 驅動程式的 printcap
lp:
        :lp=/dev/lp0
        :sd=/var/spool/lpd/%P
        :ifhp=model=xxxxxxxx
        :filter=/usr/libexec/filters/ifhp    %P 是指印表機的名稱,也就是第一行設定的 lp: 。妳可以把印表機名稱改成妳比較好記的名字,如 HPDJ670C 。 :sd= 設定的是列印佇列存放的目錄,如果還沒有建好這個目錄,要記得去 mkdir 。擁有者是 root ,權限最好和 /tmp 一樣是 1777 。 
設定 /etc/lpd.perm 檔: /etc/lpd.perm 設定的是列印管理的權限。我們首先要限制 IP 或 domain name ,避免系統安全漏洞。(別忘記 lpd 的權限是 root 或 daemon !)在最前面加上: 
# 限制可連線的 IP ,格式是 IP 或 IP/子網路遮罩
REJECT SERVICE=X NOT REMOTEIP=127.0.0.1,192.168.0.0/255.255.0.0
# 限制可連線的網域。
REJECT REMOTEHOST=X NOT REMOTEIP=localhost,*.your.domain    如果使用者都是身邊的熟人,把權限放鬆一點,給大家方便。把 "ACCEPT SERVICE=C LPC=lpd,status,printcap" 這一行去掉,改成: 
# 給大家方便,讓大家自己暫停∕繼續
#ACCEPT SERVICE=C LPC=lpd,status,printcap
ACCEPT SERVICE=C LPC=lpd,status,printcap,hold,release,stop,start REMOTEGROUP=users    另外,要讓管理者可以刪掉印壞的文件。找到 "ACCEPT SERVICE=M SERVER REMOTEUSER=root" 那一行: 
# allow root on server to remove a job
ACCEPT SERVICE=M SERVER REMOTEUSER=root
ACCEPT SERVICE=M SERVER REMOTEGROUP=lp    測試:先測試 /etc/printcap 的設定有沒有問題: 
$ checkpc -f    checkpc -f 會檢查 printcap 的設定,如果有什麼問題,例如 :sd= 的目錄不存在,會試著自動修正。檢查過沒問題後,重讀 /etc/printcap 檔: 
$ lpc reread    這時再列印看看 /tmp/myfile : 
% lpr /tmp/myfile    如果沒有問題,一切就大功告成囉! ^_*'[24] 
關於如何利用 lpr 、 lprm 、 lpc 、 lpq ……來管理列印工作,請參考 LPRng-HOWTO 的說明。    安裝設定 samba :[25]
如果妳沒有要把這臺印表機分享其她 Windows 工作站來用,可以不必看這一段。    下載、安裝 samba : http://www.samba.org/samba/samba.html 。(這不在本文的範圍內,請自行參考 samba 的安裝設定說明。) 
設定列印分享:在 /etc/smb.conf (或 /usr/local/samba/lib/smb.conf ), [printers] 節中設定如下: 
[printers]
        comment = Printers
        printable = yes
        browsable = no
        public = no
        valid users = @users
        
        printing = lprng
        path = /var/spool/lpd/samba
        print command = /usr/bin/lpr -P%p -r %s
        lpq command = /usr/bin/lpq -P%p
        lprm command = /usr/bin/lprm -P%p %j
        lppause command = /usr/sbin/lpc hold %p %j
        lpresume command = /usr/sbin/lpc release %p %j
        queuepause command = /usr/sbin/lpc -P%p stop
        queueresume command = /usr/sbin/lpc -P%p start    存檔後,記得要開一個 /var/spool/lpd/samba 的目錄,擁有者是 root ,權限是 1777 。 
測試:用 testparm 檢查 smb.conf 設定有沒有問題, 
% /usr/local/samba/bin/testparm    如果沒有問題,重開 samba ,回到 Windows 工作站,從網路上的芳鄰中重新整理,看看能不能看得到這臺印表機。[26] 
安裝設定 Windows 下的網路印表機:
這部份請參考 Windows 的說明,和印表機說明書的安裝設定說明。記得要印一張測試頁,測試看看。[27]    四、註釋
如果連「 Hello, world 」都看不到,請依序檢查下列事項: 
檢查印表機沒有壞掉,電源有沒有接上,開關有沒有打開,燈有沒有亮,警告燈有沒有在閃,墨水(或碳粉匣∕色帶)是不是用完了,有沒有放紙,有沒有卡紙。 
檢查印表機是不是接在 LPT1 ,排線有沒有接好,有沒有接觸不良。如果印表機接在 LPT2 ,請改用 /dev/lp1 ,如果在 LPT3 ,請改用 /dev/lp2 ,以下類推。 
如果不知道印表機有沒有壞,請重新接回 Windows 的電腦,試試看可不可以印。再不行,打電話給印表機廠商的客服專線。 
(回正文) 
隨著時代的轉變, PostScript 成了 Unix 下列印的標準文件格式。那個時代的電腦和印表機都很貴。後來 Adobe 又制定了 PDF (Portable Document Format) 可攜式文件格式。 (回正文) 
用軟體模擬,會吃 CPU 、硬碟和記憶體。不過現在的 CPU 都跑得很快,硬碟超便宜,記憶體的價格也還可以,除非妳要跑 print server ,或需要大量列印,否則影響不會很大。不過,如果妳真的需要大量列印,大到會影響整體系統效能,說實話,我覺得妳應該買得起 PostScript 印表機了。 :p (回正文) 
少部份 Canon 、 HP 、 NEC 印表機和 Sun raster 檔案也使用 uniprint 。因為 uniprint 下載後不需重新編譯 Ghostscript ,彈性大,成為 Ghostscript 小組推廣的新標準。 (回正文) 
Ghostscript 原本採用 GNU 公共版權,允許有限度商業使用;自 5.50 版以後,改由 artofcode LLC 和 Artifex Software Inc. 負責維護,採 Aladdin 公共版權,禁止商業使用,故又稱 Aladdin Ghostscript 。最近 artofcode LLC 和 Artifex Software Inc. 又開放出 6.52 版的 Ghostscript 版權。妳可以視需要決定要用哪個版本的 Ghostscript 。新版 bug 比較少,不過我們應該支持開放的版本。如果妳要商業使用,只能用 GNU Ghostscript 。也因為這個理由, Red Hat 和許多 Linux 只能搭配發行 GNU Ghostscript 6.52 。 (回正文) 
如果找不到 Ghostscript 的驅動程式,那妳可能得要自己寫,不然只好死心了。 :p Ghostscript 的驅動程式規格請看 Ghostscript 說明。 (回正文) 
如果有問題,請參考 Ghostscript 說明。 (回正文) 
一般情況下,印表機大多可以直接列印英文純文字,不需要特別麻煩 a2ps 轉為 PostScript 。不過如果妳要印中文,要用到中文字型,或是印表機無法直接列印英文純文字(這……不大可能吧? ^^;),就要先以 a2ps 轉成 PostScript ,才能列印。 (回正文) 
而且 Ghostscript 本身可直接讀取 PDF , PDF 可以比照 PostScript 直接交給 Ghostscript 列印。 (回正文) 
netpbm 前身是 PBMPLUS ,是一組轉換圖檔的小程式,已經於 1991 年 12 月 10 日停止維護。 後來的人把原先的 PBMPLUS ,加上零零散散蒐集來,許多人新寫的轉換程式,整理成 netpbm 。 PBMPLUS 和 netpbm 制定了圖檔轉換專用的 PNM ( Portable aNyMap )中介格式,先把圖檔統一轉成 PNM ,再轉成想要的格式,這樣只要寫 2n 個轉換程式,不必寫 n2 個,大大節省寫程式的力氣。 (回正文) 
妳也可以分別用各種直接轉換 PostScript 的程式,如附在 libungif 中的 gif2ps 、 jpg2ps 、 imgtops2 ……等等,不過她們轉換後的圖案大小都有點問題,目前我還是建議使用 netpbm 。因為螢幕和印表機的解析度不同,如果不做好比例微調,印出來的大小會有問題。 gif2ps 轉換時會把圖案調整到和紙張一樣大,原圖太大的時候很方便,但不算是很好的作法。 jpeg2ps 可以設定解析度,可是無法從標準輸入 /dev/stdin 讀取圖案,無法和 filter 列印資料濾鏡搭配。 imgtops2 其實是包裝程式 wrapper ,利用 PostScript 第二版新增的 jpeg 功能,將圖案資訊直接加上 PostScript 指令後輸出,不算轉換程式,優點是速度快,得到的檔案比較小,可是解析度有問題,印出來很大。比較起來, netpbm 會自動調整解析度,是目前比較好的選擇。(回正文) 
lpdomatic (LPD-O-Matic) 是設計來和早期的 lpd 搭配用的,很多人使用,程式很小很簡單,只有一個 perl script 。 lpdomatic 需要自己的印表機驅動程式,妳可以到 LinuxPrinting 印表機資料庫尋找下載。 (回正文) 
關於 magicfilter 我找到的文件不多,就目前的資料看來,是專為 Debian Linux 設計的 filter 。 (回正文) 
很多人都用 apsfilter ,可以從選單選印表機,自動改相關的設定檔,設定簡單;不過我不喜歡,因為太自動化了,會自己去亂改 /etc/printcap ,說明又不夠清楚,而且只能選 Ghostscript 隨附的驅動程式,無法新增自己下載的驅動程式。如果妳用 apsfilter ,要先裝 LPRng ,才能裝 apsfilter 。安裝 apsfilter 很簡單,把下載的 .tar.gz 檔解壓縮在 /usr/share/ ,進去執行 ./SETUP 就可以了。 (回正文) 
rhs-printfilters 是 Red Hat 寫的,搭配 Red Hat Linux 發行,因此使用者也很多。 rhs-printfilters 只有 RPM 版,要用 printtool 來設定。 printtool 像 apsfilter 一樣,會自動幫妳改相關的設定檔,不過只能在 X-Window 下執行,只能從選單中選印表機,還會亂改 /etc/printcap ,太自動化了,我也敬而遠之。 :p 如果妳用 rhs-printfilter ,要先裝 LPRng ,再裝 rhs-printfilter ,最後裝 printtool ,然後進入 X 下,執行 printtool 選印表機。(回正文) 
如果妳要用 a2ps ,請改用以下的設定: 
        *text*                        filter        \%s{a2ps_converter}    (回正文) 
如果找不到符合的, ifhp 就不會印了,傳回錯誤後結束。 (回正文) 
如果妳要用 imgtops2 ,請改用以下的設定: 
jpeg_converter= /usr/bin/imgtops2    (回正文) 
如果妳要用 gif2ps ,請改用以下的設定: 
gif_converter= /usr/bin/gif2ps; exit 0    exit 0 是因為 gif2ps 會把不嚴重的警告也以錯誤值傳回, ifhp 會誤判為轉換失敗,就不會印了。 (回正文) 
如果沒有印出來,依下述方式偵錯:寫一個簡單 script /tmp/send : 
#! /bin/sh
file=/tmp/myfile
ifhp=model=xxxxxxxx
cat /dev/null >/tmp/t
cat $file | /usr/libexec/filters/ifhp -Tdev=/tmp/t,trace,debug=2,${ifhp} 2> /tmp/trace    執行: 
$ sh -x /tmp/send    仔細看看 /tmp/trace ,找到問題的原因。妳可以把 debug= 的值設大一點(如 debug=10 ),以得到更詳細的偵錯資訊。 (回正文) 
為什麼列印會這麼複雜?因為印表機是外部裝置。既然不在機殼裏面,要靠線路連接,那要和主電腦通訊、執行工作,就會有佇列 spooling 的問題。佇列是一種排隊,在工作因為各種不同的原因(如執行速度太慢、通訊速度太慢、通訊中斷或不穩、記憶體不足……等),無法全部送到對方去執行時,就要先排隊,等排到的時候再送過去執行。這時候,就要能管理、設定先後次序、暫停、甚至刪除排隊中的工作。傳送 E-mail 因為牽涉到不同的主機之間訊息相互傳遞,也是一個需要佇列 spooling 的系統。其實機殼裏面的各個部份(光碟機、軟碟機、硬碟機、記憶體……等)之間也會有佇列的問題,不過幾乎都自動處理掉了,所以我們感覺不到。 (回正文) 
因為我們不能讓每個人都有權限寫入 /dev/lp0 ,所以我們要給 LPRng 特殊權限。一個方法是把 lpd 設成 setuid root ,不過會有安全的顧慮。另一個方法是讓 lpd 執行 daemon 模式,以 root 的權限啟動,轉為 daemon ,等待 lpr 呼叫,再來列印。 daemon 的帳號一定要有權限寫入 /dev/lp0 。 (回正文) 
如果妳是用「自動化」的 filter (如 apsfilter 或 rhs-printfilters ),現在可以安裝設定 filter 了,跳過以下的設定。 (回正文) 
如果 lpr 印不出來,你可以執行: 
% lpq -L    檢查列印記錄。若還是不行,請參考 LPRng HOWTO 的說明。 (回正文) 
由 Windows samba 客戶端傳來的資料,事先經過 Windows 驅動程式轉為低階印表指令,不需(也不可)再做資料轉換,在 filter 中需設定以 raw 直接傳送至印表機 /dev/lp0 。若印表機只給 Windows 客戶端列印,則可完全不設 filter ,直接由 LPRng 轉送給印表機,設定方式如最前面所述。 (回正文) 
如果從網路上的芳鄰看有問題,請參考 samba 列印說明。 (回正文) 
如果印不出來,請檢查 lpq -L 的列印記錄。 (回正文) 
五、參考資料
更進一步的資料請參考下列網址:    Linux HOWTO: Printing-HOWTO, 任恆宇譯的 Printing-HOWTO 中譯版 
LinuxPrinting: http://www.linuxprinting.org/, LinuxPrinting 印表機資料庫 
LPRng: http://www.lprng.com/, LPRng-HOWTO 
ifhp: http://www.lprng.com/, IFHP-HOWTO 
LPD-O-Matic (lodomatic): http://www.linuxprinting.org/lpd-doc.html 
apsfilter: http://www.apsfilter.org/ 
magicfilter: http://www.gnu.org/directory/magicfilter.html 
rhs-printfilters: http://www.redhat.com/ 
Ghostscript: GNU ghostscript http://www.cs.wisc.edu/~ghost/ 或 AFPL ghostscript http://www.ghostscript.com/, Ghostscript 說明, Ghostscript 使用說明, Ghostscript 印表機說明 
a2ps: http://www-inf.enst.fr/~demaille/a2ps/ 
html2ps: http://www.tdb.uu.se/~jan/html2ps.html, html2ps 說明 
netpbm: http://netpbm.sourceforge.net/, 或 PBMPLUS http://www.acme.com/software/pbmplus/ 
libungif: http://prtr-13.ucsc.edu/~badger/software/libungif/, libungif 說明 
imgtops2: http://www.cs.washington.edu/homes/dougz/postscript/imgtops2/ 
jpeg2ps: http://www.pdflib.com/jpeg2ps/ 
samba: http://www.samba.org/samba/samba.html, Chapter 10. Printing 
題外話:為什麼是 libungif ,不是 libgif ?請看下面這個故事: The GIF Controversy: A Software Developer's Perspective 
依瑪貓  初稿 2001-04-25 ,上次更新日期 2004-01-14     
系統時間:2024-04-20 18:25:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!