2010-08-10 40 views
3

我需要一種以打印方式以編程方式設置每頁打印設置的好方法。在Windows中打印時,以編程方式設置每頁打印頁數(N-Up)選項

我知道用戶可以通過打印機設置對話框選擇此選項,並且如果我願意,我可以做出這樣的對話框顯示。但是在我正在開發的程序的上下文中,我需要通過軟件本身來選擇它,而不需要用戶深入研究打印機設置。

雖然看起來我可以問Windows是否打印機使用DEVMODE結構的dmNup成員支持此操作,但似乎沒有任何官方方式來爲當前打印作業實際設置它。

顯然,一種解決方案是在我的軟件中更改打印算法,以便在設備上下文中適當地佈置頁面,以便在生成的輸出中獲取每頁多個頁面。但是,我還沒有看到任何簡單的方法可以做到這一點,即在繪製到打印機設備上下文的所有代碼中不需要進行重大更改。出於各種原因,我寧願避免大規模的代碼更改。

另一種解決方案是在Windows中安裝打印機的多個副本,同時將它們全部指向同一個打印機端口。打印機的每個副本都設置了不同的默認頁數(每頁)。然後軟件可以選擇合適的打印機,最終結果就好像它已經以編程方式選擇了每張紙所需的頁數選項。但是,我遇到了這個方案中的各種問題,所以我正在尋找一種替代方案,減輕支持負擔。

This article提供了另一種可能的解決方案:操縱官方DEVMODE結構後面的專用驅動程序數據中的適當字節。問題是,不能保證任何特定的打印機驅動程序實際上使用相同的字節,並且我需要基本上支持在辦公環境中可以合理使用的任何打印機。看起來我的軟件需要一個配置,我可以爲不使用默認值的驅動程序指定不同的字節偏移量。這可能是罕見的事件或頻繁頭痛,取決於多少打印機驅動程序決定使用此設置的不同字節。

因此,這裏是我的問題:

  • 沒有人有使用操縱私人司機數據的最後一個技術的任何真實世界的體驗?處理來自不同製造商的各種打印機時它有多好?
  • 有沒有其他技術我忽略了?
  • 如果沒有別的,那麼是否有任何簡單的方法可以將文本,線條,圖形等繪製到打印機設備上下文中,並以某種方式強制它縮放,移動和可能旋轉(每頁2頁)輸出到設備上下文中的必要位置,而無需編寫所有代碼(並且不會丟失1像素寬的線)?

注意:值得一提的是,我正在使用的程序是使用C++和MFC。但是,所有這些應該同樣適用於處理設備上下文和其他Windows API本身的任何程序。

回答

0

那麼,自從我使用GDI和MFC以來,它已經有一段時間了,但我過去在打印機方面做了很多工作。我傾向於說,因爲GDI應該將您的程序從具有繪畫上下文的知識中抽象出來,因爲您對某個特定的API調用而言運氣不好。但是,可能有一些方法可以做到這一點,而不是像在結構的私有區域中砰擊一樣。

我要做的第一件事就是看CDC :: Escape方法(或Escape Win32 API函數)。在最好的情況下,有一個標準的轉義序列來將打印機設置爲n-up模式。在最糟糕的情況下,您必須找到打印機的轉義序列並將其發送。 (曾幾何時,這是讓打印機使用他們奇特功能的唯一方法。)大多數打印機開始實施一種語言標準(PCL?HPGL?我忘了哪一個)。如果他們仍然使用標準語言,許多打印機可能會理解轉義序列。

如果失敗了,您可能需要在上下文中手動實現自己的n-up繪圖,但使用像SetMapMode這樣的設置將單位設置爲Twips(或其他任何工作)並預先繪製它。

否則,請嘗試查看GDI如何處理縮放並查看是否有效。

0

在Win XP及更高版本中實施XPS後,如果您將源應用程序作爲WPF/.NET應用程序,則可以使用PrintTicket作爲設置NUp的機制。

http://msdn.microsoft.com/en-us/library/system.printing.printticket.pagespersheet.aspx 指定N-Up的屬性。理想情況下,如果繪圖應用程序正在設置此項,然後調用打印驅動程序,則Windows 應該設置正確的NUp設置並將其傳遞給底層驅動程序(GDI或XPS)。但是,也許這隻適用於那些實施了打印票轉換的驅動程序。

0

我遇到了關於How to Print Multiple Pages on One Sheet的教程。

基本上,您將需要使用文檔的PageSize和每頁希望顯示的頁數縮放圖形。

如果要在每張紙上顯示2個頁面,則只會繪製文檔的一半,然後增加一個索引,以便下一個循環的下一個迭代在後半部分打印。

我有代碼,你可以看看我的SO問題在這裏:PrintPage PrintPageEventHandler Is Printing Too Many Copies。事實證明,我錯誤地在我的文檔中設置了份數。