直接奉上源代碼,運行環境: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.文檔帶有密碼,解決方法:未嘗試~ 4.……