C#实现office文档转换为PDF或xps的一些方法
这段时间一直在研究office文档转为PDF或xps格式的方法。查找了一些资料。一下是我所知道的一些方法代码支持任意office格式需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS下载地址[url]http://www.microsoft.com/downloads/details.aspx?FamilyId=4D951911-3E7E-4AE6-B059-A2E79ED87041&displaylang=en[/url]这是一个微软官方出的office插件。安装好之后,打开VS,以VS2005为例新建windows应用程序项目添加以下com组件的引用Microsoft Word 12.0 Object LibraryMicrosoft PowerPoint 12.0 Object LibraryMicrosoft Excel 12.0 Object Library?------------------------------------------------------using Word = Microsoft.Office.Interop.Word;
using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;using Microsoft.Office.Core;?我们可以使用一个枚举类型来决定生成文件的类型Word.WdExportFormat wd = Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF;Excel.XlFixedFormatType excelType = Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF;
PowerPoint.PpSaveAsFileType ppType = Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPDF;?这里Word跟Excel我使用了ExportAsFixedFormat,PowerPoint我使用了SaveAs方法。对于Word跟PowerPoint效果是一样的,只是SaveAs方法支持的格式更多。但是Excel似乎不支持SaveAs方法,呵呵----------------Word转换方法private?bool?Convert(string?sourcePath,?string?targetPath, Word.WdExportFormat exportFormat)?
????????????????{?
????????????????????????bool?result;?
????????????????????????object?paramMissing = Type.Missing;?
????????????????????????Word.ApplicationClass wordApplication =?new?Word.ApplicationClass();?
????????????????????????Word.Document wordDocument =?null;?
????????????????????????try?
????????????????????????{?
????????????????????????????????object?paramSourceDocPath = sourcePath;?
????????????????????????????????string?paramExportFilePath = targetPath;?
?
????????????????????????????????Word.WdExportFormat paramExportFormat = exportFormat;?
????????????????????????????????bool?paramOpenAfterExport =?false;?
????????????????????????????????Word.WdExportOptimizeFor paramExportOptimizeFor =?
????????????????????????????????????????Word.WdExportOptimizeFor.wdExportOptimizeForPrint;?
????????????????????????????????Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllDocument;?
????????????????????????????????int?paramStartPage = 0;?
????????????????????????????????int?paramEndPage = 0;?
????????????????????????????????Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentContent;?
????????????????????????????????bool?paramIncludeDocProps =?true;?
????????????????????????????????bool?paramKeepIRM =?true;?
????????????????????????????????Word.WdExportCreateBookmarks paramCreateBookmarks =?
????????????????????????????????????????Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks;?
????????????????????????????????bool?paramDocStructureTags =?true;?
????????????????????????????????bool?paramBitmapMissingFonts =?true;?
????????????????????????????????bool?paramUseISO19005_1 =?false;?
?
????????????????????????????????wordDocument = wordApplication.Documents.Open(?
????????????????????????????????????????ref?paramSourceDocPath,?ref?paramMissing,?ref?paramMissing,?
????????????????????????????????????????ref?paramMissing,?ref?paramMissing,?ref?paramMissing,?
????????????????????????????????????????ref?paramMissing,?ref?paramMissing,?ref?paramMissing,?
????????????????????????????????????????ref?paramMissing,?ref?paramMissing,?ref?paramMissing,?
????????????????????????????????????????ref?paramMissing,?ref?paramMissing,?ref?paramMissing,?
????????????????????????????????????????ref?paramMissing);?
?
????????????????????????????????if?(wordDocument !=?null)?
????????????????????????????????????????wordDocument.ExportAsFixedFormat(paramExportFilePath,?
????????????????????????????????????????????????paramExportFormat, paramOpenAfterExport,?
????????????????????????????????????????????????paramExportOptimizeFor, paramExportRange, paramStartPage,?
????????????????????????????????????????????????paramEndPage, paramExportItem, paramIncludeDocProps,?
????????????????????????????????????????????????paramKeepIRM, paramCreateBookmarks, paramDocStructureTags,?
????????????????????????????????????????????????paramBitmapMissingFonts, paramUseISO19005_1,?
????????????????????????????????????????????????ref?paramMissing);?
????????????????????????????????result =?true;?
????????????????????????}?
????????????????????????finally?
????????????????????????{?
????????????????????????????????if?(wordDocument !=?null)?
????????????????????????????????{?
????????????????????????????????????????wordDocument.Close(ref?paramMissing,?ref?paramMissing,?ref?paramMissing);?
????????????????????????????????????????wordDocument =?null;?
????????????????????????????????}?
????????????????????????????????if?(wordApplication !=?null)?
????????????????????????????????{?
????????????????????????????????????????wordApplication.Quit(ref?paramMissing,?ref?paramMissing,?ref?paramMissing);?
????????????????????????????????????????wordApplication =?null;?
????????????????????????????????}?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????}?
????????????????????????return?result;?
????????????????}Excel转换方法private?bool?Convert(string?sourcePath,?string?targetPath, XlFixedFormatType targetType)?
????????????????{?
????????????????????????bool?result;?
????????????????????????object?missing = Type.Missing;?
????????????????????????ApplicationClass application =?null;?
????????????????????????Workbook workBook =?null;?
????????????????????????try?
????????????????????????{?
????????????????????????????????application =?new?ApplicationClass();?
????????????????????????????????object?target = targetPath;?
????????????????????????????????object?type = targetType;?
????????????????????????????????workBook = application.Workbooks.Open(sourcePath, missing, missing, missing, missing, missing,?
????????????????????????????????????????missing, missing, missing, missing, missing, missing, missing, missing, missing);?
?
????????????????????????????????workBook.ExportAsFixedFormat(targetType, target, XlFixedFormatQuality.xlQualityStandard,?true,?false, missing, missing, missing, missing);?
????????????????????????????????result =?true;?
????????????????????????}?
????????????????????????catch?
????????????????????????{?
????????????????????????????????result =?false;?
????????????????????????}?
????????????????????????finally?
????????????????????????{?
????????????????????????????????if?(workBook !=?null)?
????????????????????????????????{?
????????????????????????????????????????workBook.Close(true, missing, missing);?
????????????????????????????????????????workBook =?null;?
????????????????????????????????}?
????????????????????????????????if?(application !=?null)?
????????????????????????????????{?
????????????????????????????????????????application.Quit();?
????????????????????????????????????????application =?null;?
????????????????????????????????}?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????}?
????????????????????????return?result;?
????????????????}PowerPoint转换方法????????????????private?bool?Convert(string?sourcePath,?string?targetPath, PpSaveAsFileType targetFileType)?
????????????????{?
????????????????????????bool?result;?
????????????????????????object?missing = Type.Missing;?
????????????????????????ApplicationClass application =?null;?
????????????????????????Presentation persentation =?null;?
????????????????????????try?
????????????????????????{?
????????????????????????????????application =?new?ApplicationClass();?
????????????????????????????????persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);?
????????????????????????????????persentation.SaveAs(targetPath, targetFileType, Microsoft.Office.Core.MsoTriState.msoTrue);?
?
????????????????????????????????result =?true;?
????????????????????????}?
????????????????????????catch?
????????????????????????{?
????????????????????????????????result =?false;?
????????????????????????}?
????????????????????????finally?
????????????????????????{?
????????????????????????????????if?(persentation !=?null)?
????????????????????????????????{?
????????????????????????????????????????persentation.Close();?
????????????????????????????????????????persentation =?null;?
????????????????????????????????}?
????????????????????????????????if?(application !=?null)?
????????????????????????????????{?
????????????????????????????????????????application.Quit();?
????????????????????????????????????????application =?null;?
????????????????????????????????}?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????????????GC.Collect();?
????????????????????????????????GC.WaitForPendingFinalizers();?
????????????????????????}?
????????????????????????return?result;?
????????????????}?如果是word文档或者Excel文档想要转换xps格式,我们还可以有一种方法,那就是利用xps虚拟打印机实现。安装了.NetFrameWork3.5之后,默认会在系统中安装XPS虚拟打印机,我们将其设置为默认打印机。Microsoft XPS Document Writerword文档打印为xps????????????????public?void?PrintWord(string?wordfile)?
????????????????{?
????????????????????????oWord.ApplicationClass word =?new?oWord.ApplicationClass();?
????????????????????????Type wordType = word.GetType();?
?
????????????????????????//打开WORD文档?
????????????????????????oWord.Documents docs = word.Documents;?
????????????????????????Type docsType = docs.GetType();?
????????????????????????object?objDocName = wordfile;?
????????????????????????oWord.Document doc = (oWord.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod,?null, docs,?new?Object[] { objDocName,?true,?true?});?
?
????????????????????????//打印输出到指定文件?
????????????????????????//可以使用 doc.PrintOut();方法,次方法调用中的参数设置较繁琐,建议使用 Type.InvokeMember 来调用时可以不用将PrintOut的参数设置全,只设置4个主要参数?
????????????????????????Type docType = doc.GetType();?
????????????????????????object?printFileName = wordfile +?".xps";?
????????????????????????docType.InvokeMember("PrintOut", System.Reflection.BindingFlags.InvokeMethod,?null, doc,?new?object[] {?false,?false, oWord.WdPrintOutRange.wdPrintAllDocument, printFileName });?
?
????????????????????????//退出WORD?
????????????????????????wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,?null, word,?null);?
????????????????}Excel利用虚拟打印机转换为xps????????????????public?void?PrintExcel(string?execlfile)?
????????????????{?
????????????????????????Excel.ApplicationClass eapp =?new?Excel.ApplicationClass();?
????????????????????????Type eType = eapp.GetType();?
????????????????????????Excel.Workbooks Ewb = eapp.Workbooks;?
????????????????????????Type elType = Ewb.GetType();?
????????????????????????object?objelName = execlfile;?
????????????????????????Excel.Workbook ebook = (Excel.Workbook)elType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod,?null, Ewb,?new?Object[] { objelName,?true,?true?});?
?
????????????????????????object?printFileName = execlfile +?".xps";?
?
????????????????????????Object oMissing = System.Reflection.Missing.Value;?
????????????????????????ebook.PrintOut(oMissing, oMissing, oMissing, oMissing, oMissing,?true, oMissing, printFileName);?
?
????????????????????????eType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,?null, eapp,?null);?
????????????????},同样,如果系统安装了PDF虚拟打印机,如5D PDF之类的,我们也可以将其设置为默认打印机以达到转换为PDF格式的目的我们可以将这些方法放在windows service里面,实现文档的后台转换。
本文出自 “Sean Li 技术成就梦想!” 博客,请务必保留此出处http://seanli888.blog.51cto.com/345958/112268