前言:在SharePoint使用過程中,經常會發現將文檔進行格式轉換的需求,之前,看到SharePoint 2013有將PPT轉換PDF文檔的服務,后來,才發現SharePoint 2010開始,就有將Word文檔轉換PDF的服務了,用起來還是不錯的。
下面,我們就來看看這個服務,如何將一個Word文檔庫批量轉換成PDF文件,或者,將單一Word文檔轉換為PDF文檔。
一、 效果展示
新建文檔庫inputList作為word存放庫,上傳測試文檔,如下圖:
新建文檔庫outputList,作為輸出PDF庫,里面沒有文件,如下圖:
執行文件轉換程序,執行后outputList文檔庫,如下圖:
發現outputList還是沒有文件,因為該服務是TimerJob的計時器任務,所以需要定時執行,去管理中心,找到該計划任務,立即運行,如下圖:
再一次刷新outputList文檔庫,如下圖:
下載一個PDF文件到本地,PDF閱讀器打開,如下圖:
二、 操作步驟
1、 新建項目,添加引用Microsoft.Office.Word.Server.dll,如下圖:
位置如下:
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.Office.Word.Server\v4.0_15.0.0.0__71e9bce111e9429c\Microsoft.Office.Word.Server.dll
2、 引用類庫
using Microsoft.Office.Word.Server;
using Microsoft.Office.Word.Server.Conversions;
主要用於轉換操作的是Microsoft.Office.Word.Server.Conversions,詳細請參考附后的msdn文檔。
3、 編寫添加核心代碼之文檔庫批量轉換
1 //創建一個轉換job
2 ConversionJob myJob = newConversionJob("Word Automation Services"); 3
4 //設置轉換job的UserToken、轉換格式
5 myJob.UserToken = site.UserToken; 6 myJob.Settings.OutputFormat = SaveFormat.PDF; 7 myJob.Settings.OutputSaveBehavior = SaveBehavior.AppendIfPossible; 8
9 //獲取轉出、轉入文檔庫
10 SPList inputLibrary = web.Lists["inputlist"]; 11 SPList outputLibrary = web.Lists["outputlist"]; 12
13 //設置並執行轉換job
14 myJob.AddLibrary(inputLibrary, outputLibrary); 15 myJob.Start();
4、 編寫核心代碼之單一文件轉換
1 //創建一個異步轉換
2 SyncConverter sc = newSyncConverter("Word Automation Services"); 3
4 //設置轉換UserToken、轉換類型等
5 sc.UserToken = site.UserToken; 6 sc.Settings.UpdateFields = true; 7 sc.Settings.OutputFormat = SaveFormat.PDF; 8
9 //讀取需要轉換的文件
10 SPFolder docs = web.Folders[siteURL +
11 "/Word_Transfer"]; 12 SPFile file = docs.Files[siteURL +
13 "/Word_Transfer/SharePoint2013Word轉換PDF服務測試文檔.docx"]; 14
15 //生成保存轉換后文檔的文件流
16 Stream fStream = file.OpenBinaryStream(); 17 SPFileStream stream = newSPFileStream(web, 0x1000); 18
19 //啟動異步轉換
20 ConversionItemInfo info = sc.Convert(fStream, stream); 21
22 //轉換后文檔添加到文檔庫
23 SPFile newFile = docs.Files.Add( 24 "SharePoint2013Word轉換PDF服務測試文檔.pdf", 25 stream, 26 true);
5、 單一文件轉換效果圖,如下圖:
三、 Word Automation Services介紹
1、 簡單介紹
Word Automation Services 是一項新的 SharePoint Server 2010 技術,它允許以無人參與的方式從服務器端轉換 Microsoft Word 支持的文檔。簡言之,Word Automation Services 采用 Word 客戶端應用程序的“另存為…”功能並為服務器復制該功能。
通過 Word Automation Services,以前需要您運行 Word 客戶端應用程序的任務現在可以無人參與模式自動運行,並且比以前的解決方案更可靠、伸縮性更強。
以上是msdn上,關於Word Automation Services的說明,msdn很清楚的說到,這個服務的本質是采用Word客戶端另存為的功能,所以,打開和另存的格式,和word2013客戶端基本一致。
2、 Word Automation Services體系結構
如上圖,可以看到Word Automation Services服務的原理,通過對象模型將操作進入隊列管理器,排隊等候計時器作業(TimerJob)定時執行,然后調用Word文件轉換服務引擎,將轉換后的文件存入SharePoint內容數據庫。
特別的是,這個服務並不需要在服務器端,安裝Office Word各種版本,即可完成操作,並且支持SharePoint2010和SharePoint2013版本。
3、 Word Automation Services三個基本概念
Word Automation Services 包含三個基本概念,即轉換、轉換作業和文檔隊列。轉換是一個過程,在此過程中,Word Automation Services 會接收一個具有給定格式的文件,然后以不同的格式將該文件輸出。例如,服務可以將 Word 2010 文檔 (.docx) 轉換為 PDF 文檔。
所有轉換都通過以下步驟進行:
Ø 創建一個轉換作業。
Ø 提供該作業的設置(例如,所需的輸出文件格式)。
Ø 向該作業添加一個或多個文件。
Ø 將該作業提交到文檔隊列。
所有轉換操作都基於轉換作業 的創建或使用。轉換作業將描述要轉換的文件和要對這些文件執行的操作。每個文件都將構成一個轉換項,並且每個轉換項都將映射到一個轉換作業。一個轉換作業可包含多個轉換項。
文檔隊列 是一個“先進先出”隊列,Word Automation Services 使用它根據為轉換作業設置的計划來啟動轉換。
4、 支持打開的文檔格式
Ø 打開 XML 文件格式文檔(.docx, .docm, .dotx, .dotm)。
Ø Word 97-2003 文檔(.doc, .dot)。
Ø RTF 格式文件 (.rtf)。
Ø 單個文件網頁(.mht, .mhtml)。
Ø Word 2003 XML 文檔 (.xml)。
Ø Word XML 文檔 (.xml)。
5、 保存 Word 可以保存的文檔類型,除去支持以上支持打開的類型,還包括一下兩種:
Ø 可移植文檔格式 (PDF) 文件。
Ø XML 紙張規范 (XPS) 文件。
四、 完整代碼
1、文檔庫批量轉換代碼

using (SPSite site = new SPSite(siteURL)) { using (SPWeb web = site.OpenWeb()) { ConversionJob myJob = new ConversionJob("Word Automation Services"); myJob.UserToken = site.UserToken; myJob.Settings.OutputFormat = SaveFormat.PDF; myJob.Settings.OutputSaveBehavior = SaveBehavior.AppendIfPossible; SPList inputLibrary = web.Lists["inputlist"]; SPList outputLibrary = web.Lists["outputlist"]; myJob.AddLibrary(inputLibrary, outputLibrary); myJob.Start(); } }
2、文檔單獨轉換代碼

using (SPSite site = new SPSite(siteURL)) { using (SPWeb web = site.OpenWeb()) { SyncConverter sc = new SyncConverter("Word Automation Services"); sc.UserToken = site.UserToken; sc.Settings.UpdateFields = true; sc.Settings.OutputFormat = SaveFormat.PDF; SPFolder docs = web.Folders[siteURL +
"/Word_Transfer"]; SPFile file = docs.Files[siteURL +
"/Word_Transfer/SharePoint2013Word轉換PDF服務測試文檔.docx"]; Stream fStream = file.OpenBinaryStream(); SPFileStream stream = new SPFileStream(web, 0x1000); ConversionItemInfo info = sc.Convert(fStream, stream); SPFile newFile = docs.Files.Add( "SharePoint2013Word轉換PDF服務測試文檔.pdf", stream, true); } }
參考文獻
Word Automation Services
http://msdn.microsoft.com/zh-cn/library/ee558278(v=office.14).aspx