C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)

C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)

直接奉上源代码,运行环境:Office2010,Project2010(如果需要),Visio2010(如果需要),.net framework2.0

 

[csharp]  

using System;  

using Microsoft.Office.Core;  

  

namespace Office  

{  

    class Util  

    {  

        private Util() { }  

        /// <summary>  

        /// 把Word文件转换成为PDF格式文件  

        /// </summary>  

        /// <param name="sourcePath">源文件路径</param>  

        /// <param name="targetPath">目标文件路径</param>   

        /// <returns>true=转换成功</returns>  

        public static bool WordToPDF(string sourcePath, string targetPath)  

        {  

            bool result = false;  

            Microsoft.Office.Interop.Word.WdExportFormat exportFormat = Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF;  

            Microsoft.Office.Interop.Word.ApplicationClass application = null;  

  

            Microsoft.Office.Interop.Word.Document document = null;  

            try  

            {  

                application = new Microsoft.Office.Interop.Word.ApplicationClass();  

                application.Visible = false;  

                document = application.Documents.Open(sourcePath);  

                document.SaveAs2();  

                document.ExportAsFixedFormat(targetPath, exportFormat);  

                result = true;  

            }  

            catch (Exception e)  

            {  

                Console.WriteLine(e.Message);  

                result = false;  

            }  

            finally  

            {  

                if (document != null)  

                {  

                    document.Close();  

                    document = null;  

                }  

                if (application != null)  

                {  

                    application.Quit();  

                    application = null;  

                }  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

            }  

            return result;  

        }  

  

        /// <summary>  

        /// 把Microsoft.Office.Interop.Excel文件转换成PDF格式文件  

        /// </summary>  

        /// <param name="sourcePath">源文件路径</param>  

        /// <param name="targetPath">目标文件路径</param>   

        /// <returns>true=转换成功</returns>  

        public static bool ExcelToPDF(string sourcePath, string targetPath)  

        {  

            bool result = false;  

            Microsoft.Office.Interop.Excel.XlFixedFormatType targetType = Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF;  

            object missing = Type.Missing;  

            Microsoft.Office.Interop.Excel.ApplicationClass application = null;  

            Microsoft.Office.Interop.Excel.Workbook workBook = null;  

            try  

            {  

                application = new Microsoft.Office.Interop.Excel.ApplicationClass();  

                application.Visible = false;  

                workBook = application.Workbooks.Open(sourcePath);  

                workBook.SaveAs();  

                workBook.ExportAsFixedFormat(targetType, targetPath);  

                result = true;  

            }  

            catch (Exception e)  

            {  

                Console.WriteLine(e.Message);  

                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;  

        }  

        /// <summary>  

        /// 把PowerPoint文件转换成PDF格式文件  

        /// </summary>  

        /// <param name="sourcePath">源文件路径</param>  

        /// <param name="targetPath">目标文件路径</param>   

        /// <returns>true=转换成功</returns>  

        public static bool PowerPointToPDF(string sourcePath, string targetPath)  

        {  

            bool result;  

            Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType targetFileType = Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPDF;  

            object missing = Type.Missing;  

            Microsoft.Office.Interop.PowerPoint.ApplicationClass application = null;  

            Microsoft.Office.Interop.PowerPoint.Presentation persentation = null;  

            try  

            {  

                application = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();  

                //application.Visible = MsoTriState.msoFalse;  

                persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);  

                persentation.SaveAs(targetPath, targetFileType, Microsoft.Office.Core.MsoTriState.msoTrue);  

  

                result = true;  

            }  

            catch(Exception e)  

            {  

                Console.WriteLine(e.Message);  

                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;  

        }  

  

        /// <summary>  

        /// 把Visio文件转换成PDF格式文件  

        /// </summary>  

        /// <param name="sourcePath">源文件路径</param>  

        /// <param name="targetPath">目标文件路径</param>   

        /// <returns>true=转换成功</returns>  

        public static bool VisioToPDF(string sourcePath, string targetPath)  

        {  

            bool result;  

            Microsoft.Office.Interop.Visio.VisFixedFormatTypes targetType = Microsoft.Office.Interop.Visio.VisFixedFormatTypes.visFixedFormatPDF;  

            object missing = Type.Missing;  

            Microsoft.Office.Interop.Visio.ApplicationClass application = null;  

            Microsoft.Office.Interop.Visio.Document document = null;  

            try  

            {  

                application = new Microsoft.Office.Interop.Visio.ApplicationClass();  

                application.Visible = false;  

                document = application.Documents.Open(sourcePath);  

                document.Save();  

                document.ExportAsFixedFormat(targetType, targetPath, Microsoft.Office.Interop.Visio.VisDocExIntent.visDocExIntentScreen, Microsoft.Office.Interop.Visio.VisPrintOutRange.visPrintAll);  

                result = true;  

            }  

            catch (Exception e)  

            {  

                Console.WriteLine(e.Message);  

                result = false;  

            }  

            finally  

            {  

                if (application != null)  

                {  

                    application.Quit();  

                    application = null;  

                }  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

            }  

            return result;  

        }  

  

        /// <summary>  

        /// 把Project文件转换成PDF格式文件  

        /// </summary>  

        /// <param name="sourcePath">源文件路径</param>  

        /// <param name="targetPath">目标文件路径</param>   

        /// <returns>true=转换成功</returns>  

        public static bool ProjectToPDF(string sourcePath, string targetPath)  

        {  

            bool result;  

            object missing = Type.Missing;  

            Microsoft.Office.Interop.MSProject.ApplicationClass application = null;  

            try  

            {  

                application = new Microsoft.Office.Interop.MSProject.ApplicationClass();  

                application.Visible = false;  

                application.FileOpenEx(sourcePath);  

                application.DocumentExport(targetPath,Microsoft.Office.Interop.MSProject.PjDocExportType.pjPDF);  

                result = true;  www.2cto.com

            }  

            catch (Exception e)  

            {  

                Console.WriteLine(e.Message);  

                result = false;  

            }  

            finally  

            {  

                if (application != null)  

                {  

                    application.DocClose();  

                    application.Quit();  

                    application = null;  

                }  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

                GC.Collect();  

                GC.WaitForPendingFinalizers();  

            }  

            return result;  

        }  

    }  

}  

 

如果需要将Publish等其他文档进行转码,或者将文档转为其他格式(如xps),参照以上代码就可以了。原理其实很简单,比如说word2010,只要点击另存为,就会出现很多格式供你选择,这里正是调用了此接口。

尝试过使用Apache的OpenOffice进行转码,Word、Execel、Ppt勉强还可以转换(没有复杂图形),但效果也不好,其他的文档类型,OpenOffice根本无能为力,后来为了简单起见,就使用了原生态的Office接口。

 

转码的用途(好处):可以在浏览器直接预览文档(由于项目组文档共享的需要,于是就开发了这么个玩意,配合WebServer,在文件上传后就立即进行转码,以后点击该文档,就返回转码后的文档,浏览器就可以直接浏览,很方便~)

 

本文地址

 

小小总结一下

 

采用C#的好处:100%完美转码,Perfect!不足:只能部署在windows服务器~

 

采用OpenOffice的好处:跨平台。不足:转码效果不理想~

 

 

提醒

 

以上是核心代码,在调用过程中,可能会出现以下问题导致转码失败:

 

1.文档被占用,解决方法:在转码前先复制一份,然后对副本进行转码~

 

2.文档损坏,解决方法:修复后再转~

 

3.文档带有密码,解决方法:未尝试~

posted @ 2014-03-28 16:49  北极海  阅读(861)  评论(1编辑  收藏  举报