2010-02-03 146 views
15

當我讀到關於WPF的書籍時,我看到作者提到XPS是重要的。 Windows還包括其XPS查看器,而且我已經將其列爲Windows的「特性」。XPS有什麼意義?

但是爲什麼?重點是什麼?誰在使用它?我的理解是,XPS基本上就像PDF,xhtml或ePub(它只是xhtml)......甚至Word的docx格式。這些格式中的許多功能都是相同的。

與任何其他格式相比,它似乎沒有任何主要優勢。在我看來,xhtml會比XPS更有用,這是從RichTextBox保存和加載FlowDocuments的一種方式。我查看了多個關於在兩者之間轉換的博客。互聯網上的大部分或全部富文本是(x)html。除此之外,我不認爲任何人只是用它來發布他們的文檔; PDF是首選。看起來XPS只是MS製作並決定推出的一些隨機格式。我一般都喜歡MS,但他們確實有這種習慣。 MS不能使用xhtml代替api嗎?我認爲這在很多情況下會更有用。

那麼,是否有一點使用XPS,特別是與我提到的其他格式之一(或任何我沒有)?你有沒有在你的程序或其他方面使用過XPS?

回答

8

由於U62已經聲明,WPF附帶了一個DocumentViewer控件,使您可以查看XPS文檔。 DocumentViewer還具有一些有用的功能,如打印,縮放,FitToPage等......因此,您不需要實現該功能或使用第三方工具。

我剛剛使用XPS和DocumentViewer完成了一些「地址標籤打印預覽」。允許用戶從聯繫人列表中選擇一些聯繫人,單擊「打印預覽」。這將打開一個新的XAML窗口,該窗口包含一個DocumentViewer控件和一個帶有不同標籤選擇的ListBox(例如,1張帶12個標籤[2列,6行],1張帶寬度和高度可由用戶定義的單張標籤) 。 根據用戶的選擇,我在用戶使用所選聯繫人的地址選擇的佈局中生成XPS文檔。如果例如用戶選擇了4個聯繫人,並希望在「SingleLabelSheet」上打印它們,我生成了4個頁面的1個XPS文檔,每個頁面包含1個地址。然後我在DocumentViewer中顯示XPS,用戶可以在標籤打印機上打印標籤。

一旦我瞭解了XPS API如何工作(至少是基礎知識),啓動並運行起來需要2個小時。

所以,基本上,我將XPS看作一個易於使用的API來顯示即將生成的FixedDocuments。但我不會個人去把它們保存到我的硬盤,或者以某種方式修改它們,或者你通常對文檔做的任何事情。

3

我能想到的唯一的實際優勢是您可以在WPF應用程序中查看XPS文檔。你提到的其他格式意味着你將不得不引入第三方渲染器(如果你有一年的空閒時間,你可以自己寫一個)。

BTW。我對ePub知之甚少,但XPS不能與XHTML直接比較,它更像是PDF,因爲它被設計爲具有固定佈局。

3

XPS到WPF就像WMF到Win32/WinForms,它是一種持久的格式,可讓您存儲和打印本機WPF圖形。

XPS用於從WPF(即使你直接從應用程序打印照片,無需保存,內部印刷系統是建立在XPS),所以我應該MS做打印:

  1. 創建一個新的文件格式與他們正在嘗試做的事情完全吻合
  2. 從WPF構建一個100%完美的翻譯器,它們不像PDF那樣控制它的格式(並希望Adobe不會使用下一版本的Acrobat Reader打破所有WPF應用程序)。

你會做什麼?

保存XPS文件只是一個很好的獎勵。

+0

我試圖使它與人們實際使用的常見現有事物一起工作。 – 2010-02-04 02:54:32

+0

也許應該提到XPS不僅限於WPF,也可以間接與Win32或WinForms一起使用。 Windows XP和更高版本的系統默認安裝XPS打印機,可用於生成XPS文檔。 – stakx 2010-02-06 09:11:04

3

看,我可能是一個XPS作爲報告生成解決方案的悲觀主義者,但我放棄了它,發現最初的文檔很難理解,現實世界中的樣本比我想要的要少。當我把它放到真實世界的商業應用程序時,我發現它很令人沮喪,特別是在需要跨越多個頁面的表的LOB應用程序中。

從那時起,事情可能已經發生了變化,但只要我開始查看跨越多頁的表,並且想要列標題轉到頂部等,我發現該API要求我執行我要調用的操作過度的解決方法和不必要的複雜性。因此,自那時以來(大約8個月前)事情可能已經發生了變化,但是我從XPS轉到使用ITextSharp,這已經不那麼痛苦了。

因此,與其他人一樣,唯一的優勢就是WPF中的內置查看器 - 但除此之外,我覺得API可能需要稍微「成熟」一些,然後再嘗試再次嘗試。

1

其實我發現一個非常好的理由使用XPS。我想從多個來源打印merge documents並指定雙面打印並裝訂。最後它應該作爲一個雙面打印並裝訂好。我在這麼做的時候很困難,但發現通過打印到XPS(保存到光盤),我可以用最少的大驚小怪完成我的目標。我還沒有找到任何其他簡單直接的方法。

Dim PrintServer As New SysPrint.PrintServer("\\" & My.Computer.Name) 
    Dim PrintQ As New SysPrint.PrintQueue(PrintServer, "Ricoh Main") 
    Dim Jobs As SysPrint.PrintJobInfoCollection = PrintQ.GetPrintJobInfoCollection 
    Dim able As SysPrint.PrintCapabilities = PrintQ.GetPrintCapabilities() 

    Dim CurrentTicket As SysPrint.PrintTicket = PrintQ.CurrentJobSettings.CurrentPrintTicket 
    If able.StaplingCapability IsNot Nothing AndAlso able.StaplingCapability.Count > 0 Then 
     If able.StaplingCapability.Contains(Printing.Stapling.StapleTopLeft) Then 
      CurrentTicket.Stapling = Printing.Stapling.StapleTopLeft 
     End If 
    Else 
     Debug.Print("no stapling capability") 
    End If 

    CurrentTicket.Duplexing = Printing.Duplexing.TwoSidedLongEdge 

    Dim fiName As String = "S:\Temp\PS\XPS\Test.xps" 

    Dim TestJob As SysPrint.PrintSystemJobInfo _ 
      = PrintQ.AddJob("Test job", fiName, False)