在線預覽-Java 使用 Print2Flash 實現Office文檔在線閱讀


       近期項目上遇到一個需求是用戶上傳的文檔進行在線瀏覽,之前有過一篇使用 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 FreeiSpring 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 差不多,它的展示效果很棒,支持文字搜索,全屏閱讀,關鍵是樣式不會有任何丟失。

     下面主要介紹這個,先上個圖。

image

 

詳細操作步驟


1、下載 Print2Flash,我這是下載的是64位的,官方http://print2flash.com/download.php 有最新的版本,自己測試最好搜個破解版,因為官方版本不購買的情況下在生成的 swf 文件的底部會有版權說明,下好了直接安裝,安裝建議直接安裝在根目錄,便於后期目錄調用,比如 C:\Print2Flash3;安裝好了之后目錄如下:

image

 

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();
            }
        }

 

如果有任何疑問,或者更簡便的方法請留言,共商大技。


免責聲明!

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



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