这个是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

转载于:https://www.cnblogs.com/cwfsoft/archive/2010/05/05/1728152.html

(转)百度文库浏览器分析及实现(续)相关推荐

  1. VSD2PDF源代码,帮做你做好类似百度文库的在线文档浏览器

    VSD文档转换成PDF并不是很难的事情,但在很多地方教你制作百度文库这样类似在线文档浏览器的时候,并没有告诉你怎么将VSD文档转换成SWF文档,其实VSD文档并不能直接转换成SWF文档,不管是java ...

  2. 【自嗨笔记#4】几乎大多数人都会需要的功能!学会它生产力提高200% !百度文库付费文章网页分析

    [自嗨笔记#4]几乎大多数人都会需要的功能!学会它生产力提高200% !百度文库付费文章网页分析 前几天在写报告的时候,需要引用些BD文库里的文章,但不是会员是不可以下载的.因此,萌生了研究研究它的网 ...

  3. 百度文库和豆丁文库的外链推广技巧差异性分析【唯有网络】

    内链外链一直是老生常谈的话题了,虽如此但是还是一个特别需要重视的核心问题.今天就再来说一下外链.这段时间一直在尝试利用百度文库和豆丁文库推广,初次尝试在没有前辈指导的情况下遇到的不少问题,今天就这些问 ...

  4. selenium python文档_selenium+python实现百度文库word文档抓取

    更新这个代码最近又改了一点,另外和其他一些小程序一起放在了一个jupyter notebook里,现在挂在github上面.github现在对jupyter notebook的支持非常的好,甚至可以直 ...

  5. 使用python中的Selenium爬取百度文库word文章

    参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...

  6. Python网络爬虫(七):百度文库文章爬取器

    在用前面的方法爬取百度文库的文章时,发现只能爬取已显示出来的几页文章,而对于没有显示的页数则无法获得其内容.如果要完整的看到整篇文章,需要手动地点击底下的"继续阅读",使所有的页数 ...

  7. 不用下载券也能下载百度文库资料,Python帮你轻松搞定

    阅读文本大概需要5分钟. 大家可能平时都有在百度文库下载文档的经历,费尽心思好不容易在文库找了一份可以用的资料,一看需要用下载券下载,搞的人很烦. 有的人为了节省时间,就任性办理了个文库VIP,再也不 ...

  8. 利用Python进行百度文库内容爬取(二)——自动点击预览全文并爬取

    本文是衔接上一篇:<利用Python进行百度文库内容爬取(一)>. 上回说到我们在对百度文库进行爬虫时,需要模拟手机端来进行登录,这样固然可以对文章进行爬取,但是很多时候并不是非常智能的翻 ...

  9. python 百度文库 签到_Python百度文库爬虫终极版

    百度文库爬虫 我们在开始爬虫之前,首先要了解网页的信息和结构,然后获取请求的url和参数(payloads)来得到所要的数据并处理.接下来我们根据: 一.网页分析 二.爬虫编写 三.运行与结果 四.程 ...

最新文章

  1. shell学习笔记 (2)
  2. JSP简单练习-上传文件
  3. 大牛推荐的30本经典编程书籍,从Python到前端全系列。
  4. 监听浏览器的返回事件,禁止浏览器返回
  5. pytest测试框架(三)---使用allure描述测试用例
  6. Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
  7. 使用sharepoint自带的文本编辑器2
  8. 存储过程中ORA-01031: insufficient privileges的解决方法
  9. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。...
  10. ubuntu 18.04忘记登录密码的破解方法
  11. IO负载高的来源定位
  12. linux htdocs目录下,ubuntu解决htdocs目录的权限问题
  13. 楼下邻居是事逼怎么办
  14. 增强现实技术(AR)的103个应用场景汇总
  15. 从阿里云迁移域名至 Amazon Route 53 帮你了解域名迁移
  16. 闪马智能+兑观科技|视频智能解析联合实验室揭牌成立
  17. C盘满了,要怎么清理才不会误删?
  18. ERROR 1366 (HY000): Incorrect string value: '\xE5\xB8\x82' for column 'address' at row 1
  19. 国人函数概念,稀里糊涂,误人子弟
  20. 银行外包Java开发的一些感想2023.2.5

热门文章

  1. TCP中的RTT和RTO
  2. Linux永久挂载新的硬盘
  3. Leetcode题库 172.阶乘后的零(C实现)
  4. C语言 *、 的含义
  5. nodejs mysql备份_node.js实现备份mysql数据库功能
  6. Python---modules(模块)
  7. org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file
  8. 排序算法以及其java实现
  9. kubernetes1.30集群部署+dashboard+heapster
  10. .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)...