Raspberry Pi 的應用 - 誰說 iPhone 無法列印?! 就讓 AirPrint Server 拯救你

by 5月 13, 2015 0 意見            

自從 iPhone 出現之後,對上班族來說實在是天大的福音,不再需要準備一堆的行事曆、筆記本、電話簿、錄音機、打字機、筆墨紙硯 ...... 等等的辦公用品。

不管是要回覆郵件、簽核公文、詢價報價、行程聯絡、簡報製作,其實 iPhone 幾乎已經無所不能了,所以很多人出門可以不帶 Notebook、可以沒有 PC、可以不帶公事包,但是就是不能沒有手機。

不過,唯獨一件事情,iPhone 很難搞定,就是「列印文件 」。

前言


我們很熟悉在 PC 或是 Mac 上安裝印表機的步驟:
  1. 連接印表機的線材到 USB 或是 LPT Port。
  2. 下載印表機的驅動程式。
  3. 安裝印表機的驅動程式。
  4. 調整印表機的連線設定。 
  5. 列印文件。

可是 ...... iPhone 上哪兒去找線材來接印表機? 哪裡有廠商提供驅動程式?

Apple 官方對 AirPrint 的說明是:「AirPrint 是 Apple 的一項技術,可協助您創作高品質的列印輸出成品,且不需要下載或安裝驅動程式。

在 iPhone 上列印的動作就只要:
  1. 打開文件。
  2. 選擇 AirPrint 印表機。
  3. 列印文件。



事前準備

  • Raspberry Pi Model B / B+,Model A / A+ 請自行加上 USB 網路卡。
  • Raspbian 作業系統。
  • iPhone / iPad 必須連線到與 Raspberry Pi 相同的網段。
  • 於 iOS 5.1.1、iOS 7.12、iOS 8.2 測試成功。
  • 要讓 Raspberry Pi 用 Wi-Fi 連線的話,請參閱 Raspberry Pi 的基礎 - 使用 Wi-Fi 無線網卡連上網路

安裝列印服務


這邊要用的是 CUPS 套件 (曾經是 Common Unix Printing System 的縮寫,現在已經被 Apple 買下來了,直接變成套件名稱了),Raspbian 官方套件庫提供的版本是 1.5.3,目前最新版是 2.0.2。
sudo apt-get -y install cups

編輯主設定檔
sudo vi /etc/cups/cupsd.conf

找到「Listen localhost:631」,改成「Listen *:631」。

找到「<Location />」、「<Location /admin>」、「<Location /admin/conf>」三個段落,在「Order allow,deny 」的下一行,加入「Allow @LOCAL」。

將帳號 pi 加入 lpadmin 列印管理員群組。
sudo usermod -aG lpadmin pi

重新啟動 CUPS 服務。
sudo service cups restart

確認本機的 IP 位址,addr 後面接的就是我們的 IP。
ifconfig eth0 | grep inet

用瀏覽器連上 CUPS 的 Web 介面:https://192.168.88.23:631,千萬別忘了要用 HTTPS 協定,而且要指定 Port 631。

切換到「Administration」管理頁籤。

勾選「Share printers connected to this system」和「Allow users to cancel any job (not just their own)」,再按「Change Settings」。

CUPS 會詢問帳號密碼,剛剛已經讓帳號 pi 擁有印表機的管理權限,所以直接輸入即可。

稍候一下,等服務自動重新啟動後,按「Add Printer」來新增印表機。

選擇要連接的印表機,我選擇了現有的網路印表機 - EPSON AcuLaser MX14NF。

印表機的選擇,視實際的環境來選擇,共分為三種類型。
  • Local Printers - 本機印表機。
  • Discovered Network Printers - 搜尋到的網路印表機。
  • Other Network Printers - 其他連線方式的網路印表機。
設定這台印表機的描述資料,並勾選「Share This Printer」。

指定印表機的驅動程式,「Make」選擇廠牌,「Model」選擇型號。


可以到 The Linux Foundation - OpenPrinting 去查詢 CUPS 支援的印表機所有型號。

查不到也不用擔心,直接到印表機廠商的官網下載 PPD (Postscript Printer Description) 格式的驅動程式來安裝即可。

不過,如果連原廠都沒提供的話,建議還是改連接另外一台吧,例如 Epson MX14NF 就找不到 Linux Driver ......@@

最後設定印表機相關設定值,在「General」、「標語」、「政策」等頁籤裡調整,不同的機型會有不同的選項。

最後點選「Set Default Options」,便完成所有設定。


加入 AirPrint 支援


網路上幾乎所有的文章都是使用 GitHub 上面的 tjfontaine / airprint-generate 這個 Python 檔案。

配合下面這些步驟。
sudo apt-get -y install avahi-daemon avahi-discover libnss-mdns cups cups-pdf gutenprint pycups avahi python2
sudo mkdir /opt/airprint
cd /opt/airprint
sudo wget -O airprint-generate.py --no-check-certificate https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py
sudo chmod 755 airprint-generate.py
sudo ./airprint-generate.py -d /etc/avahi/services
sudo wget https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py
sudo ./airprint-generate.py -d /etc/avahi/services
sudo service avahi-daemon restart
sudo service cups restart

這個 Python 檔只是用來產生一個 Avahi 的 Service 描述檔。

內容的來源是自 CUPS 的設定。

不過,事實上早就不用那麼麻煩,只要安裝好 Avahi 及 mDNS 套件就行了
sudo apt-get -y install avahi-daemon avahi-discover libnss-mdns

重新啟動 Avahi Daemon,這樣子就可以了。
sudo service avahi-daemon restart


從 iPhone / iPad 列印


先用 iPhone 5 + iOS 7.12 來測試。

打開 Safari,點選中間的按鈕。

把下排的選單往左滑,點選「列印」。

點選「選取印表機」。

選擇 AirPrint 印表機了。

點選「列印」。

就可以將內容列印出來了。

iPhone 3GS + iOS 5.1.1 不知道是不是也可以適用呢?

同樣用 Safari 來測,點選中間的按鈕。

選擇「列印」。

點選「選取印表機」。

選擇 AirPrint 印表機了。

點選「列印」。

就可以將內容列印出來了。

同場加映 - 從 Mac 列印


在「Launchpad」裡打開「系統偏好設定」。

點選「印表機與掃瞄器」。

點選「+」。

這裡就可以看到 AirPrint 印表機了。


同場加映 - 從 PC 列印


我們直接用 Samba 套件來提供分享的功能。
sudo apt-get -y install samba

修改主設定檔。
sudo vi /etc/samba/smb.conf

有幾個地方要修改:

# 顯示在網路芳鄰裡的名稱,不設定的話會直接用 hostname。
netbios name = RPI2-FS

# 工作群組或網域的名稱
workgroup = WORKGROUP

# 啟用 CUPS 的支援
printing      = cups
printcap name = cups

# 分享印表機
[printers]
  comment     = All Printers
  browseable  = no
  path        = /var/spool/samba
  printable   = yes
  guest ok    = yes

  read only   = yes
  create mask = 0700


# 分享印表機的驅動程式
[print$]
  comment    = Printer Drivers
  path       = /usr/share/cups/drv

  browseable = yes
  read only  = yes
  guest ok   = yes



重新啟動 samba。
sudo service samba restart

在 Windows 裡就可以找到這台印表機了。


異常排除


基本上沒有什麼大問題,最大的麻煩是來自於找不到印表機的 Linux 驅動程式,除了 CUPS、印表機原廠、網路上的神人/好心人之外,暫時大概沒有辦法處理。

出現「找不到 AirPrint 印表機」有幾個可能。
  • iPhone 跟 Raspberry Pi 的網路在不同網段。
  • Avahi-Deamon 沒啟動,或是設定有問題。
  • 印表機忘了開 ... 

AirPrint 印表機的名稱不見了,只看到 hostname 時,什麼事都不用做,再稍等一下就行了,那是因為 Avahi 還在廣播資料,需要一些時間才能看到而已。


參考資料


圖片來源


更新紀錄

  • 2015/05/13 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言