zoukankan      html  css  js  c++  java
  • (转)百度文库浏览器分析及实现(续)

    这个是DotNet动态模拟的实现页面:http://download.csdn.net/source/2153964

    文库系统已经开发完成了,包括上传,动态转换,以及符合百度文库的资源文件的生成,打分,统计,收藏等功能

    (由于项目的关系不能公开项目代码,当前示例,仅包含显示,不包含数据库,上传,动态转换,资源文件生成等内容)

    这里就简单的介绍一下整个流程及原理。

    首先,反编译 百度文库Flash浏览器用的软件是Sothink SWF Decompiler,不过你会发现反编译的代码还是有很多错误的;当然您可以逐步将代码进行修改,以达到使用的需要(这里我仅仅是使用这个Flash本身,采用反编译器仅为分析文库资源文件格式)。

    其次,需要通过Flash的代码分析百度文库动态装载的资源文件的文件格式 ,在文件DocViewer.as中事件响应函数binaryLoadComplete中,仔细读这一段您就可以分析清楚百度文库的资源文件格式了,这里我就不完整的叙述了。

    view plaincopy to clipboardprint?
    private function binaryLoadComplete(event:Event = null) : void 
    {  
        var _loc_11:ByteArray = null;  
        var _loc_12:int = 0;  
        trace("binaryLoadComplete...");  
        if (this._noDoc)  
        {  
            if (this._noDoc.parent)  
            {  
                this._noDoc.parent.removeChild(this._noDoc);  
            }  
            this._noDoc = null;  
        }  
        this._loadPercent = 0;  
        var _loc_2:* = URLLoader(event.target);  
        var _loc_3:* = _loc_2.data;  
        this._byteArray = [];  
        var _loc_4:Array = [];  
        var _loc_5:int = 0;  
        var _loc_6:* = _loc_3.length;  
        while (_loc_5 < _loc_6)  
        {  
            if (_loc_5 + 3 < _loc_6)  
            {  
                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))  
                {  
                    _loc_4.push(_loc_5);  
                }  
            }  
            else 
            {  
                _loc_4.push(_loc_6);  
                break;  
            }  
            _loc_5++;  
        }  
        var _loc_7:* = _loc_3.readMultiByte(_loc_4[0], "utf-8");  
        trace(_loc_7);  
        var _loc_8:* = JSON.decode(_loc_7);  
        this._pagesAll = Number(_loc_8["totalPage"]);  
        if (!this._pagesLoaded)  
        {  
            this._pagesLoaded = 0;  
        }  
        this._pagesLoaded = this._pagesLoaded + (Number(_loc_8["toPage"]) - Number(_loc_8["fromPage"]) + 1);  
        this._fromPage = Number(_loc_8["fromPage"]);  
        this._toPage = Number(_loc_8["toPage"]);  
        trace("pagesall:" + this._pagesAll + " , frompage:" + this._fromPage + " , topage:" + this._toPage);  
        this._pagethLoading = Number(_loc_8["fromPage"]) - 1;  
        var _loc_9:int = 0;  
        var _loc_10:* = _loc_4.length - 1;  
        while (_loc_9 < _loc_10)  
        {  
            _loc_11 = new ByteArray();  
            _loc_12 = _loc_4[(_loc_9 + 1)] - _loc_4[_loc_9];  
            _loc_3.readBytes(_loc_11, 0, _loc_12);  
            this._byteArray.push(_loc_11);  
            _loc_9++;  
        }  
        trace("...............这一次加载了多少页:" + this._byteArray.length);  
        this._hasConvertPages = 0;  
        this._allConvertPages = Math.min(this._byteArray.length, this._toPage - this._fromPage + 1);  
        if (this._allConvertPages > 0)  
        {  
            this.byteArr2DisplayObj(this._hasConvertPages);  
        }  
        else 
        {  
            trace("blank document ...");  
            this.processNoDoc();  
            this._loadPercent = 0;  
            dispatchEvent(new Event("STOP_LOADING", true));  
            this._inLoading = false;  
        }  
        return;  
    }// end function 
            private function binaryLoadComplete(event:Event = null) : void
            {
                var _loc_11:ByteArray = null;
                var _loc_12:int = 0;
                trace("binaryLoadComplete...");
                if (this._noDoc)
                {
                    if (this._noDoc.parent)
                    {
                        this._noDoc.parent.removeChild(this._noDoc);
                    }
                    this._noDoc = null;
                }
                this._loadPercent = 0;
                var _loc_2:* = URLLoader(event.target);
                var _loc_3:* = _loc_2.data;
                this._byteArray = [];
                var _loc_4:Array = [];
                var _loc_5:int = 0;
                var _loc_6:* = _loc_3.length;
                while (_loc_5 < _loc_6)
                {
                    if (_loc_5 + 3 < _loc_6)
                    {
                        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))
                        {
                            _loc_4.push(_loc_5);
                        }
                    }
                    else
                    {
                        _loc_4.push(_loc_6);
                        break;
                    }
                    _loc_5++;
                }
                var _loc_7:* = _loc_3.readMultiByte(_loc_4[0], "utf-8");
                trace(_loc_7);
                var _loc_8:* = JSON.decode(_loc_7);
                this._pagesAll = Number(_loc_8["totalPage"]);
                if (!this._pagesLoaded)
                {
                    this._pagesLoaded = 0;
                }
                this._pagesLoaded = this._pagesLoaded + (Number(_loc_8["toPage"]) - Number(_loc_8["fromPage"]) + 1);
                this._fromPage = Number(_loc_8["fromPage"]);
                this._toPage = Number(_loc_8["toPage"]);
                trace("pagesall:" + this._pagesAll + " , frompage:" + this._fromPage + " , topage:" + this._toPage);
                this._pagethLoading = Number(_loc_8["fromPage"]) - 1;
                var _loc_9:int = 0;
                var _loc_10:* = _loc_4.length - 1;
                while (_loc_9 < _loc_10)
                {
                    _loc_11 = new ByteArray();
                    _loc_12 = _loc_4[(_loc_9 + 1)] - _loc_4[_loc_9];
                    _loc_3.readBytes(_loc_11, 0, _loc_12);
                    this._byteArray.push(_loc_11);
                    _loc_9++;
                }
                trace("...............这一次加载了多少页:" + this._byteArray.length);
                this._hasConvertPages = 0;
                this._allConvertPages = Math.min(this._byteArray.length, this._toPage - this._fromPage + 1);
                if (this._allConvertPages > 0)
                {
                    this.byteArr2DisplayObj(this._hasConvertPages);
                }
                else
                {
                    trace("blank document ...");
                    this.processNoDoc();
                    this._loadPercent = 0;
                    dispatchEvent(new Event("STOP_LOADING", true));
                    this._inLoading = false;
                }
                return;
            }// end function

    到目前知道了百度的资源文件格式,也能实现文件的动态显示,接下来就是需要实现文档的上传以及转换等操作

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

    上传到服务器后,首先采用数据库记录上传的文件以及关联用户(或许这里面您需要为文库建立 模型 了)

    接下来需要进行的处理就是将任意文档转换为PDF ,这里面可以使用的有国外免费使用的PDF Convert 虚拟打印机,当然也有付费版本的

    根据系统的情况确定是自动转换为PDF,还是需要人工审核 ,百度采用的是人工审核的方式

    之后需要做的事情就是将PDF转换为FlashPaper ,这里面需要您认真领会上面一段代码,然后将文档组织成为百度文库Flash支持的文档格式,暂时称为SWFX吧,关于这个文件格式的描述,在一段时间后我将公开他

    最后需要做的事情就是将转换的SWFX存储,结合后来装载资源文件的规则进行命名及存储

    所有的核心步骤就是这样的,不过这里面有一个问题就是虚拟打印机的效率还是很低的,PDF转换为FlashPaper的转换效率也是马马虎虎,可以考虑将这两项工作交由windows服务 来实现

    也就是说需要使用C#开发一个windows服务来对审核通过的文档进行两次转换工作。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chinull/archive/2010/04/19/5503397.aspx

  • 相关阅读:
    Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
    Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
    Azure China (7) 使用WebMetrix将Web Site发布至Azure China
    Microsoft Azure News(4) Azure新D系列虚拟机上线
    Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
    Windows Azure Cloud Service (37) 浅谈Cloud Service
    Azure PowerShell (6) 设置单个Virtual Machine Endpoint
    Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机
    功能代码(1)---通过Jquery来处理复选框
    案例1.用Ajax实现用户名的校验
  • 原文地址:https://www.cnblogs.com/cwfsoft/p/1728152.html
Copyright © 2011-2022 走看看