2011-11-09 39 views
1

對於裝有A4和A3紙的多個紙盒的PostScript 3打印機,我遇到了問題。在使用CUPS系統的Linux下,我現在通過指定media = a4選項或定義兩個單獨的打印機來手動設置正確的紙張大小:一個用於A4,一個用於A3。使用PostScript自動選擇紙張

但是,這種情況遠未達到最佳狀態,因爲您必須始終記住選擇合適的打印機。

爲PostScript是圖靈完備的語言,並在Red BookBlue Book讀了一下後,我有一個問題:

是否有可能爲「自動選擇紙張大小」修改打印機的PPD文件中生成選項,如果激活,會自動設置正確的介質尺寸?也許取決於打印出的邊界框大小?

或許真的開始像這樣:

PostScript代碼

% set pagesize A4 
/setA4Paper {<</PageSize [595 842] >> setpagedevice} def 
% set pagesize A3 
/setA3Paper {<</PageSize [842 1190] >> setpagedevice} def 
% decide which paper size to take based on the bounding box 
% (array of two elements, width and height) 
% if the bounding box is wider that A4 paper, pick A3 paper instead 
boundingBox 0 get 595 gt {setA3Paper} {setA4Paper} ifelse 

細節問題

  • 我如何獲得頁面邊框的信息?有沒有一個標準或更多的文件,我可以看看?
  • 在我的示例代碼中設置頁面大小是否足以讓打印機選擇正確的紙盒?
  • 有沒有辦法從打印機的PPD文件中找出哪些PS命令是切換紙盒所必需的?此外,該打印機每個尺寸都有兩個托盤,所以如果打印機在紙張用完時將拾取滿紙盤,那將會很不錯。

編輯

從KENS的回答似乎有越來越直接邊界框出的PostScript的沒有簡單的方法。有沒有辦法通過自定義腳本路由PS文件,然後將其發送回CUPS隊列或發送到打印機之前?

回答

1

如果可能,這是製造商通常包含的內容。它要求打印機知道哪個紙盤包含哪種介質。有些打印機確實有這些信息,有些則沒有。對於一些打印機來說,它當然是固定的。

有關您的詳細問題: 1)頁面設備字典中的/ PageSize鍵具有當前請求的介質尺寸。 setpagedevice操作符用於請求媒體(以及任何其他事物)。如果您的PostScript文件不包含媒體選擇操作符(setpagedevice等),那麼它可能包含註釋,它給出了BoundingBox。大多數口譯員會忽略這些(他們是評論),但有些可能允許您處理它們。這通常取決於設備。

如果作業沒有定義它,沒有辦法(在PostScript中)獲取頁面的邊界框,這是因爲它的合法(並且需要打印機出血)使PostScript輸出覆蓋更大的區域比請求的/預期的媒體。

2)選擇一個特定的托盤通常取決於設備,您需要知道您的設備如何執行此操作。我想認爲製造商會尊重頁面設備字典中的MediaPosition鍵,但經驗表明這不太可能。 YMMV

3)PPD 可能(或可能不)包括托盤切換代碼,你必須看看PPD並找出它。至於如果選擇一個滿的紙盒,如果現有的紙盒是空的,這確實超出了PostScript程序的範圍,直到製造商的實施。 在語言級別3的設備中,頁面設備詞典中的TraySwitch鍵控制自動紙盒切換,請參閱PostScript語言參考手冊(第3版)p403,因爲您擁有3級設備,所以您可能很幸運。

由於您已經在使用CUPS,您可以使用通過Ghostscript使用bbox設備運行原始的PostScript/PDF,這會爲您提供頁面上標記的邊界框。只要你有理由相信你(或你的用戶)不會超越媒體邊界設置標記。然後,您可以使用該信息來選擇我認爲正確的「打印機」。

警告:我對CUPS知之甚少。

+0

感謝您的見解。如果在PPD中有托盤切換代碼,我認爲我需要進行反向工程。我認爲應該有一些,因爲可以在打印機的CUPS設置中選擇紙張尺寸。此外還指定了每個紙盒中的介質。在我看來,這比我想象的要複雜一點。 – GorillaPatch

相關問題