使用FlexPaper實現office文件的預覽(C#版)


需求很簡單,用戶上傳office文件(word、excel、ppt)后,可以預覽上傳的這些文件。搜索的相關的資料后。整理如下:

Step1.用戶上傳office文件。

Step2.把Office文件轉化為pdf文件

Step3.把pdf文件轉化為swf文件

Step4.使用flexpaper插件預覽swf文件

 

根據這四步,我們逐步分析:

Step1.上傳文件,在此不做贅述。

Step2.把Office文件轉化為pdf文件。

    必須保證你的office版本在2007之上。我第一次使用office2003,不報錯,但是也沒用生成相關的pdf文件。果斷使用了最新的office2013即可完美運行。

    在次貼出將word轉化為pdf文件的代碼,完整實例,請看附件。

   

        /// <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.SaveAs();
                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;
        }
View Code

    (考慮到有些和我一樣的新手,在此贅述幾句吧:如果你使用vs2010開發,在添加office引用的時候,直接選擇.net欄目下的office、Microsoft.Office.Interop.Word,Microsoft.Office.Interop.PowerPoint和Microsoft.Office.Interop.Excel,並且保證office的版本高於后三者就行啦。不用再在com欄目下引入相關office的com組件)

Step3.把pdf文件轉化為swf文件。

    首先,我們可以下載swftools,完成安裝后會在安裝目錄下面有多個小工具。選擇pdf2swf.exe 拷貝到我們的項目相關目錄下面,使用如下代碼,便可完成調用。

        /// <summary>
        /// 把PDF文件轉化為SWF文件
        /// </summary>
        /// <param name="toolPah">pdf2swf工具路徑</param>
        /// <param name="sourcePath">源文件路徑</param>
        /// <param name="targetPath">目標文件路徑</param>
        /// <returns>true=轉化成功</returns>
        public static bool PDFToSWF(string toolPah, string sourcePath, string targetPath)
        {
            Process pc = new Process();
            bool returnValue = true;

            string cmd = toolPah;
            string args = " -t " + sourcePath + " -s flashversion=9 -o " + targetPath;
            try
            {
                ProcessStartInfo psi = new ProcessStartInfo(cmd, args);
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                pc.StartInfo = psi;
                pc.Start();
                pc.WaitForExit();
            }
            catch (Exception ex)
            {
                returnValue = false;
                throw new Exception(ex.Message);
            }
            finally
            {
                pc.Close();
                pc.Dispose();
            }
            return returnValue;
        }
View Code

     此處也有兩處要重點提醒。首先呢,就是所有的文件路徑都不能有空格,這是因為pdf2swf對含有空格的文件路徑不支持。其次,就是flashversion=9這個關鍵的命名也要加上,否則會出現在flexpaper無法預覽該swf文檔的情況。

Step4.使用flexpaper插件預覽swf文件

    剛開始我們可以下載一個官方的用例,選擇-》download web server package。然后直接打開index.html發現不能預覽docs中的Paper.pdf.swf這個swf文件。於是乎網上出現了n多關於通過通過將adobe flash player將flexpaper添加信任啥的,這個哥試了,但是發現不行!有種被坑的感覺!最后我的解決方案是:直接將這個官網的例子放在IIS服務下面就行了。或者你通過vs2010建立項目的時候把這個插件添加進去(就是把官網的那些代碼粘過去,我這樣說你明白吧,但是注意一下路徑問題)也是可以的。

    有些童鞋該說了,我想把swf文件動態加載,也就是FlexPaperViewer中的SwfFile動態加載。so easy。

    比如一個http://localhost:12345/mypage.aspx?swf=123.swf這樣的請求,

    我們在CS端通過request.QueryString["swf"]獲取123.swf文件之后可以將其值賦給mypage.aspx頁面的HiddenField1,然后在

    mypage.aspx中使用

SwfFile: escape($("#HiddenField1").val()),

    即可動態獲取swf文件。

    最后貼出最終的顯示結果圖:

   

圖1.初始頁面

 

圖2.選擇office文件

 

 


圖3.上傳后預覽

================================正常人類分割線=================================

  【客戶需求】做完了之后,我閑着蛋疼想着如果用戶要上傳圖片格式的文件,我們要預覽圖片的話呢?

很簡單,用jQuery圖片的相關插件就能美好的實現了。

    當然用swftools也能將圖片轉化為swf,和這個頁面集成到一起去。

    swftools中支持jpg、jpeg、gif和png,不支持bmp文件格式。

為了能讓轉化成的swf能在flexpaper中能夠正確的顯示,這幾種圖片的swftool命令也不一樣,直接貼代碼了哈

/// <summary>
        /// png、jpg和jpeg文件的轉化
        /// </summary>
        /// <param name="toolPah"></param>
        /// <param name="sourcePath"></param>
        /// <param name="targetPath"></param>
        /// <returns></returns>
        public static bool PicturesToSwf(string toolPah, string sourcePath, string targetPath)
        {
            Process pc = new Process();
            bool returnValue = true;

            string cmd = toolPah;
            string args = " " + sourcePath + " -o " + targetPath+" -T 9";
            //如果是多個圖片轉化為swf 格式為 ..jpeg2swf.exe C:\1.jpg C:\2.jpg -o C:\swf1.swf
            try
            {
                ProcessStartInfo psi = new ProcessStartInfo(cmd, args);
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                pc.StartInfo = psi;
                pc.Start();
                pc.WaitForExit();
            }
            catch (Exception ex)
            {
                returnValue = false;
                throw new Exception(ex.Message);
            }
            finally
            {
                pc.Close();
                pc.Dispose();
            }
            return returnValue;
        }
        /// <summary>
        /// Gif文件轉化為swf
        /// </summary>
        /// <param name="toolPah"></param>
        /// <param name="sourcePath"></param>
        /// <param name="targetPath"></param>
        /// <returns></returns>
        public static bool GifPicturesToSwf(string toolPah, string sourcePath, string targetPath)
        {
            Process pc = new Process();
            bool returnValue = true;

            string cmd = toolPah;
            string args = " " + sourcePath + " -o " + targetPath;
            try
            {
                ProcessStartInfo psi = new ProcessStartInfo(cmd, args);
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                pc.StartInfo = psi;
                pc.Start();
                pc.WaitForExit();
            }
            catch (Exception ex)
            {
                returnValue = false;
                throw new Exception(ex.Message);
            }
            finally
            {
                pc.Close();
                pc.Dispose();
            }
            return returnValue;
        }
View Code

    這幾個命令雖然網上有,但是很多都是有問題的,有的在flexpaper當中不能用。本人的這個是親測可用的,歡迎拍磚!

 

PostScript:

   最后附上本人的項目附件,第一次這么仔細的寫博客,大家多多關照。 

   附件下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM