using System; using System.Collections.Generic; using System.IO; using Excel = Microsoft.Office.Interop.Excel; using PowerPoint = Microsoft.Office.Interop.PowerPoint; using Word = Microsoft.Office.Interop.Word; namespace CGS { public class OfficeToXps { #region Properties & Constants private static List wordExtensions = new List { ".doc", ".docx" }; private static List excelExtensions = new List { ".xls", ".xlsx" }; private static List powerpointExtensions = new List { ".ppt", ".pptx" }; #endregion #region Public Methods public static OfficeToXpsConversionResult ConvertToXps(string sourceFilePath, ref string resultFilePath) { var result = new OfficeToXpsConversionResult(ConversionResult.UnexpectedError); // Check to see if it's a valid file if (!IsValidFilePath(sourceFilePath)) { result.Result = ConversionResult.InvalidFilePath; result.ResultText = sourceFilePath; return result; } var ext = Path.GetExtension(sourceFilePath).ToLower(); // Check to see if it's in our list of convertable extensions if (!IsConvertableFilePath(sourceFilePath)) { result.Result = ConversionResult.InvalidFileExtension; result.ResultText = ext; return result; } // Convert if Word if (wordExtensions.Contains(ext)) { return ConvertFromWord(sourceFilePath, ref resultFilePath); } // Convert if Excel if (excelExtensions.Contains(ext)) { return ConvertFromExcel(sourceFilePath, ref resultFilePath); } // Convert if PowerPoint if (powerpointExtensions.Contains(ext)) { return ConvertFromPowerPoint(sourceFilePath, ref resultFilePath); } return result; } #endregion #region Private Methods public static bool IsValidFilePath(string sourceFilePath) { if (string.IsNullOrEmpty(sourceFilePath)) return false; try { return File.Exists(sourceFilePath); } catch (Exception) { } return false; } public static bool IsConvertableFilePath(string sourceFilePath) { var ext = Path.GetExtension(sourceFilePath).ToLower(); return IsConvertableExtension(ext); } public static bool IsConvertableExtension(string extension) { return wordExtensions.Contains(extension) || excelExtensions.Contains(extension) || powerpointExtensions.Contains(extension); } private static string GetTempXpsFilePath() { return Path.ChangeExtension(Path.GetTempFileName(), ".xps"); } private static OfficeToXpsConversionResult ConvertFromWord(string sourceFilePath, ref string resultFilePath) { object pSourceDocPath = sourceFilePath; string pExportFilePath = string.IsNullOrWhiteSpace(resultFilePath) ? GetTempXpsFilePath() : resultFilePath; try { var pExportFormat = Word.WdExportFormat.wdExportFormatXPS; bool pOpenAfterExport = false; var pExportOptimizeFor = Word.WdExportOptimizeFor.wdExportOptimizeForOnScreen; var pExportRange = Word.WdExportRange.wdExportAllDocument; int pStartPage = 0; int pEndPage = 0; var pExportItem = Word.WdExportItem.wdExportDocumentContent; var pIncludeDocProps = true; var pKeepIRM = true; var pCreateBookmarks = Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks; var pDocStructureTags = true; var pBitmapMissingFonts = true; var pUseISO19005_1 = false; Word.Application wordApplication = null; Word.Document wordDocument = null; try { wordApplication = new Word.Application(); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToInitializeOfficeApp, "Word", exc); } try { try { wordDocument = wordApplication.Documents.Open(ref pSourceDocPath); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile, exc.Message, exc); } if (wordDocument != null) { try { wordDocument.ExportAsFixedFormat( pExportFilePath, pExportFormat, pOpenAfterExport, pExportOptimizeFor, pExportRange, pStartPage, pEndPage, pExportItem, pIncludeDocProps, pKeepIRM, pCreateBookmarks, pDocStructureTags, pBitmapMissingFonts, pUseISO19005_1 ); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToExportToXps, "Word", exc); } } else { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile); } } finally { // Close and release the Document object. if (wordDocument != null) { wordDocument.Close(); wordDocument = null; } // Quit Word and release the ApplicationClass object. if (wordApplication != null) { wordApplication.Quit(); wordApplication = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToAccessOfficeInterop, "Word", exc); } resultFilePath = pExportFilePath; return new OfficeToXpsConversionResult(ConversionResult.OK, pExportFilePath); } private static OfficeToXpsConversionResult ConvertFromPowerPoint(string sourceFilePath, ref string resultFilePath) { string pSourceDocPath = sourceFilePath; string pExportFilePath = string.IsNullOrWhiteSpace(resultFilePath) ? GetTempXpsFilePath() : resultFilePath; try { PowerPoint.Application pptApplication = null; PowerPoint.Presentation pptPresentation = null; try { pptApplication = new PowerPoint.Application(); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToInitializeOfficeApp, "PowerPoint", exc); } try { try { pptPresentation = pptApplication.Presentations.Open(pSourceDocPath, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile, exc.Message, exc); } if (pptPresentation != null) { try { pptPresentation.ExportAsFixedFormat( pExportFilePath, PowerPoint.PpFixedFormatType.ppFixedFormatTypeXPS, PowerPoint.PpFixedFormatIntent.ppFixedFormatIntentScreen, Microsoft.Office.Core.MsoTriState.msoFalse, PowerPoint.PpPrintHandoutOrder.ppPrintHandoutVerticalFirst, PowerPoint.PpPrintOutputType.ppPrintOutputSlides, Microsoft.Office.Core.MsoTriState.msoFalse, null, PowerPoint.PpPrintRangeType.ppPrintAll, string.Empty, true, true, true, true, false ); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToExportToXps, "PowerPoint", exc); } } else { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile); } } finally { // Close and release the Document object. if (pptPresentation != null) { pptPresentation.Close(); pptPresentation = null; } // Quit Word and release the ApplicationClass object. if (pptApplication != null) { pptApplication.Quit(); pptApplication = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToAccessOfficeInterop, "PowerPoint", exc); } resultFilePath = pExportFilePath; return new OfficeToXpsConversionResult(ConversionResult.OK, pExportFilePath); } private static OfficeToXpsConversionResult ConvertFromExcel(string sourceFilePath, ref string resultFilePath) { string pSourceDocPath = sourceFilePath; string pExportFilePath = string.IsNullOrWhiteSpace(resultFilePath) ? GetTempXpsFilePath() : resultFilePath; try { var pExportFormat = Excel.XlFixedFormatType.xlTypeXPS; var pExportQuality = Excel.XlFixedFormatQuality.xlQualityStandard; var pOpenAfterPublish = false; var pIncludeDocProps = true; var pIgnorePrintAreas = true; Excel.Application excelApplication = null; Excel.Workbook excelWorkbook = null; try { excelApplication = new Excel.Application(); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToInitializeOfficeApp, "Excel", exc); } try { try { excelWorkbook = excelApplication.Workbooks.Open(pSourceDocPath); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile, exc.Message, exc); } if (excelWorkbook != null) { try { excelWorkbook.ExportAsFixedFormat( pExportFormat, pExportFilePath, pExportQuality, pIncludeDocProps, pIgnorePrintAreas, OpenAfterPublish : pOpenAfterPublish ); } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToExportToXps, "Excel", exc); } } else { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToOpenOfficeFile); } } finally { // Close and release the Document object. if (excelWorkbook != null) { excelWorkbook.Close(); excelWorkbook = null; } // Quit Word and release the ApplicationClass object. if (excelApplication != null) { excelApplication.Quit(); excelApplication = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } } catch (Exception exc) { return new OfficeToXpsConversionResult(ConversionResult.ErrorUnableToAccessOfficeInterop, "Excel", exc); } resultFilePath = pExportFilePath; return new OfficeToXpsConversionResult(ConversionResult.OK, pExportFilePath); } #endregion } public class OfficeToXpsConversionResult { #region Properties public ConversionResult Result { get; set; } public string ResultText { get; set; } public Exception ResultError { get; set; } #endregion #region Constructors public OfficeToXpsConversionResult() { Result = ConversionResult.UnexpectedError; ResultText = string.Empty; } public OfficeToXpsConversionResult(ConversionResult result) : this() { Result = result; } public OfficeToXpsConversionResult(ConversionResult result, string resultText) : this(result) { ResultText = resultText; } public OfficeToXpsConversionResult(ConversionResult result, string resultText, Exception exc) : this(result, resultText) { ResultError = exc; } #endregion } public enum ConversionResult { OK = 0, InvalidFilePath = 1, InvalidFileExtension = 2, UnexpectedError = 3, ErrorUnableToInitializeOfficeApp = 4, ErrorUnableToOpenOfficeFile = 5, ErrorUnableToAccessOfficeInterop = 6, ErrorUnableToExportToXps = 7 } }