需求很簡單,用戶上傳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; }
(考慮到有些和我一樣的新手,在此贅述幾句吧:如果你使用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; }
此處也有兩處要重點提醒。首先呢,就是所有的文件路徑都不能有空格,這是因為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; }
這幾個命令雖然網上有,但是很多都是有問題的,有的在flexpaper當中不能用。本人的這個是親測可用的,歡迎拍磚!
PostScript:
最后附上本人的項目附件,第一次這么仔細的寫博客,大家多多關照。