跳到網頁內文區。

:::

如何在 Linux 下列印?

目錄

前言

這是我自己寫的「如何列印」,原本只是一篇小筆記,因為設定印表機的過程很累很複雜,為了怕我自己日久生疏,而寫給自己看的。後來越寫越長,寫成了完整的 Linux 列印設定教學。

本文是採用 samba - LPRng - ifhp filter - ghostscript uniprint 驅動程式搭配的列印架構。如果妳是用別的搭配方式,設定會有所不同。

本文作者是我一個人,未曾受過各個列印程式作者的授權,也未曾和各個作者討論,內文所述不能代表各列印程式的正式文件。本文或有疏失、遺漏、偏頗、錯誤之處,還請不吝告知,謝謝。

零、最最快速的安裝說明:

如果妳只是要把印表機分享給 Windows 工作站用,或只是要設定一個 Windows 工作站用的 print server ,完全不要在 Linux 下印表,請依下列步驟。如果妳真的是要「在 Linux 下設定印表機」,要在 Linux 下列印,或想更深入瞭解 Linux 下列印的架構,請跳過這一段。

  1. 接好印表機:

    把印表機接到 LPT1 ,做下述測試:

    % echo "Hello, world!" >> /dev/lp0
    

    如果印表機有反應,把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[1]

  2. 安裝設定 LPRng :

    1. 下載最新版的 LPRng : http://www.lprng.com/
    2. 解壓縮、編譯安裝 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
      
    3. 設定 /etc/printcap 如下:
      # 最簡化的 printcap 設定,只給 samba 客戶端列印使用
      lp:
      	:lp=/dev/lp0
      	:sd=/var/spool/lpd/%P
      
    4. 測試:
      $ checkpc -f
      $ echo "Hello, world!" | lpr
      
      這時印表機應該會有反應。把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[24]
  3. 安裝設定 samba :

    1. 下載、安裝 samba : http://www.samba.org/samba/samba.html 。(這不在本文的範圍內,請自行參考 samba 的安裝設定說明。)
    2. 設定列印分享:在 /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 。
    3. 測試:用 testparm 檢查 smb.conf ,
      $ /usr/local/samba/bin/testparm
      
      如果沒有問題,重開 samba ,回到 Windows 工作站,從網路上的芳鄰中重新整理,看看能不能看得到這臺印表機。[26]
  4. 安裝設定 Windows 下的網路印表機:

    這部份請參考 Windows 的說明,和印表機說明書的安裝設定說明。記得要印一張測試頁,測試看看。[27]

一、 Linux 列印基本概念

Linux 列印基本概念 style="float: right;" />

Linux 列印的基本做法如下:

  1. 依要列印的檔案的類型,以各種不同的 xxx2ps PostScript 轉換程式,統一轉為列印專用的標準 PostScript 格式。
  2. 將轉換後的 PostScript 格式資料傳送給 PostScript 印表機模擬程式 Ghostscript 。 Ghostscript 配合印表機的驅動程式,將 PostScript 格式資料再轉為低階印表機指令,傳送給印表機埠上的印表機。

二、實際列印流程

圖中虛線為 Windows / samba 網路印表機列印資料傳送流程。

Linux 列印流程
  1. 由 samba 列印分享送出資料。(可省略。)
  2. 由 LPRng 列印程式( lpr )列印檔案,主要設定檔為 /etc/printcap 。
  3. 由 ifhp 或其她列印濾鏡( filter )配合 file ,判斷檔案類型後分別處理,設定檔為 /etc/ifhp.conf 。
  4. 若不是 raw 或純文字等可以直接列印的檔案格式,則由各種 PostScript 轉換程式統一轉為 PostScript 格式。
  5. 由 Ghostscript (with uniprint) PostScript 印表機模擬器處理 PostScript 格式的資料,轉為低階印表指令印出。

三、設定指南

我們從最下層往上設定起:

  1. 接好印表機:

    把印表機接到 LPT1 ,做下述測試:

    % echo "Hello, world!" >> /dev/lp0
    

    如果印表機有反應,把整張紙退出,看看「 Hello, world! 」有沒有印出來。如果一切正常,繼續下一步。[1]

  2. 安裝 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]

    1. 安裝 Ghostscript 前要先安裝 zliblibpngjpeg 。這些不在本文範圍內,請參考各自的安裝說明。
    2. 下載最新版的 Ghostscript :[5] 下載時,要連同 Ghostscript 字型一起下載安裝: http://www.cs.wisc.edu/~ghost/doc/AFPL/get700.htm
    3. 解壓縮、編譯安裝 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
      
    4. 設定妳的印表機型號和驅動程式。請查 Ghostscript 印表機說明,找到妳印表機的代號,或是妳印表機的 uniprint 驅動程式名稱。如果沒有,妳可以上 LinuxPrinting 印表機資料庫找別人寫的驅動程式。[6] 下載驅動程式後,如果不是 uniprint ,妳要重新編譯 Ghostscript ;否則,只要存到 /usr/share/ghostscript/x.xx/ 下,和其她 .upp 驅動程式存在一起,就可以了。
    5. 測試: /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"
      
  3. 安裝各種 xxx2ps PostScript 轉換程式:

    可以列印 PostScript 後,要印其她的檔案,只要統一轉為 PostScript ,就可以印了。 PostScript 的轉換程式很多也很瑣碎,安裝設定都很簡單,在這裏就不詳述了。以下列出幾種常見的 xxx2ps PostScript 轉換程式:

    安裝完後,記得要測試轉換後的 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 囉。到此,我們已經可以「列印」了。不管要印什麼,都通行無阻。

  4. 安裝設定列印資料濾鏡 ifhp filter :

    可以列印還不夠。印不同的檔案,要跑不同的轉換程式,把檔案格式轉來轉去。這樣太麻煩了。我們需要一個智慧型程式,自動判斷檔案類型,呼叫要用的轉換程式。這就是 filter 列印資料濾鏡。 filter 的原理其實很簡單,有興趣的話,看完以下的說明,妳也可以自己寫一個試試看。

    現成的 filter 有很多,比較普遍的如 lpdomatic (LPD-O-Matic)[12]topsmagicfilter[13]apsfilter[14]rhs-printfilters[15] …等等。 ifhp 是 LPRng 同一個 team 寫的 filter ,我自己用的是 ifhp ,所以以下以 ifhp 來說明:

    1. 下載最新版的 ifhp : http://www.lprng.com/
    2. 解壓縮、編譯安裝 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
      
    3. 設定 /etc/ifhp.conf 檔:
      1. 設定妳的印表機那一節:打開 /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 才能從妳指定的印表機代號,找到妳的印表機該如何設定。
      2. 設定檔案類型的對應表:在妳印表機的那一節最後面,加上以下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 執行傳回的結果字串,設計新樣式。
      3. 設定轉換程式(各種 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 取得轉換結果。
    4. 測試:列印 /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"
      
      然後喝杯咖啡,休息一下。 ^_*'
  5. 安裝設定 LPRng :

    我們終於有了一個智慧型列印資料濾鏡 ifhp ,可以自動視情況分配檔案格式的轉換工作,再把最終結果送到印表機。只要用 ifhp ,要印什麼都可以印了。總算結束了吧?

    還沒有。列印工作遠比想像中複雜。不只要能印,還要能「管理」:同時要印好幾個檔案的時候,妳要讓檔案排隊列印,或是把重要的檔案抽出來先印,還要把送錯了的檔案取消掉,或是在卡紙的時候,暫停列印。更何況, /dev/lp0 的權限是 660 ,我們不可能讓每個人都有權限,直接寫到 /dev/lp0 去。[21]

    所以我們需要列印管理程式 LPRng ,管理所有的列印工作。

    1. 下載最新版的 LPRng : http://www.lprng.com/
    2. 解壓縮、編譯安裝 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
      
    3. 設定 /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 。
    4. 設定 /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
      
    5. 測試:先測試 /etc/printcap 的設定有沒有問題:
      $ checkpc -f
      
      checkpc -f 會檢查 printcap 的設定,如果有什麼問題,例如 :sd= 的目錄不存在,會試著自動修正。檢查過沒問題後,重讀 /etc/printcap 檔:
      $ lpc reread
      
      這時再列印看看 /tmp/myfile :
      % lpr /tmp/myfile
      
      如果沒有問題,一切就大功告成囉! ^_*'[24]

    關於如何利用 lpr 、 lprm 、 lpc 、 lpq …來管理列印工作,請參考 LPRng-HOWTO 的說明。

  6. 安裝設定 samba :[25]

    如果妳沒有要把這臺印表機分享其她 Windows 工作站來用,可以不必看這一段。

    1. 下載、安裝 samba : http://www.samba.org/samba/samba.html 。(這不在本文的範圍內,請自行參考 samba 的安裝設定說明。)
    2. 設定列印分享:在 /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 。
    3. 測試:用 testparm 檢查 smb.conf 設定有沒有問題,
      % /usr/local/samba/bin/testparm
      
      如果沒有問題,重開 samba ,回到 Windows 工作站,從網路上的芳鄰中重新整理,看看能不能看得到這臺印表機。[26]
  7. 安裝設定 Windows 下的網路印表機:

    這部份請參考 Windows 的說明,和印表機說明書的安裝設定說明。記得要印一張測試頁,測試看看。[27]

四、註釋

  1. 如果連「 Hello, world 」都看不到,請依序檢查下列事項:
    • 檢查印表機沒有壞掉,電源有沒有接上,開關有沒有打開,燈有沒有亮,警告燈有沒有在閃,墨水(或碳粉匣∕色帶)是不是用完了,有沒有放紙,有沒有卡紙。
    • 檢查印表機是不是接在 LPT1 ,排線有沒有接好,有沒有接觸不良。如果印表機接在 LPT2 ,請改用 /dev/lp1 ,如果在 LPT3 ,請改用 /dev/lp2 ,以下類推。
    • 如果不知道印表機有沒有壞,請重新接回 Windows 的電腦,試試看可不可以印。再不行,打電話給印表機廠商的客服專線。
    (回正文)
  2. 隨著時代的轉變, PostScript 成了 Unix 下列印的標準文件格式。那個時代的電腦和印表機都很貴。後來 Adobe 又制定了 PDF (Portable Document Format) 可攜式文件格式。 (回正文)
  3. 用軟體模擬,會吃 CPU 、硬碟和記憶體。不過現在的 CPU 都跑得很快,硬碟超便宜,記憶體的價格也還可以,除非妳要跑 print server ,或需要大量列印,否則影響不會很大。不過,如果妳真的需要大量列印,大到會影響整體系統效能,說實話,我覺得妳應該買得起 PostScript 印表機了。 :p (回正文)
  4. 少部份 Canon 、 HP 、 NEC 印表機和 Sun raster 檔案也使用 uniprint 。因為 uniprint 下載後不需重新編譯 Ghostscript ,彈性大,成為 Ghostscript 小組推廣的新標準。 (回正文)
  5. 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 。 (回正文)
  6. 如果找不到 Ghostscript 的驅動程式,那妳可能得要自己寫,不然只好死心了。 :p Ghostscript 的驅動程式規格請看 Ghostscript 說明(回正文)
  7. 如果有問題,請參考 Ghostscript 說明(回正文)
  8. 一般情況下,印表機大多可以直接列印英文純文字,不需要特別麻煩 a2ps 轉為 PostScript 。不過如果妳要印中文,要用到中文字型,或是印表機無法直接列印英文純文字(這…不大可能吧? ^^;),就要先以 a2ps 轉成 PostScript ,才能列印。 (回正文)
  9. 而且 Ghostscript 本身可直接讀取 PDF , PDF 可以比照 PostScript 直接交給 Ghostscript 列印。 (回正文)
  10. netpbm 前身是 PBMPLUS ,是一組轉換圖檔的小程式,已經於 1991 年 12 月 10 日停止維護。 後來的人把原先的 PBMPLUS ,加上零零散散蒐集來,許多人新寫的轉換程式,整理成 netpbm 。 PBMPLUS 和 netpbm 制定了圖檔轉換專用的 PNM ( Portable aNyMap )中介格式,先把圖檔統一轉成 PNM ,再轉成想要的格式,這樣只要寫 2n 個轉換程式,不必寫 n2 個,大大節省寫程式的力氣。 (回正文)
  11. 妳也可以分別用各種直接轉換 PostScript 的程式,如附在 libungif 中的 gif2ps 、 jpg2psimgtops2 …等等,不過她們轉換後的圖案大小都有點問題,目前我還是建議使用netpbm 。因為螢幕和印表機的解析度不同,如果不做好比例微調,印出來的大小會有問題。 gif2ps 轉換時會把圖案調整到和紙張一樣大,原圖太大的時候很方便,但不算是很好的作法。 jpeg2ps 可以設定解析度,可是無法從標準輸入 /dev/stdin 讀取圖案,無法和 filter 列印資料濾鏡搭配。 imgtops2 其實是包裝程式 wrapper ,利用 PostScript 第二版新增的 jpeg 功能,將圖案資訊直接加上 PostScript 指令後輸出,不算轉換程式,優點是速度快,得到的檔案比較小,可是解析度有問題,印出來很大。比較起來, netpbm 會自動調整解析度,是目前比較好的選擇。(回正文)
  12. lpdomatic (LPD-O-Matic) 是設計來和早期的 lpd 搭配用的,很多人使用,程式很小很簡單,只有一個 perl script 。 lpdomatic 需要自己的印表機驅動程式,妳可以到 LinuxPrinting 印表機資料庫尋找下載。 (回正文)
  13. 關於 magicfilter 我找到的文件不多,就目前的資料看來,是專為 Debian Linux 設計的 filter 。 (回正文)
  14. 很多人都用 apsfilter ,可以從選單選印表機,自動改相關的設定檔,設定簡單;不過我不喜歡,因為太自動化了,會自己去亂改 /etc/printcap ,說明又不夠清楚,而且只能選 Ghostscript 隨附的驅動程式,無法新增自己下載的驅動程式。如果妳用 apsfilter ,要先裝 LPRng ,才能裝 apsfilter 。安裝 apsfilter 很簡單,把下載的 .tar.gz 檔解壓縮在 /usr/share/ ,進去執行 ./SETUP 就可以了。 (回正文)
  15. 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 選印表機。(回正文)
  16. 如果妳要用 a2ps ,請改用以下的設定:
    	*text*			filter	\%s{a2ps_converter}
    
    (回正文)
  17. 如果找不到符合的, ifhp 就不會印了,傳回錯誤後結束。 (回正文)
  18. 如果妳要用 imgtops2 ,請改用以下的設定:
    jpeg_converter= /usr/bin/imgtops2
    
    (回正文)
  19. 如果妳要用 gif2ps ,請改用以下的設定:
    gif_converter= /usr/bin/gif2ps; exit 0
    
    exit 0 是因為 gif2ps 會把不嚴重的警告也以錯誤值傳回, ifhp 會誤判為轉換失敗,就不會印了。 (回正文)
  20. 如果沒有印出來,依下述方式偵錯:寫一個簡單 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 ),以得到更詳細的偵錯資訊。 (回正文)
  21. 為什麼列印會這麼複雜?因為印表機是外部裝置。既然不在機殼裏面,要靠線路連接,那要和主電腦通訊、執行工作,就會有佇列 spooling 的問題。佇列是一種排隊,在工作因為各種不同的原因(如執行速度太慢、通訊速度太慢、通訊中斷或不穩、記憶體不足…等),無法全部送到對方去執行時,就要先排隊,等排到的時候再送過去執行。這時候,就要能管理、設定先後次序、暫停、甚至刪除排隊中的工作。傳送 E-mail 因為牽涉到不同的主機之間訊息相互傳遞,也是一個需要佇列 spooling 的系統。其實機殼裏面的各個部份(光碟機、軟碟機、硬碟機、記憶體…等)之間也會有佇列的問題,不過幾乎都自動處理掉了,所以我們感覺不到。 (回正文)
  22. 因為我們不能讓每個人都有權限寫入 /dev/lp0 ,所以我們要給 LPRng 特殊權限。一個方法是把 lpd 設成 setuid root ,不過會有安全的顧慮。另一個方法是讓 lpd 執行 daemon 模式,以 root 的權限啟動,轉為 daemon ,等待 lpr 呼叫,再來列印。 daemon 的帳號一定要有權限寫入 /dev/lp0 。 (回正文)
  23. 如果妳是用「自動化」的 filter (如 apsfilter 或 rhs-printfilters ),現在可以安裝設定 filter 了,跳過以下的設定。 (回正文)
  24. 如果 lpr 印不出來,你可以執行:
    % lpq -L
    
    檢查列印記錄。若還是不行,請參考 LPRng HOWTO 的說明。 (回正文)
  25. 由 Windows samba 客戶端傳來的資料,事先經過 Windows 驅動程式轉為低階印表指令,不需(也不可)再做資料轉換,在 filter 中需設定以 raw 直接傳送至印表機 /dev/lp0 。若印表機只給 Windows 客戶端列印,則可完全不設 filter ,直接由 LPRng 轉送給印表機,設定方式如最前面 所述。 (回正文)
  26. 如果從網路上的芳鄰看有問題,請參考 samba 列印說明(回正文)
  27. 如果印不出來,請檢查 lpq -L 的列印記錄。 (回正文)

五、參考資料

更進一步的資料請參考下列網址:

依瑪貓,初稿 2001-04-25 ,上次更新日期 2006-04-06