[SharePoint 2010]使用Word Automation Service将Word转换为PDF
最近的一个项目中遇到一个超级恶心的需求,用户要求从列表项自动的生成PDF文件,这个需求可以说是把小弟我折磨的死去活来。其实生成PDF这种需求很常见,个人觉得让用户先创建一份Word文档,然后再从Word转换为PDF是最好也是最方便的方式,因为在Word中用户可以非常方便的调整文档的格式,而用代码生成PDF的话对于格式的控制是很麻烦的,且非常的不灵活,而且Word也是支持直接保存为PDF格式的,只需点击一下就可以了,但往往最终用户不愿意采用这种手动的方式,客户就是希望能够实现一切都是自动化的。好了,废话不多说了,下面为大家介绍一下在SharePoint 2010中如何使用Word Automation Service来实现自动的将Word转换为PDF。
Word Automation Service是SP 2010中新加入的一个服务应用程序,它的作用就是帮助我们将保存在SharePoint 文档库中的Word文档转换为其它格式的文件。它所支持的文件格式可以在SharePoint管理中心里的管理服务应用程序中点击Word Automation Service服务,进入Word Automation Services设置页面查看。不难看出基本上Word 2010所支持的文件格式Word Automation Service也支持。
Word Automation Service支持的目标文件格式为:.docx, .docm, .dotx, .dotm, .doc, .dot, .rtf, .mht, .mhtml, .xml (Word xml), PDF, XPS
下面我将通过一个例子来为大家展示如何利用Word Automation Service将一份Word格式的文档转换为PDF格式的文档。
首先打开VS 2010创建一个空白的SharePoint项目。需要注意的是要使用Word Automation Service的话,我们就不能使用沙箱解决方案,而只能使用场解决方案。
在Word Automation Service API中微软为我们提供了三种将Word文档转换为PDF 文档的方法,它们分别是:
AddFile()
AddFolder()
AddLibrary()
下面的例子中我会使用AddLibrary()方法来将一个文档库中所有的文档都转换为PDF文件。
项目创建好后,首先要做的就是添加Microsoft.Office.Word.Server的引用,这个dll可以在<path>\14\ISAPI\Microsoft.Office.Word.Server.dll中找到。
项目创建好后就可以编写代码了。哦,写代码前别忘了添加下面两个命名空间。
using Microsoft.Office.Word.Server.Service; using Microsoft.Office.Word.Server.Conversions;
第一步就是要获得WordServiceApplicationProxy对象,需要注意的是我们可以使用SPServiceContext .Current.GetDefaultProxy()方法动态的获得一个默认的Word Automation Service代理对象,而不需要将该服务代理的对象写死在代码中。
第二步就是实例化一个ConversionJob对象。
var m_ wordAutomationProxy = (WordServiceApplicationProxy ) SPServiceContext .Current.GetDefaultProxy(typeof (WordServiceApplicationProxy )); var m_conversionJob = new ConversionJob (wordAutomationProxy);
接下来我们要做的 就是为这个 ConversionJob对象指定一个用户 凭据,以及 一个 名称和最终要转换成的格式。
m_conversionJob.UserToken = SPContext.Current.Web.CurrentUser.UserToken; m_conversionJob.Name = "WordToPdf.ConversionJon"; m_conversionJob.Settings.OutputFormat = SaveFormat.PDF;
最后就是调用ConversionJob对象的AddLibrary ()方法,这个方法需要两个参数,分别是源文档库对象和目标文档库对象。
下面是完整的代码:
protected void ConvertBtn_Click(object sender, EventArgs e) { try { //源文档库 SPList m_wordList = SPContext.Current.Web.Lists["Word文档库"]; //目标文档库 SPList m_pdfList = SPContext.Current.Web.Lists["PDF文档库"]; var m_wordAutomationService = (WordServiceApplicationProxy)SPServiceContext.Current.GetDefaultProxy(typeof(WordServiceApplicationProxy)); var m_conversionJob = new ConversionJob(m_wordAutomationService); m_conversionJob.UserToken = SPContext.Current.Web.CurrentUser.UserToken; m_conversionJob.Name = "WordToPdf.ConversionJon"; m_conversionJob.Settings.OutputFormat = SaveFormat.PDF; m_conversionJob.AddLibrary(m_wordList, m_pdfList); m_conversionJob.Start(); } catch (Exception ex) { Response.Write(ex.Message); } }
当运行上面这段代码后会创建一个ConvertsionJob,它会附加到Word Conversion Timer Job中,当这个Timer Job运行后,我所指定的文档库中的所有Word文件都将被转换为PDF文件并保存到PDF库中,最后让我们一起来看看最终的效果如何。