C#实现office文档转换为PDF或xps的一些方法

 

这段时间一直在研究office文档转为PDF或xps格式的方法。查找了一些资料。
一下是我所知道的一些方法
代码支持任意office格式
需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS
下载地址
这是一个微软官方出的office插件。
安装好之后,打开VS,以VS2005为例
新建windows应用程序项目
添加以下com组件的引用
Microsoft Word 12.0 Object Library
Microsoft PowerPoint 12.0 Object Library
Microsoft 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转换方法
privatebool 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转换方法
privatebool 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转换方法
                privatebool 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 Writer
word文档打印为xps
                publicvoid 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, newobject[] { false,false, oWord.WdPrintOutRange.wdPrintAllDocument, printFileName });

                        //退出WORD
                        wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,null, word, null);
                }
Excel利用虚拟打印机转换为xps
                publicvoid 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

 

阅读更多
个人分类: .NET And C#
想对作者说点什么? 我来说一句

c#语言将office文档转为XPS

2016年01月12日 110KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭