引言
在項目開發中,word的讀取和顯示會經常出現在客戶的需求中。特別是一些有關法律規章制度、通知、紅頭文件等,都是用word發布的。
在WPF中,對顯示WORD沒有特定的控件,這對開發顯示WORD的需求就增加了點困難。其實只要轉換下思路,問題就可以迎刃而解了。
WORD轉換為XPS
沒錯,就是XPS了。XPS 是XML Paper Specification(XML文件規格書)的簡稱,是一種電子文件格式,它是微軟公司開發的一種文檔保存與查看的規范。.NET平台下,對操作XPS文件格式,提供了支持。另外,在WPF中,可以使用DocumentViewer來瀏覽XPS文件。這時只需把word轉換為XPS,再用DocumentViewer來顯示,問題就得到了很好的解決。下面是word轉換為xps的方法,需要引用Microsoft.Office.Interop.Word組件。
1 private XpsDocument ConvertWordToXPS(string wordDocName) 2 { 3 FileInfo fi=new FileInfo(wordDocName); 4 XpsDocument result = null; 5 string xpsDocName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), fi.Name); 6 xpsDocName = xpsDocName.Replace(".docx", ".xps").Replace(".doc", ".xps"); 7 Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application(); 8 try 9 { 10 if (!File.Exists(xpsDocName)) 11 { 12 wordApplication.Documents.Add(wordDocName); 13 Document doc = wordApplication.ActiveDocument; 14 doc.ExportAsFixedFormat(xpsDocName, WdExportFormat.wdExportFormatXPS, false, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, 0, 0, WdExportItem.wdExportDocumentContent, true, true, WdExportCreateBookmarks.wdExportCreateHeadingBookmarks, true, true, false, Type.Missing); 15 result = new XpsDocument(xpsDocName, System.IO.FileAccess.Read); 16 } 17 18 if (File.Exists(xpsDocName)) 19 { 20 result = new XpsDocument(xpsDocName, FileAccess.Read); 21 } 22 23 } 24 catch (Exception ex) 25 { 26 string error = ex.Message; 27 wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges); 28 } 29 30 wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges); 31 32 return result; 33 }
上面方法傳遞一個word文件路徑,然后返回一個XpsDocument。方法用我把XPS文件存放到了SpecialFolder.InternetCache文件夾中,因為XPS是作為中間轉換,不需要存放和使用。方法返回XpsDocument,就可以使用下面兩行代碼即可顯示到界面上來:
docViewer.Document = ConvertWordToXPS(filePath).GetFixedDocumentSequence();
docViewer.FitToWidth();
這樣,一個顯示WORD文檔就輕搞定了!

擴展
1、這只是顯示WORD的,那能顯示PDF,txt嘛?答案是肯定的。同樣,只需把PDF,txt轉換為XPS就可以了。PDF轉換為XPS,可以參考下這篇:Link。采用Adobe Reader 和Microsoft XPS默認打印,然后另存為的方式,這個方法有點麻煩,其實還有更有效的方法,這里就留給大家思考和google了。
2、上面的XPS只作為中間轉換,能否保存起來,這樣下次就不用再轉換,直接讀取?Of course ! 保存XPS,可以有兩種方法,一種是用文件式保存到指定目錄中;一種是保存到數據庫中。文件式的保存,我就不多介紹了。那XPS如何保存到數據庫中呢?其實,XPS是一種二進制流的格式,這和image保存到數據庫中是一樣的。所以,只需把XPS文件讀成byte類型,就可以保存到數據庫中image類型的字段下。顯示時,直接從數據庫中讀取生成XPS顯示到DocumentViewer上就可以了。但這樣做有個缺點:當文件轉換為XPS,文件會變大,如果保存起來的,相當浪費空間。
Thank you !
