2009-08-20 118 views
1

這是一個兩部分的問題:服務器端是否支持System.Printing中的XPS打印路徑?

1.

原始.NET打印類(在System.Drawing.Printing)不支持在服務器端。 (請參閱http://msdn.microsoft.com/en-us/library/system.drawing.printing(VS.80).aspx

我認爲服務器端支持較新的基於XPS的打印類(在System.Printing中),例如,在ASP.NET應用程序和Windows服務中,但我無法證明它。而且微軟還沒有回答我的問題。

這裏有人知道嗎?

新的基於XPS打印有時會做一個內部轉換到GDI。即使應用程序使用新的打印類進行打印,但只有可用的驅動程序是舊式驅動程序的情況下。見http://msdn.microsoft.com/en-us/library/ms742418.aspx。在這種情況下,新類是否可以安全地用於服務器端?

  • 澄清 - 這完全是關於服務器打印的東西。爲了討論的目的,根本沒有涉及網絡瀏覽器。一臺服務器,無論是Windows服務還是asp.net,都需要在連接到服務器的打印機上直接打印文檔。

謝謝。

回答

4

正如我在下面的評論中指出的那樣,在純託管代碼中沒有支持服務器端打印的解決方案。

但是,Aspose剛剛發佈了一些代碼,允許您從託管代碼打印XPS文檔(成功使用PInvoke調用XPS Print API)。 [爲了記錄,我相信微軟對於使用PInvoke來調用XPS打印的初始建議很簡單,因爲它是使用PInvoke進行交互的困難API。但Aspose似乎成功了,這是個好消息,因爲它不需要涉及單獨的任何單獨的非託管DLL。]

總而言之,Aspose解決方案看起來像打印複雜文檔最簡單的完全支持的方式ASP.NET和Windows服務。

詳情點擊這裏:http://www.aspose.com/documentation/.net-components/aspose.words-for-.net-and-java/howto-print-a-document-on-a-server-via-the-xpsprint-api.html

-1

如果您想讓用戶的瀏覽器從服務器代碼打印,請將其忘記。您應該希望的最好方法是使用一些調用了window.print()的JavaScript代碼將頁面發送到瀏覽器。

+0

新增澄清以上 - 這是不是瀏覽器相關。 – 2009-08-20 06:15:47

0

.Net XPS支持是WPF的一部分。在Windows服務中使用WPF不受支持(請參閱MSDN),因此使用.Net進行XPS打印(包括使用System.Printing)也不支持服務。

同樣的答案適用於問題的'轉換爲GDI'部分,因爲該過程自動發生(如果XPS內容正在打印到PrintQueue,而驅動程序不是XPS,則框架會自動轉換XPS內容到基於GDI的應用程序打印時驅動程序預期的DDI調用)。

對於需要XPS打印的服務器端開發(服務),Windows 7中提供了Win32 API。具體而言,請參閱XPSPrint API,它提供對XPS打印路徑的訪問並支持非XPS打印隊列的自動轉換以及可用於處理XPS內容和處理打印票據的API。

+0

嗯。這意味着從託管代碼服務器端打印沒有支持的方式。這聽起來像是微軟在這方面的一大漏洞! (順便說一句,在您發佈的鏈接中,缺少對Windows服務中WPF的支持的原因是WPF具有「執行涉及用戶交互的可視化操作的權限」。打印場景中沒有這些...) – 2009-08-23 20:21:26

+0

爲了記錄,我聯繫了Microsoft,他們解釋說爲什麼System.Printing在服務器上不受支持有很多原因。這不僅僅是因爲用戶交互的可能性(對話等) - 還有其他原因爲什麼它不被服務器端支持。 因此,打印服務器端唯一支持的選項是Win32 GDI或新的「XPS打印」API,該API可通過Windows 7之前的操作系統的附加軟件包提供。後者實際上設計爲可從C++ 。他們建議不要通過C#的PInvoke使用XPS Print。 – 2009-09-20 19:56:52