此儲存庫包含用於 PostScript 印表機的印表機應用程序,該應用程式使用 PAPPL 支援從多個作業系統進行 IPP 列印。此外,它還使用cups-filters 2.x(libcupsfilters、libppd中的過濾器函數)和pappl-retrofit(在印表機應用程式中封裝經典CUPS驅動程式)的資源。這項工作(或現在的 pappl-retrofit 的程式碼)源自 hp-printer-app。
歡迎您的貢獻。請發布問題並拉取請求。
非光柵印表機應用程式:目標格式是 PostScript,一種進階/向量格式。接受 PostScript 或 PDF 中的輸入數據,並完成所需的轉換,無需任何中間光柵步驟。
使用cups-filters 2.x 的新過濾器功能的印表機應用程式。濾波器函數是源自 CUPS 濾鏡的函式庫函數,自 2000 年推出 CUPS 以來,經過數十年的發展與完善。
經典 CUPS 驅動程式的改良型印表機應用程序,在本例中是用於 PostScript 印表機的最簡單的 PPD 檔案形式。它列出 Snap 中包含的儲存庫中的 PPD 文件,載入實際印表機所需的 PPD,從 PPD 中提取選項以在 Web 介面中顯示它們,接受作業設定作為 IPP 屬性,並正確插入 PPD 提供的 PostScript 程式碼進入輸出資料流。
不傳遞原始(輸入格式是印表機的本機格式)作業的印表機應用程式。為了確保 PPD 檔案的 PostScript 程式碼始終插入到輸出流中,我們將印表機的本機格式稱為“application/vnd.printer-specific”,該格式不作為輸入格式存在,因此強制使用“application/postscript”輸入透過pstops() 過濾函數。
可擴展的印表機應用程式:使用者可以透過管理 Web 介面新增 PPD 檔案以支援其他印表機型號。
其他屬性有:
為了避免重新發明分叉到子進程的程式碼,以便我們可以透過一系列過濾器傳遞數據,我們創建一個過濾器函數將數據發送到印表機並形成實際轉換過濾器的鏈函數(pstops() 和pdftops( ) 之一)與此過濾器函數一起使用filterChain() 過濾器函數。
對於 PWG/Apple 光柵輸入,我們使用光柵回調,以便進行串流處理,從而允許大型甚至無限長的作業。我們使用 libppd 函數在輸出流中插入 PPD 選項的 PostScript 程式碼,並使用 filterPOpen() 函數為 libppd 函數建立檔案描述符以將資料傳送到裝置。
PostScript 印表機應用程式 Snap 內建了 foomatic-db 和 HPLIP 專案的所有 PostScript PPD 文件,因此大多數 PostScript 印表機 PPD 通常隨 Linux 發行版一起提供。為了避免大量 PPD 增加 Snap 的大小,我們使用 pyppd 來高度壓縮。請注意,某些 PPD 使用某些 CUPS 過濾器來實現額外功能。這些過濾器包含在 Snap 中,因此支援額外的功能(在大多數情況下是 PIN 保護列印)。用戶可以添加額外的 PPD,而無需重建 Snap(見下文)。
我們首先使用印表機的 IEEE-1284 裝置 ID 來識別它是 PostScript 印表機(透過 CMD: 欄位)來查看它是否受支持,然後才透過 make 和 model 檢查我們是否使用 PPD 明確支援它。沒有 PPD 的 PostScript 印表機會指派一個通用 PPD。透過在尋找 make/model 之前檢查 CMD: 字段,我們可以確保如果 PostScript 是由附加模組提供的,則該模組實際上已安裝。
標準作業 IPP 屬性會對應到最適合它們的 PPD 選項設置,以便使用者可以從僅支援標準 IPP 屬性且無法擷取 PPD 選項的任何類型的用戶端(例如電話或 IoT 裝置)進行列印。紙盤、媒體尺寸、媒體類型和雙面列印可以輕鬆映射,但當涉及顏色和品質時,它會變得更加複雜,因為 PPD 文件中的相關選項差異很大。在這裡,我們使用一種演算法,它可以自動(想要手動編輯約 10000 個 PPD 的作業)為print-color-mode
( color
/ monochrome
)、 print-quality
( draft
/ normal
/)的每種組合找到正確的print-content-optimize
photo
high
auto
graphics
text
text-and-graphics
因此,您可以輕鬆獲得印表機的全部品質或速度,而無需處理特定於印表機的選項設定(仍可透過 Web 管理介面存取原始選項)。
給定印表機型號(印表機應用程式中的「驅動程式」)的印表機功能在印表機應用程式中設定的列印佇列的整個生命週期中並不是靜態的。使用者可以透過網路管理介面中的頁面設定印表機上安裝的硬體配件(額外紙匣、雙面列印單元、整理器等),並且印表機應用程式更新驅動程式資料結構以及印表機功能。對 get-printer-attributes IPP 請求的回應會得到適當更新。
PostScript 是一種成熟的程式語言,許多 PostScript 印表機允許查詢選項設定以及執行適當 PostScript 程式碼的可安裝硬體附件的存在。如果可以查詢某個設置,製造商會將所需的 PostScript 程式碼與可查詢選項一起放入 PPD 檔案中。印表機應用程式的 Web 介面支援這些查詢。
可用的印表機設備是透過 CUPS 的後端而不是 PAPPL 自己的後端發現(和使用)的。透過這種方式,可以使用具有相容性問題的USB 印表機的怪異解決方法(並且是可編輯的),並且除了套接字(通常連接埠9100)之外,PostScript 輸出還可以透過IPP、IPPS(加密! )和LPD 傳送到印表機。可以設定 SNMP 後端(社群、位址範圍)。
如果您有不尋常的系統配置或個人防火牆,您的印表機可能不會被發現。在這種情況下,完全手動輸入「網路印表機」並結合主機名稱/IP 欄位可能會有所幫助。
在「新增 PPD 檔案」頁面上已新增的使用者 PPD 檔案清單中,標記哪些檔案實際由印表機應用程式中設定的印表機使用,以避免使用者刪除這些檔案。
供應商選項的人類可讀字串(需要 PAPPL 的支援:問題 #58:本地化支援)
國際化/在地化(需要 PAPPL 的支援:問題 #58:在地化支援)
透過 ps_status() 函數檢查 SNMP 墨水量(需要 PAPPL 的支援:問題 #83:CUPS 透過後端進行 IPP 和 SNMP 墨水量輪詢,PAPPL 應該具有這方面的功能)
cups-filters 的構建選項,無需 libqpdf 和/或 libppd 即可構建,前者將允許創建此印表機應用程式的快照,而無需下載和構建 QPDF
要運行並使用此印表機應用程序,只需從 Snap Store 安裝它即可:
sudo snap install --edge ps-printer-app
然後按照以下說明進行設定。
要自行建立 Snap,請在此儲存庫的主目錄中運行
snapcraft snap
這將下載所有需要的套件並建立 PostScript 印表機應用程式。請注意,PAPPL(即將推出的 1.0)和 cups-filters(即將推出的 2.0)是直接從其 GIT 儲存庫中提取的,因為還沒有合適的版本。這也可能導致該印表機應用程式突然不再建置。
注意:Ubuntu Groovy (20.10) 中存在一個錯誤,導致其無法建置 Snap,請參閱 Snapcraft 論壇上的討論。問題已經解決了,但還沒有進入 Groovy。
任何較舊的(如 20.04)或較新的(如 21.04)Ubuntu 版本都應該可以工作。
安裝產生的 Snap 運行
sudo snap install --dangerous ps-printer-app_1.0_amd64.snap
印表機應用程式將作為伺服器守護程式自動啟動。
進入網頁介面
http://localhost:8000/
使用 Web 介面新增印表機。提供名稱,選擇發現的印表機,然後選擇品牌和型號。還可以設定已安裝的附件、已載入的媒體和選項預設值。附件配置和選項預設值也經常會從印表機取得。
然後使用以下指令列印 PDF、PostScript、JPEG、Apple Raster 或 PWG Raster 文件
ps-printer-app FILE
或使用 CUPS 列印,CUPS(以及 cups-browsed)發現使用此印表機應用程式設定的印表機並將其視為無驅動 IPP 印表機(IPP Everywhere 和 AirPrint)。
您也可以透過使用 Web 介面中的「新增 PPD 文件」按鈕或手動複製 PPD 文件來新增 PPD 文件,而無需重建 Snap:
sudo cp PPDFILE /var/snap/ps-printer-app/common/ppd/
手動複製(或刪除)PPD 檔案後,您需要重新啟動伺服器或在 Web 介面中,在「新增 PPD 檔案」頁面上點擊底部的「刷新」按鈕。這會將變更新增至內部驅動程式清單。
在「新增印表機」頁面的下拉式選單中選擇驅動程序,使用者新增的PPD 檔案被標記為「USER-ADDED」。設定具有自動驅動程式選擇的印表機時,首選使用者新增的 PPD 檔案。
上面命令列中的PPDFILE
不僅可以是單一 PPD 文件,還可以是任意數量的單一 PPD 檔案、包含 PPD .tar.gz
檔案(任意目錄結構)以及通常放入/usr/lib/cups/driver
中的PPD 生成可執行文件/usr/lib/cups/driver
。您也可以在/var/snap/ps-printer-app/current/ppd/
中建立任意子目錄結構,其中包含上述類型的檔案。只需確保不要將任何可執行檔放在那裡,以執行除列出和產生 PPD 檔案之外的任何其他操作。
請注意,使用 Web 介面,您只能管理/var/snap/ps-printer-app/current/ppd/
本身中的單一 PPD(未壓縮或使用gzip
壓縮)。不顯示存檔、可執行檔或子目錄,且不接受適當的上傳。這尤其可以防止新增沒有 root 權限的可執行檔。
任何新增的 PPD 檔案都必須適用於 PostScript 印表機,因為非 PostScript PPD 檔案適用於 CUPS 驅動程序,因此它們需要其他檔案才能運作,而且此印表機應用程式不支援此類檔案。如果上傳此類文件,「新增 PPD 文件」頁面會顯示警告。
看
ps-printer-app --help
以獲得更多選擇。
使用“-o log-level=debug”參數在終端機視窗中進行詳細日誌記錄。
您可以將檔案新增至/var/snap/ps-printer-app/common/usb/
以獲得其他 USB 怪異規則。編輯現有文件僅用於快速測試,因為它們會在 Snap 的每次更新時被替換(以引入新規則)。
您可以編輯/var/snap/ps-printer-app/common/cups/snmp.conf
檔案來設定 SNMP 網路印表機發現。
您還可以進行「快速而骯髒」的構建,無需捕捉,也無需在系統中安裝 PAPPL、cups-filters 2.x 和 pappl-retrofit。您需要一個包含 PAPPL 最新 GIT 快照、cups-filters 最新 GIT 快照和 pappl-retrofit 最新 GIT 快照(每個分支的主分支)的目錄。它們都需要編譯( ./autogen.sh; ./configure; make
),不需要安裝。也要安裝所有需要的函式庫的頭檔(安裝「libcups2-dev」就可以了)。
在 ps-printer-app.c 目錄中執行命令列
gcc -o ps-printer-app ps-printer-app.c $PAPPL_SRC/pappl/libpappl.a $CUPS_FILTERS_SRC/.libs/libppd.a $CUPS_FILTERS_SRC/.libs/libcupsfilters.a $PAPPL_RETROFIT_SRC/.libs/libpappl-retrofit.a -ldl -lpthread -lppd -lcups -lavahi-common -lavahi-client -lgnutls -ljpeg -lpng16 -ltiff -lz -lm -lusb-1.0 -lpam -lqpdf -lstdc++ -I. -I$PAPPL_SRC/pappl -I$CUPS_FILTERS_SRC/ppd -I$CUPS_FILTERS_SRC/cupsfilters -I$PAPPL_RETROFIT_SRC/pappl/retrofit -L$CUPS_FILTERS_SRC/.libs/ -L$PAPPL_RETROFIT_SRC/.libs/
還有一個 Makefile,但這需要將 PAPPL、cups-filters 2.x 和 pappl-retrofit 安裝到您的系統中。
跑步
./ps-printer-app --help
執行非快照版本時,預設會在下列位置搜尋 PPD 檔案:
/usr/share/ppd/
/usr/lib/cups/driver/
/var/lib/ps-printer-app/ppd/
使用 Web 介面中的「新增 PPD 檔案」頁面新增 PPD 檔案時,將使用最後一條路徑。
您可以設定PPD_PATHS
環境變數來搜尋其他位置:
PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
只需將任意數量的路徑的冒號分隔清單放入變數中,最後一個始終由「新增 PPD 檔案」頁面使用。建議建立包裝腳本。
此印表機應用程式使用CUPS 的後端而不是PAPPL 的後端,這意味著對於USB 印表機,使用CUPS 的USB 怪異解決方法來解決相容性問題,而網路印表機也可以與IPP、IPPS 和LPD 協定一起使用,且SNMP 印表機發現是可設定的。
如果需要,可以編輯/usr/share/cups/usb
中的 USB Quirk 規則和/etc/cups/snmp.conf
檔。
確保您安裝了 CUPS(至少是其後端)。
您還需要 Ghostscript 來列印 PDF 作業。
若要存取測試頁面testpage.ps
請使用 TESTPAGE_DIR 環境變數:
TESTPAGE_DIR=`pwd` PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
或者您自己建立測試頁(PostScript、PDF、PNG、JPEG、Apple Raster、PWG Raster):
TESTPAGE=/path/to/my/testpage/my_testpage.ps PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
PostScript 印表機應用程式版權所有 © 2020,作者:Till Kamppeter。
它源自 HP PCL 印表機應用程序,這是使用 PAPPL 的光柵印表機應用程式的第一個工作模型。它可以在這裡找到:
https://github.com/michaelrsweet/hp-printer-app
HP PCL 印表機應用程式版權所有 © 2019-2020,作者:Michael R Sweet。
該軟體根據 Apache 許可證版本 2.0 獲得許可,但允許連結到 GPL2/LGPL2 軟體(如舊版本的 CUPS)。有關詳細信息,請參閱文件“許可證”和“通知”。