將office檔和tif檔轉化為pdf檔(C#代碼)

来源:互联网 发布:网络借贷管理暂行办法 编辑:程序博客网 时间:2024/06/11 15:29

參考網址: 

Microsoft.Office.Interop.PowerPoint Namespace 

 http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint.aspx

Microsoft.Office.Interop.Word Namespace

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.aspx

Microsoft.Office.Interop.Excel Namespace

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.aspx

 

 

首先需要引用word、excel、powerpoint的dll以及office.dll

using Word = Microsoft.Office.Interop.Word;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Excel = Microsoft.Office.Interop.Excel;

 

安裝Bullzip PDF Printer(將office轉化為pdf)和ImageMagick(將tif轉化為pdf)

 

主要代碼

#region doc、xls、ppt、tiff格式转换函数

        private string ConvertPpt2Pdf(string sourceFile)
        {

            if (!File.Exists(sourceFile))
            {
                throw new Exception(string.Format("File not found:{0}", sourceFile));
            }
            string strDir = Path.GetDirectoryName(sourceFile);
            string currentTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string psFileName = string.Format("{0}//{1}.ps", strDir, currentTime);
            string pdfFileName = string.Format("{0}//{1}.pdf", strDir, currentTime);
            string FileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceFile);
            string resultPdfFileName = string.Format("{0}//{1}.pdf", strDir, FileNameWithoutExtension);

            PowerPoint.ApplicationClass powerpoint = null;
            powerpoint.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
            PowerPoint.Presentation ppt = null;
             string pageNum = null;
            try
            {

                powerpoint = new PowerPoint.ApplicationClass();
                ppt = powerpoint.Presentations.Open(sourceFile,
                 Microsoft.Office.Core.MsoTriState.msoFalse,
                 Microsoft.Office.Core.MsoTriState.msoTrue,
                 Microsoft.Office.Core.MsoTriState.msoFalse);

                string oldPrinter = ppt.PrintOptions.ActivePrinter;
                ppt.PrintOptions.ActivePrinter = "Bullzip PDF Printer";

                pageNum = ppt.Slides.Count.ToString();
                 Response.Write("The   number   of   pages   in   ppt   is   {0} " + pageNum);
                ppt.PrintOut(-1, -1, psFileName, 1, Microsoft.Office.Core.MsoTriState.msoTrue);
                ppt.PrintOptions.ActivePrinter = oldPrinter;

                int t = 5;
                while (!File.Exists(psFileName) && t > 0)
                {
                    System.Threading.Thread.Sleep(100);
                    t--;
                   
                }

                int i = 3;
                long currentLength = 0;
                string length = null;
                while (i > 0)
                {
                   
                    currentLength = new FileInfo(psFileName).Length;
                    if (currentLength == 0)
                        continue;
                    if (length == currentLength.ToString())
                    {
                        i--;
                    }
                    else
                    {
                        length = currentLength.ToString();
                    }
                    System.Threading.Thread.Sleep(200);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                if (ppt != null)
                {
                    ppt.Close();
                    ppt = null;
                }
                if (powerpoint != null)
                {
                    powerpoint.Quit();
                    powerpoint = null;
                }
            }
            try
            {
                if (File.Exists(psFileName))
                {
                    ConvertPs2Pdf(psFileName);
                }
                System.Threading.Thread.Sleep(1000);
                if (File.Exists(psFileName))
                {
                    while (IsFileInUse(psFileName))
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                    File.Delete(psFileName);
                }
                if (File.Exists(pdfFileName))
                {
                    while (IsFileInUse(pdfFileName))
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                    File.Move(pdfFileName, resultPdfFileName);
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (!File.Exists(resultPdfFileName))
                {
                    int n = 20;

                    while (!File.Exists(pdfFileName) && n > 0)
                    {
                        System.Threading.Thread.Sleep(100);
                        n--;
                    }
                    if (File.Exists(pdfFileName))
                    {
                        while (IsFileInUse(pdfFileName))
                        {
                            System.Threading.Thread.Sleep(100);
                        }
                        File.Delete(pdfFileName);
                    }
                }

            }
            return resultPdfFileName;

        }

         

 

         private string ConvertXls2Pdf(string sourceFile)
        {
            if (!File.Exists(sourceFile))
                throw new Exception(string.Format("File not found:{0}", sourceFile));

            string strDir = Path.GetDirectoryName(sourceFile);
            string currentTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string psFileName = string.Format("{0}//{1}.ps", strDir, currentTime);
            string pdfFileName = string.Format("{0}//{1}.pdf", strDir, currentTime);
            string FileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceFile);
            string resultPdfFileName = string.Format("{0}//{1}.pdf", strDir, FileNameWithoutExtension);

            object UpdateLinks = new object[] { 2 };
            object;
            object Format = System.Reflection.Missing.Value;
            object Password = System.Reflection.Missing.Value;
            object WriteResPassword = System.Reflection.Missing.Value;
            object IgnoreReadOnlyRecommended = false;
            object Origin = Excel.XlPlatform.xlWindows;
            object Delimiter = System.Reflection.Missing.Value;
            object Editable = false;
            object Notify = true;
            object Converter = System.Reflection.Missing.Value;
            object AddToMru = System.Reflection.Missing.Value;
            object Local = System.Reflection.Missing.Value;
            object CorruptLoad = System.Reflection.Missing.Value;

            object From = System.Reflection.Missing.Value;
            object To = System.Reflection.Missing.Value;
            object Copies = System.Reflection.Missing.Value;
            object Preview = System.Reflection.Missing.Value;
            object ActivePrinter = "Bullzip PDF Printer";
            object PrintToFile = true;
            object Collate = true;
            object PrToFileName = psFileName;
            object SaveChanges = false;

            // string pageNum = null;

            Excel.Application excel = null;
            Excel.Workbook xls = null;
            try
            {
                excel = new Excel.Application();
                xls = excel.Workbooks.Open(sourceFile, UpdateLinks, ReadOnly, Format, Password,
                              WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable,
                              Notify, Converter, AddToMru, Local, CorruptLoad);

                //MessageBox.Show("count: " + xls.Worksheets.Count.ToString());
                // pageNum = xls.Application.ExecuteExcel4Macro("Get.Document(50)").ToString();
                // Response.Write("The   number   of   pages   in   xls   is   {0} " + pageNum);

                //MessageBox.Show("VPageBreaks count: " + xls.Worksheets.VPageBreaks.get_Item(1).);
                //xls.Worksheets.HPageBreaks.Add(Excel.Range);
                // MessageBox.Show("HPageBreaks count: " + xls.Worksheets.HPageBreaks.Count.ToString());
                // xls.Worksheets.VPageBreaks.Add(Excel.Range);
                // MessageBox.Show("VPageBreaks count: " + xls.Worksheets.VPageBreaks.Count.ToString());

                xls.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName);

                int t = 5;
                while (!File.Exists(psFileName) && t > 0)
                {
                    System.Threading.Thread.Sleep(100);
                    t--;
                }

                int i = 3;
                long currentLength = 0;
                string length = null;
                while (i > 0)
                {
                    currentLength = new FileInfo(psFileName).Length;
                    if (currentLength == 0)
                        continue;
                    if (length == currentLength.ToString())
                    {
                        i--;
                    }
                    else
                    {
                        length = currentLength.ToString();
                    }
                    System.Threading.Thread.Sleep(200);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                if (xls != null)
                {
                    xls.Close(SaveChanges, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
                    xls = null;
                }
                if (excel != null)
                {
                    excel.Quit();
                    excel = null;
                }
            }

            try
            {
                if (File.Exists(psFileName))
                {
                    ConvertPs2Pdf(psFileName);
                }

                System.Threading.Thread.Sleep(1000);
                if (File.Exists(psFileName))
                {
                    while (IsFileInUse(psFileName))
                    {
                        System.Threading.Thread.Sleep(100);
                    }

                    File.Delete(psFileName);
                }
                if (File.Exists(pdfFileName))
                {
                    while (IsFileInUse(pdfFileName))
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                    File.Move(pdfFileName, resultPdfFileName);
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                 if (!File.Exists(resultPdfFileName))
                {
                    int n = 20;

                    while (!File.Exists(pdfFileName) && n > 0)
                    {
                        System.Threading.Thread.Sleep(100);
                        n--;
                    }
                    if (File.Exists(pdfFileName))
                    {
                        while (IsFileInUse(pdfFileName))
                        {
                            System.Threading.Thread.Sleep(100);
                        }
                        File.Delete(pdfFileName);
                    }
                }

            }

            return resultPdfFileName;

        }


        private string ConvertDoc2Pdf(string sourceFile)
        {
            if (!File.Exists(sourceFile))
                throw new Exception(string.Format("File not found:{0}", sourceFile));

            string strDir = Path.GetDirectoryName(sourceFile);
            string currentTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string psFileName = string.Format("{0}//{1}.ps", strDir, currentTime);
            string pdfFileName = string.Format("{0}//{1}.pdf", strDir, currentTime);
            string FileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceFile);
            string resultPdfFileName = string.Format("{0}//{1}.pdf", strDir, FileNameWithoutExtension);

            object objPsFile = (object)psFileName;
            object background = false;
            object PageType = Word.WdPrintOutPages.wdPrintAllPages;
            object printToFile = true;
            object collate = true;
            object append = false;
            object copies = false;
            object range = Word.WdPrintOutRange.wdPrintAllDocument;
            object missing = System.Reflection.Missing.Value;

            Word._Application word = null;
            object fileName = sourceFile;
            object SaveChanges = false;
            Word.Document doc = null;
            //int pageNum = 0;

            try
            {
                // 打开Word文档
                word = new Word.Application();
                doc = word.Documents.Open(ref fileName,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing);

                string oldPrinter = doc.Application.ActivePrinter;
                doc.Application.ActivePrinter = "Bullzip PDF Printer";

                //Word.WdStatistic stat = Word.WdStatistic.wdStatisticPages;
                // pageNum = doc.ComputeStatistics(stat, ref   missing);
                // Response.Write("The   number   of   pages   in   doc   is   {0} " + pageNum.ToString());

                // Word文档打印到Ps文件
                doc.PrintOut(ref background, ref append, ref range, ref objPsFile, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref PageType, ref printToFile, ref collate, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing);

                doc.Application.ActivePrinter = oldPrinter;

                int t = 5;
                while (!File.Exists(psFileName) && t > 0)
                {
                    System.Threading.Thread.Sleep(100);
                    t--;
                }

                int i = 3;
                long currentLength = 0;
                string length = null;
                while (i > 0)
                {
                    currentLength = new FileInfo(psFileName).Length;
                    if (currentLength == 0)
                        continue;
                    if (length == currentLength.ToString())
                    {
                        i--;
                    }
                    else
                    {
                        length = currentLength.ToString();
                    }
                    System.Threading.Thread.Sleep(200);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                if (doc != null)
                {
                    doc.Close(ref SaveChanges, ref missing, ref missing);
                    doc = null;
                }
                if (word != null)
                {
                    word.Quit(ref SaveChanges, ref missing, ref missing);
                    word = null;
                }
            }
            try
            {
                if (File.Exists(psFileName))
                {
                    ConvertPs2Pdf(psFileName);
                }

                System.Threading.Thread.Sleep(1000);
                if (File.Exists(psFileName))
                {
                    while (IsFileInUse(psFileName))
                    {
                        System.Threading.Thread.Sleep(100);
                    }

                    File.Delete(psFileName);
                }
                if (File.Exists(pdfFileName))
                {
                    while (IsFileInUse(pdfFileName))
                    {
                        System.Threading.Thread.Sleep(200);
                    }
                    File.Move(pdfFileName, resultPdfFileName);
                }

            }
            catch (Exception ex)
            {

            }
            finally
            {
                /*if (File.Exists(psFileName))
                {
                    int t = 10;
                    while (IsFileInUse(psFileName) && t > 0)
                    {
                        System.Threading.Thread.Sleep(100);
                        t--;
                    }
                    File.Delete(psFileName);
                }*/
                if (!File.Exists(resultPdfFileName))
                {
                    int n = 20;

                    while(!File.Exists(pdfFileName) && n > 0)
                    {
                        System.Threading.Thread.Sleep(100);
                        n--;
                    }
                    if (File.Exists(pdfFileName))
                    {
                        while (IsFileInUse(pdfFileName))
                        {
                            System.Threading.Thread.Sleep(100);
                        }
                        File.Delete(pdfFileName);
                    }
                }
            }

            return resultPdfFileName;
               
       }

 

        // Ps转PDF
        public void ConvertPs2Pdf(string psFile)
        {
            Process objProcess = new Process();
            objProcess.StartInfo.CreateNoWindow = true;
            objProcess.StartInfo.UseShellExecute = true;
            objProcess.StartInfo.FileName = "ps2pdf14";
            objProcess.StartInfo.Arguments = psFile;
            objProcess.Start();
           // objProcess.WaitForExit();
        }

 

        // tiff转PDF
        public string ConvertTif2Pdf(string sourceFile)
        {
            string strDir = Path.GetDirectoryName(sourceFile);
            string FileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceFile);
            string currentTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string SourceFileNameToChange = string.Format("{0}//{1}.tif", strDir, currentTime);
            string pdfFileName = string.Format("{0}//{1}.pdf", strDir, currentTime);
            if (File.Exists(sourceFile))
            {
                File.Move(sourceFile, SourceFileNameToChange);
            }
            string resultPdfFileName = string.Format("{0}//{1}.pdf", strDir, FileNameWithoutExtension);
            Process objProcess = new Process();
            objProcess.StartInfo.CreateNoWindow = true;
            objProcess.StartInfo.UseShellExecute = true;
            objProcess.StartInfo.FileName = "/"C://Program Files//ImageMagick-6.5.7-Q16//convert/"";  //需要先安裝ImageMagick

            objProcess.StartInfo.Arguments =  Path.GetFileName(SourceFileNameToChange) + " " + Path.GetFileName(pdfFileName);
            objProcess.StartInfo.WorkingDirectory = strDir;
            objProcess.Start();
            objProcess.WaitForExit();
            if (File.Exists(pdfFileName))
            {
                File.Move(pdfFileName, resultPdfFileName);
            }
            if (File.Exists(SourceFileNameToChange))
            {
                File.Move(SourceFileNameToChange, sourceFile);
            }
            return resultPdfFileName;
        }

        public bool IsFileInUse(string fileName)
        {
            bool inUse = true;
            if (File.Exists(fileName))
            {
                FileStream fs = null;
                try
                {
                    fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
                    inUse = false;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message.ToString());
                }
                finally
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
                return inUse;           //true表示正在使用,false没有使用
            }
            else
            {
                return false;           //文件不存在则一定没有被使用
            }
        }
        #endregion