近期項目上遇到一個需求是用戶上傳的文檔進行在線瀏覽,之前有過一篇使用 OpenOffice 將 word 轉換成 html 頁面進行展示的。現在介紹一個新的工具那就是 Print2Flash 。
Print2Flash是一個虛擬打印機類的文檔轉換軟件,因此只要是可打印的文檔,都可以輕松轉換為Flash文件,即SWF動畫,特別是用於轉換PDF、Word、Excel、PowerPoint等文檔為SWF格式。
Print2Flash 與 Macromedia 的 FlashPaper 是同類型軟件,但是SWF轉換功能要增強了很多,如轉換PDF為SWF格式時,支持超鏈接的轉換。
Print2Flash 提供了4個可定制的SWF播放器主題,並且支持簡體中文界面的播放器;轉換過程中可設置使用的Flash Player版本,以獲得最佳的兼容性,另外還可以添加水印、頁面縮略圖、文檔權限(如禁止打印、禁止復制文本)等。
使用說明:
由於一直沒有搞定虛擬打印機的安裝與卸載,所以暫不提供綠色版,直接使用安裝版吧,當前版本Print2Flash 3.1,安裝完會有一個Print2Flash 3 Printer的虛擬打印機。不過Print2Flash在轉換PPT為SWF文件時,是不如 iSpring Free、iSpring Presenter 或 PPT2Flash 強大的,畢竟后幾個是專為PowerPoint 轉換Flash開發的,但是Print2Flash的轉換速度極快。
PDF 轉換 SWF 還可以嘗試下PDFZilla,如果想將SWF反過來轉換成其他視頻格式,則推薦使用 Free SWF Converter 以及 iWisoft Flash SWF to Video Converter。
Office文檔(word,excel,ppt)在線預覽查看,有很多種方式:
1、調用 WebOffice 組件,進行 word 預覽,要求客戶端安裝word,僅適用IE, word2013, IE11會提示word停止響應;
2、使用 OpenOffice 將 Word 轉為 html 文檔;
3、使用 FlexPaper,感覺不是很美觀,不過還是可以用;
4、使用 FlashPaper,這個是很早期的產品,樣式不會丟失,不過只支持32位操作系統,也沒更新了,不支持64位;
5、使用 Print2Flash,效果跟 FlashPaper 差不多,它的展示效果很棒,支持文字搜索,全屏閱讀,關鍵是樣式不會有任何丟失。
下面主要介紹這個,先上個圖。
詳細操作步驟
1、下載 Print2Flash,我這是下載的是64位的,官方http://print2flash.com/download.php 有最新的版本,自己測試最好搜個破解版,因為官方版本不購買的情況下在生成的 swf 文件的底部會有版權說明,下好了直接安裝,安裝建議直接安裝在根目錄,便於后期目錄調用,比如 C:\Print2Flash3;安裝好了之后目錄如下:
2、實現過程,官方的實現方式是需要注冊服務,在程序里引用Interop.Print2Flash3.dll,並調用如下代碼進行轉換。
String fs_filename = Server.MapPath("UploadedFiles/") + FileUpload1.FileName; String fs_convertedfilename = Server.MapPath("ConvertedFiles/") + FileUpload1.FileName + ".swf"; Print2Flash3.Server2 p2fServer = new Print2Flash3.Server2(); p2fServer.ConvertFile(fs_filename, fs_convertedfilename, null, null, null);我這里使用的另外的方式,用java調用命令行工具執行轉換命令生成swf,關鍵代碼如下:
String converter = printFlashInstallPath+" "+ docTempFile.getAbsolutePath() + " "+ swfTempFile.getAbsolutePath(); Runtime pro = Runtime.getRuntime(); pro.exec(converter);printFlashInstallPath = C\:\\Print2Flash3\\p2fServer.exe
這里是我的配置文件的內容。
上面的 converter 是命令行內容,傳進來兩個參數,第一個是 office 文件路徑,第二個是生成 swf 文件的路徑,中間加空格。
*************************************************************************************************************************************************
其實這個方法是萬金油,支持所有可以用命令行的調用的應用。非常實用,官方的實現方式直接忽略。
如果發現調用命令行的時候只是彈出了CMD窗口,但是沒有執行命令,檢查一下兩個文件的路徑是不是復雜或過長,特別是生成 swf 的路徑,修改下路徑重新測試,項目中遇到過因路徑問題無法轉換的問題,這時使用一個臨時目錄在 C:\temp 下,生成后將文件copy到自己需要的目錄就OK了。
如果遇到有丟失.dll 的情況不能調用的,需要自己去下載對應的 dll,這個是根據操作系統來的,看人品了,我在部署有些機器的碰到過。
*************************************************************************************************************************************************
好的,轉換說完了。
展示篇
這個其實就是做一個 swf 的展示頁面,在頁面上添加相關的JS,達到展示效果,方法千千萬,沒有什么需要詳細介紹。
<!DOCTYPE HTML> <html> <head> <title></title> #parse('/common/meta.jsp') #parse('/common/core.htm') <link type="text/css" rel="stylesheet" href="${ctx}/js/lib/works/css/picstyle.css"> <style> #content { width: 1000px; margin: 24px auto 0; } </style> <script type="text/javascript" language="JavaScript1.1"> var requiredMajorVersion = 9; var requiredMinorVersion = 0; var requiredRevision = 28; var appVersion=navigator.appVersion.toLowerCase() var isIE = (appVersion.indexOf("msie") != -1) ? true : false; var isWin = (appVersion.indexOf("win") != -1) ? true : false; var isMac = /mac/.test(appVersion); var isSafari = /webkit/.test(appVersion); var isOpera = /opera/.test(appVersion); var safariVersion = (appVersion.match(/version\/((?:\d|\.)+)/) || [])[1] function JSGetSwfVer(i){ if (navigator.plugins != null && navigator.plugins.length > 0) { if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) { var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : ""; var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description; descArray = flashDescription.split(" "); tempArrayMajor = descArray[2].split("."); versionMajor = tempArrayMajor[0]; versionMinor = tempArrayMajor[1]; if ( descArray[3] != "" ) tempArrayMinor = descArray[3].split("r"); else tempArrayMinor = descArray[4].split("r"); versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0; flashVer = versionMajor + "." + versionMinor + "." + versionRevision; } else flashVer = -1; } else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4; else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3; else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2; else flashVer = -1; return flashVer; } function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision) { reqVer = parseFloat(reqMajorVer + "." + reqRevision); for (i=25;i>0;i--) { versionStr = JSGetSwfVer(i); if (versionStr == -1) return false; else if (versionStr != 0) { versionArray = versionStr.split("."); versionMajor = versionArray[0]; versionMinor = versionArray[1]; versionRevision = versionArray[2]; versionString = versionMajor + "." + versionRevision; versionNum = parseFloat(versionString); if (versionMajor > reqMajorVer && versionNum >= reqVer) return true; else return ((versionNum >= reqVer && versionMinor >= reqMinorVer) ? true : false ); } } return (reqVer ? false : 0.0); } function GetDoc(movieName) { var isIE = navigator.appName.indexOf("Microsoft") != -1; return (isIE) ? window[movieName] : document[movieName]; } var P2FDocs=new Array() function AddP2FDoc(P2FDoc) { P2FDocs.push(P2FDoc); } var oldonmousewheel=document.onmousewheel function mousewheel(event) { for (var i=0;i<P2FDocs.length;i++) { if(event.target==P2FDocs[i]) { var delta = 0; if (event.wheelDelta) delta = event.wheelDelta / (isOpera ? 12 : 120); else if (event.detail) delta = -event.detail; if (event.preventDefault) event.preventDefault(); try { P2FDocs[i].scrollLine(delta); } catch(e) { } return true; } } return oldonmousewheel(event) } if(isMac || isWin && isSafari && safariVersion<"4.0") { if (typeof window.addEventListener != "undefined") window.addEventListener("DOMMouseScroll", mousewheel, false); window.onmousewheel = document.onmousewheel = mousewheel; } </script> </head> <body class="innerBody"> <div id="content"> <script language="JavaScript" type="text/javascript"> var width = "100%" var height = "600px" var align = "Middle" var name = "Print2FlashDoc" var url = "${filePath}" var flashvars = "" var alternateContent = 'This content requires the Adobe Flash Player. It either has not been installed yet or is prohibited by your browser security settings. Either' + ' <a href="http://www.macromedia.com/go/getflash/">click here to get Flash</a> or loosen your browser security restrictions'; if (isIE && isWin) alternateContent += ' and then <a href="javascript:document.location.reload()">Refresh</a> this page' alternateContent += '.' if (isIE && isWin) { var oeTags = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' + 'width="' + width + '" height="' + height + '" align="' + align + '" id="' + name + '"' + 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + requiredMajorVersion + ',' + requiredMinorVersion + ',' + requiredRevision + ',0">' + '<param name="movie" value="' + url + '" /><param name="quality" value="best" />' + '<param name="allowFullScreen" value="true" />' + '<param name="allowFullScreenInteractive" value="true" />' + '<param name="allowScriptAccess" value="sameDomain" />' + '<param name="FlashVars" value="extName=' + name + flashvars + '" />' + alternateContent + '<\/object>'; document.write(oeTags); AddP2FDoc(GetDoc(name)); } else if (DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision)) { var oeTags = '<embed src="' + url + '" quality="best" ' + 'width="' + width + '" height="' + height + '" align="' + align + '" name="' + name + '" ' + 'play="true" ' + 'loop="false" ' + 'quality="best" ' + 'allowScriptAccess="sameDomain" allowFullScreen="true" allowFullScreenInteractive="true"' + 'type="application/x-shockwave-flash" ' + 'pluginspage="http://www.macromedia.com/go/getflashplayer" ' + 'FlashVars="extName=' + name + flashvars + '"> ' + '<\/embed>' document.write(oeTags); AddP2FDoc(GetDoc(name)); } else document.write(alternateContent); </script> <noscript> This content requires scripts to be enabled in your browser. Please enable scripts in your browser settings. </noscript> </div> </body> </html> <script type="text/javascript"> #parse('/js/module/worksmonitor/worksmonitor-show.js'); </script>頁面上可能有些廢代碼,不過不影響使用。
頁面里的 Script 里面的 url 需要替換成你生成的 SWF 文件,可以配上相對路徑或者是輸出流,我這里配置的是一個方法調用,返回輸出流。
var url = "/worksmonitor/worksmonitor!showswf.action?workid=354&fileid=364&path="
下面是后端實現代碼:
String workid = Struts2Utils.getRequest().getParameter("workid"); String fileid = Struts2Utils.getRequest().getParameter("fileid"); String filePath = Config.getConfig("swf_path") + File.separator + workid + "_" + fileid + ".swf"; if (null != filePath) { HttpServletResponse response = Struts2Utils.getResponse(); File f = new File(filePath); if (f.exists()) { FileInputStream is = new FileInputStream(filePath); int i = is.available(); // 得到文件大小 byte data[] = new byte[i]; is.read(data); // 讀數據 is.close(); response.setContentType("image/*"); // 設置返回的文件類型 OutputStream out = response.getOutputStream(); // 得到向客戶端輸出二進制數據的對象 out.write(data); // 輸出數據 out.close(); } }
如果有任何疑問,或者更簡便的方法請留言,共商大技。


