歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 用公共UNIX打印系統打印DVI文件的方法

用公共UNIX打印系統打印DVI文件的方法

日期:2017/2/27 11:51:50   编辑:Linux文化

  共 UNIX 打印系統(CUPS)是當今許多 Linux 和 UNIX® 系統使用的打印假脫機程序。可以用 CUPS 提供的過濾器在各種各樣的打印機上格式化和打印眾多類型的文件。但是如果 CUPS 不支持要打印的文件類型該怎麼辦?可以先把文件轉換成 CUPS 能打印的類型,例如 PostScript 或 PDF。或者也可以創建一個過濾器,這樣 CUPS 打印系統就能夠正確識別並打印文件。本文摘自 LPI 102 考試准備:打印 教程,它介紹了如何創建簡單的過濾器。

MIME 類型和 CUPS

那麼,CUPS 如何確定用於格式化特定文件類型的過濾器呢?在打印文件的時候,CUPS 使用 MIME(多用途 Internet 郵件擴展)類型確定合適的轉換過濾器。請注意其他打印包可能使用 file 命令所使用的 magic number 那樣的機制。請參閱 file 或 magic 的手冊頁獲得更多信息。

MIME 類型用於把各種文件作為郵件附件傳輸。其中包含類型(例如文本或圖片)和子類型(例如 html、postscript gif 或 jpeg)。類型和子類型之間用分號(;)分隔。可選參數可能包含諸如字符集編碼或語言等信息。 CUPS 使用來自 /etc/cups/mime.types 的規則確定文件的類型,然後從 /etc/cups/conv.types 列出的過濾器中為給出的 MIME 類型選擇合適的過濾器。MIME 類型在 IANA(Internet Assigned Numbers AuthorityInternet)上注冊。如果所需的類型沒有注冊,請在子類型前加上 'x-' 前綴。清單 1 顯示了一些圖片類型的示例。

清單 1. /etc/cups/mime.types 的一些 MIME 類型項

image/gif gif string(0,GIF87a) string(0,GIF89a)

image/png png string(0,PNG)

image/jpeg jpeg jpg jpe string(0,) &&\

(char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\

char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\

char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\

char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))

image/tiff tiff tif string(0,MM) string(0,II)

image/x-photocd pcd string(2048,PCD_IPI)

image/x-portable-anymap pnm

這些項的格式超出了本文的討論范圍。請參閱 /usr/share/mime/magic 文件或 /usr/share/file/magic 文件了解如何用 magic number 標識文件。

確定了文件的 MIME 類型之後,就用 /etc/cups/mime.convs 文件查找正確的過濾器。這個文件的行有四項:源 MIME 類型和目標 MIME 類型、代價、過濾器的名稱。這裡使用了代價最小的過濾器。清單 2 顯示了一些示例。

清單 2. /etc/cups/mime.convs 的過濾器項

text/plain application/postscript 33 texttops

text/html application/postscript 33 texttops

image/gif application/vnd.cups-postscript 66 imagetops

image/png application/vnd.cups-postscript 66 imagetops

image/jpeg application/vnd.cups-postscript 66 imagetops

image/tiff application/vnd.cups-postscript 66 imagetops

image/x-bitmap application/vnd.cups-postscript 66 imagetops

如果找不到合適的過濾器,嘗試打印文件就會產生錯誤消息。如果使用 CUPS 之外的打印機守護程序,那麼可能得到意料之外的輸出。清單 3 顯示了使用 DVI 文件時的情況(來自 TeX 和 LaTex 的正常輸出)。

清單 3. 打印不支持的文件類型

[ian@attic4 ~]$ lpr samp1.dvi

lpr: Unsupported format 'application/octet-stream'!

用於 CUPS 打印的 DVI 過濾器

幸好,提供 TeX 和 LaTeX 的 tetex 包還提供了把 DVI 轉換成 PostScript 的轉換工具 dvips。不幸的是,它不能作為過濾器工作,因為它不知道如何處理 CUPS 過濾器必須處理的參數:作業 id、用戶、作業標題、拷貝數量和作業選項。如果輸入來自文件,那麼過濾器管道中的第一個過濾器還具有額外的參數 —— 文件名。

解決方案是創建一個作為過濾器的包裝器腳本。dvips 命令不接受來自 stdin 的輸入,所以這個腳本可能需要創建臨時文件,在調用 dvips 之前把 stdin 拷貝到臨時文件。清單 4 顯示了可能的腳本。

清單 4. CUPS DVI 到 PostScript 的過濾器腳本

#!/bin/bash

# CUPS filter to process DVI files using dvips

# Create a sandbox for working if input on stdin

if [ $# -lt 6 ]; then

sandbox=${TMPDIR-/tmp}/cups-dvitops.$$

(umask 077 && mkdir $sandbox) || {

echo "Cannot create temporary directory! Exiting." 1>&2

exit 1

}

fn="$sandbox/cups-dvitops.$$"

cat > "$fn"

else

fn="$6"

fi

# Call dvips quietly, securely and with output to stdout

dvips -R -q -o - "$fn"

# Erase sandbox if we created one

if [ $# -lt 6 ]; then

rm -rf "$sandbox"

fi

回想一下 CUPS 使用 /etc/cups 中的兩個文件來確定 MIME 類型和要使用的過濾器。只要重新安裝或升級 CUPS,這些文件都會被覆蓋。幸運的是,CUPS 在啟動或重新啟動時,都會讀取 所有 擴展名為 .types 或 .convs 的文件。所以應當為新的過濾器創建一對文件,例如 /etc/cups/dvitops.types 和 /etc/cups/dvitops.convs。清單 5 顯示了 DVI 過濾器的兩個配置文件。

清單5. CUPS dvitops 的配置文件 filter

[ian@attic4 ~]$ cat /etc/cups/dvitops.types

# Local MIME definition for DVI files

application/x-dvi dvi string(0,)

[ian@attic4 ~]$ cat /etc/cups/dvitops.convs

# Local DVI to PostScript filter for CUPS

application/x-dvi application/postscript 50 dvitops

清單 5 說明前兩個位置是 16 進制數字 F7 和 02 的文件被識別為 DVI 文件,而且這類文件應當用 dvitops 過濾器處理。

接下來,作為 root 用戶,把上面的腳本拷貝到 /usr/lib/cups/filter/dvitops,並確保它完全可讀並可執行(-rwxr-xr-x)。腳本的名稱必須與上面的 /etc/cups/dvitops.convs 文件中的名稱匹配。如果在強制模式下運行 SELinux,還應當運行 /usr/lib/cups/filter 目錄中的 restorecon 來更新安全上下文。否則,lpr 看起來會工作,但是實際上並不能打印文件。

最後,請用重新啟動選項以及 /etc/rc.d/init.d 或 /etc/init.d 中的 cups 腳本,重新啟動 CUPS 並使用新的過濾器。

如果使用的是比較老的打印假脫機程序,可能要使用 magicfilter 或 apsfilter 作為輸入過濾器,以便把各種輸入文件轉換成在 PostScript 打印機上打印的 PostScript 格式,或者使用 Ghostscript,在非 PostScript 打印機上面打印。

結束語

分享這篇文章……

提交到 Digg

發布到 del.icio.us

提交到 Slashdot!

如果想了解在 Linux 上進行打印的更多知識,請閱讀教程 LPI 102 考試准備:打印,本文就是從該教程中摘錄出來,或者參閱下面列出的其他 參考資料。不要忘記 為本文打分。

Copyright © Linux教程網 All Rights Reserved