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

參考網址: 

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

發佈了25 篇原創文章 · 獲贊 7 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章