posts - 495,comments - 227,trackbacks - 0

          http://blog.csdn.net/chinull/archive/2010/04/19/5503397.aspx

          這個是DotNet動態模擬的實現頁面:http://download.csdn.net/source/2153964

          文庫系統已經開發完成了,包括上傳,動態轉換,以及符合百度文庫的資源文件的生成,打分,統計,收藏等功能

          (由于項目的關系不能公開項目代碼,當前示例,僅包含顯示,不包含數據庫,上傳,動態轉換,資源文件生成等內容)

          這里就簡單的介紹一下整個流程及原理。

          首先,反編譯 百度文庫Flash瀏覽器用的軟件是Sothink SWF Decompiler,不過你會發現反編譯的代碼還是有很多錯誤的;當然您可以逐步將代碼進行修改,以達到使用的需要(這里我僅僅是使用這個Flash本 身,采用反編譯器僅為分析文庫資源文件格式)。

          其次,需要通過Flash的代碼分析百度文庫動態裝載的資源文件的文件格式 ,在文件DocViewer.as中事件響應函數binaryLoadComplete中,仔細讀這一段您就可以分析清楚百度文庫的資源文件格式了,這里 我就不完整的敘述了。

          copy to clipboardprint?
          1. private function binaryLoadComplete(event:Event = null) : void  
          2. {  
          3.     var _loc_11:ByteArray = null;  
          4.     var _loc_12:int = 0;  
          5.     trace("binaryLoadComplete...");  
          6.     if (this._noDoc)  
          7.     {  
          8.         if (this._noDoc.parent)  
          9.         {  
          10.             this._noDoc.parent.removeChild(this._noDoc);  
          11.         }  
          12.         this._noDoc = null;  
          13.     }  
          14.     this._loadPercent = 0;  
          15.     var _loc_2:* = URLLoader(event.target);  
          16.     var _loc_3:* = _loc_2.data;  
          17.     this._byteArray = [];  
          18.     var _loc_4:Array = [];  
          19.     var _loc_5:int = 0;  
          20.     var _loc_6:* = _loc_3.length;  
          21.     while (_loc_5 < _loc_6)  
          22.     {  
          23.           
          24.         if (_loc_5 + 3 < _loc_6)  
          25.         {  
          26.             if ((_loc_3[_loc_5] == 67 || _loc_3[_loc_5] == 70) && _loc_3[(_loc_5 + 1)] == 87 && _loc_3[_loc_5 + 2] == 83 && (_loc_3[_loc_5 + 3] == 9 || _loc_3[_loc_5 + 3] == 10))  
          27.             {  
          28.                 _loc_4.push(_loc_5);  
          29.             }  
          30.         }  
          31.         else  
          32.         {  
          33.             _loc_4.push(_loc_6);  
          34.             break;  
          35.         }  
          36.         _loc_5++;  
          37.     }  
          38.     var _loc_7:* = _loc_3.readMultiByte(_loc_4[0], "utf-8");  
          39.     trace(_loc_7);  
          40.     var _loc_8:* = JSON.decode(_loc_7);  
          41.     this._pagesAll = Number(_loc_8["totalPage"]);  
          42.     if (!this._pagesLoaded)  
          43.     {  
          44.         this._pagesLoaded = 0;  
          45.     }  
          46.     this._pagesLoaded = this._pagesLoaded + (Number(_loc_8["toPage"]) - Number(_loc_8["fromPage"]) + 1);  
          47.     this._fromPage = Number(_loc_8["fromPage"]);  
          48.     this._toPage = Number(_loc_8["toPage"]);  
          49.     trace("pagesall:" + this._pagesAll + " , frompage:" + this._fromPage + " , topage:" + this._toPage);  
          50.     this._pagethLoading = Number(_loc_8["fromPage"]) - 1;  
          51.     var _loc_9:int = 0;  
          52.     var _loc_10:* = _loc_4.length - 1;  
          53.     while (_loc_9 < _loc_10)  
          54.     {  
          55.           
          56.         _loc_11 = new ByteArray();  
          57.         _loc_12 = _loc_4[(_loc_9 + 1)] - _loc_4[_loc_9];  
          58.         _loc_3.readBytes(_loc_11, 0, _loc_12);  
          59.         this._byteArray.push(_loc_11);  
          60.         _loc_9++;  
          61.     }  
          62.     trace("...............這一次加載了多少 頁:" + this._byteArray.length);  
          63.     this._hasConvertPages = 0;  
          64.     this._allConvertPages = Math.min(this._byteArray.length, this._toPage - this._fromPage + 1);  
          65.     if (this._allConvertPages > 0)  
          66.     {  
          67.         this.byteArr2DisplayObj(this._hasConvertPages);  
          68.     }  
          69.     else  
          70.     {  
          71.         trace("blank document ...");  
          72.         this.processNoDoc();  
          73.         this._loadPercent = 0;  
          74.         dispatchEvent(new Event("STOP_LOADING"true));  
          75.         this._inLoading = false;  
          76.     }  
          77.     return;  
          78. }// end function  


          到目前知道了百度的資源文件格式,也能實現文件的動態顯示,接下來就是需要實現文檔的上傳以及轉換等操作

          上傳 ,可以用百度默認的上傳flash,也可以使用第三方的上傳flash,這里有很多通用的flash上傳控件,只是在dotnet中接收大文件時需要修改 iis的相關配置。

          上傳到服務器后,首先采用數據庫記錄上傳的文件以及關聯用戶(或許這里面您需要為文庫建立 模 型 了)

          接下來需要進行的處理就是將任意文檔轉換為PDF ,這里面可以使用的有國外免費使用的PDF Convert 虛擬打印機,當然也有付費版本的

          根據系統的情況確定是自動轉換為PDF,還是需要人工審核 ,百度采用的是人工審核的方式

          之后需要做的事情就是將PDF轉換為FlashPaper ,這里面需要您認真領會上面一段代碼,然后將文檔組織成為百度文庫Flash支持的文檔格式,暫時稱為SWFX吧,關于這個文件格式的描述,在一段時間后 我將公開他

          最后需要做的事情就是將轉換的SWFX存儲,結合后來裝載資源文件的規則進行命名及存儲

          所有的核心步驟就是這樣的,不過這里面有一個問題就是虛擬打印機的效率還是很低的,PDF轉換為FlashPaper的轉換效率也是馬馬虎虎,可以 考慮將這兩項工作交由windows服務 來實現

          也就是說需要使用C#開發一個windows服務來對審核通過的文檔進行兩次轉換工作。

          posted on 2010-07-05 22:40 SIMONE 閱讀(3392) 評論(4)  編輯  收藏

          FeedBack:
          # re: 百度文庫瀏覽器分析及實現(續)
          2010-07-10 23:30 | xiaoguo
          niu ren  回復  更多評論
            
          # re: 百度文庫瀏覽器分析及實現(續)
          2010-09-09 16:06 | chinull
          請標明【轉】  回復  更多評論
            
          # re: 百度文庫瀏覽器分析及實現(續)
          2012-04-09 13:16 | shenenrui
          迫切想知道百度文庫知道的格式,謝謝。能發我郵箱嗎?
          ser88@163.com  回復  更多評論
            
          # re: 百度文庫瀏覽器分析及實現(續)[未登錄]
          2012-09-07 13:28 | dd
          很不錯  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 溧水县| 温州市| 玛纳斯县| 上蔡县| 洛南县| 郓城县| 营口市| 南召县| 托克逊县| 修水县| 本溪| 卢龙县| 西林县| 牟定县| 仪陇县| 蒙自县| 汕尾市| 墨玉县| 大方县| 奉节县| 仙桃市| 松江区| 维西| 都兰县| 镇宁| 汝南县| 兴城市| 宣威市| 深圳市| 湖州市| 安平县| 西林县| 怀柔区| 思南县| 寿阳县| 平顶山市| 永清县| 无为县| 平舆县| 思南县| 凉山|