文档在线预览:总体思路

文档在线预览研究系列
总体思路
文档生成技术细节
利用百度阅读器

  近两年出现了许多以“经验交易”为核心的文档平台,如豆丁网、百度文库、星期八等网站。这些网站将文档(知识)存放在网站(平台)上,供用户浏览、讨论、下载,配以良好的积分体系和金钱激励(运营),完美的协调好知识分享与知识传播之间的微妙关系。这样即有Web2.0的用户互动,也有Web3.0的价值分配,对社会也是非常好的资源重用,是非常棒的一种运营模式。

  从技术层面讲,这类网站的创新主要有文档预览、知识商城和SNS三个块。今年初公司也决定在公司内部引入这种模式,以实现公司内部文档特别是售前方案的分享,很荣幸,我被安排为此项目的开发经理,也专门研究了文档在线预览的技术。如今项目已经上线将近百天,也是时候整理一下思路,这篇博客主要就是分析一些文档在线预览的技术细节,其实网上已经有很多类似的文章,但大多没有说得很清楚,也比较零乱,所以我想整理一个完整的文章来。文章内容将会涉及:总体思路、预览实现细节、缩略图实现、百度阅读器使用等。

  文档预览即文档以flash的形式在网页上展示,所以要解决两个问题:以什么格式展示flash、文档如何转化为符合格式的flash

  展示flash有两种方式,一种是直接生成好一个完整的flash展示出来,一种是用一个播放器来播放另外一个文档flash。第一种方式可以用SWFTools的工具直接将pdf转化成一个整体的flash展示,但这种方式的flash较大,且不容易控制,故用得较少。第二种方式是重点,首先需要了解的是一个开源的flexpaper播放器,它可以播放一帧一页的flash;在flexpaper的基础上,如果遇到大文档则会出现速度和性能的问题,这个时候需要像百度文库、豆丁一样修改flexpaper,让它支持一次仅读取指定页数的flash;如果文档安全级别较高,不允许下载查看,则需要给flexpaper加上加密解密算法;如果需要登录用户才能查看,则要让flexpaper有登录UI

  转化文档为flash的思路有一条,但有多种实现方式。一般文档需要先转化为pdf,再从pdf转化为flash。转化为pdf的方法有很多,例如使用虚拟打印机、使用MicrosoftOffice的API、使用OpenOffice转化等,不过转化的过程中,可能由于文档有误、损坏、加密等原因造成转化失败。从pdf转化为flash就简单了许多,直接使用SWFTools的pdf2swf即可实现多种方式的转化。
  
  下图是文档转化到swf的一个流程,其中type是文档的一个状态标识(0表示未处理过的文档,1表示已生成pdf,2表示已生成flash,-1表示不受支持的文档格式,-2表示转化为pdf失败,-3表示转化为flash失败)

posted @ 2010-11-22 00:21 canbeing 阅读(6275) 评论(52) 编辑 收藏

 回复 引用 查看   
#1楼 2010-11-22 00:38 潺缘      
呵呵,不错
 回复 引用 查看   
#2楼 2010-11-22 00:39 申健      
如何防止豆丁下载器这类工具呢?
 回复 引用 查看   
#3楼 2010-11-22 08:14 Aloner [Sofire]      
SL可以不?
 回复 引用 查看   
#4楼 2010-11-22 10:18 爱风      
去下个flashpaper
可以直接把各种文件转成SWF
不需要转两次

 回复 引用 查看   
#5楼 2010-11-22 10:19 心不蒙尘      
百度文档做的巨烂~~~
不是打击百度,是个合格的程序员都不会把一个系统做成这样。
文档扣得积分多不说,重复下载重复扣积分。

 回复 引用 查看   
#6楼 2010-11-22 10:22 心不蒙尘      
而且百度文库的翻页加载功能也有问题,有时候页面加载不了。
还有用户想评论结果找个按钮半天都没有找到~~~~~~

 回复 引用 查看   
#7楼 2010-11-22 10:27 peace      
支持下
 回复 引用 查看   
#8楼 2010-11-22 11:00 菜菜灰      
不错,期待更多细节~~
 回复 引用 查看   
#9楼[楼主] 2010-11-22 12:39 canbeing      
@Aloner [Sofire]
没有用过SL的播放器,但我觉得是可以的。
毕竟技术都是相通的。

 回复 引用 查看   
#10楼[楼主] 2010-11-22 12:40 canbeing      
@爱风
使用flashpaper会有许多的不便
关于flashpaper的分析,请关注我的下一篇博文,谢谢。

 回复 引用 查看   
#11楼[楼主] 2010-11-22 12:44 canbeing      
@心不蒙尘
原来百度文库还有这么多问题,百度的有啊也有许多致命bug,哈哈。
不过从内容角度来看,百度文库很有杀伤力啊

 回复 引用 查看   
#12楼[楼主] 2010-11-22 12:49 canbeing      
@申健
这种东西,就像加密和解密一样。
而且解密算法又需要放在客户端公开,所以防不胜防。
我觉得可以使用不定期修改加密算法或因子的方法来缓解一下形势

 回复 引用 查看   
#13楼 2010-11-22 14:04 奎彤      
將PDF轉換為PNG檔,再利用Jquery做一個類Google DOC Viewer的在線預覧如何?
 回复 引用 查看   
#14楼 2010-11-22 15:03 jforeverg      
我的小站也用FlexPaper做一个在线文档的功能,大家有兴趣可以看一下功能比较简单:http://doc.open-open.com。将各种文档转成Flash也可以用FlashPaper。安装完之后就像一台打印机一样可以将各种类型的文档打印转成Flash,简单易用。
 回复 引用 查看   
#15楼 2010-11-22 17:44 nasdaqhe      
请教一下,像百度文库那样上传文档的时候会检查是否已经存在相同的文档,这个检查能做到对文档内容检测,是怎样实现的?
 回复 引用 查看   
#16楼[楼主] 2010-11-22 18:52 canbeing      
@奎彤
这样可是可以
不过不能做搜索,文件较多,也不好管理。

 回复 引用 查看   
#17楼[楼主] 2010-11-22 19:00 canbeing      
@nasdaqhe
如果要做的话,需要用第三方的包,将文档的内容读取出来保存到数据库。
最好再将这些内容进行索引,在上传的时候去搜索一下就可以。

不过个人觉得判断文档内容重复意义不是很大,标题重复就差不多了,如果真的要防止上传重复文档,可以将文档进行求md5值,不允许上传已经存在的md5值的文档。
读取文档中的文本请参考:http://blog.csdn.net/lizhihai_99/archive/2010/01/09/5158555.aspx

 回复 引用 查看   
#18楼[楼主] 2010-11-22 19:06 canbeing      
@jforeverg
这个做得挺不错的,拥有修改flexpaper的功底,赞一个。

 回复 引用 查看   
#19楼 2010-11-22 21:26 jforeverg      
@canbeing
谢谢!只是稍微改一下。需要改进的功能还很多。

 回复 引用 查看   
#20楼 2010-11-22 21:39 奎彤      
我认为目前在线PDF浏覧方案做的最好的是Google DOC Viewer,它不必安装任何plug in就可以看,不过一定要透过网络用URL取得它的服务,想要自己实现一个类似的应用有点困难。

FlexPlayer虽然是开源软件,程序代码允许在商用环境下任意扩充修改吗?

 回复 引用 查看   
#21楼 2010-11-22 21:54 moka      
不是所有的文档在线阅读一定要FLASH的,FLASH毕竟还是个浏览器插件,有一定的依赖性(尽快FLASH已经很普及)。
大家可以看一下http://www.bookfm.com/reader/online.html?bookid=101145, 他们就没有FLASH,但是支持了很多功能,楼主有空可以研究研究的。
据我了解,PDF2SWF的转换成功率不太高,应该不超过90%的。

 回复 引用 查看   
#22楼 2010-11-22 21:57 moka      
引用奎彤:
我认为目前在线PDF浏覧方案做的最好的是Google DOC Viewer,它不必安装任何plug in就可以看,不过一定要透过网络用URL取得它的服务,想要自己实现一个类似的应用有点困难。

FlexPlayer虽然是开源软件,程序代码允许在商用环境下任意扩充修改吗?

FLEXPLAYER商用环境是不能随意修改的。
国内有一个比GOOGLE DOC VIEWER做的更好,你可以去看看。http://www.bookfm.com

 回复 引用 查看   
#23楼 2010-11-22 22:27 ffffff      
欢迎大家一起进入QQ群讨论 42706992 一起努力,共同进步!
 回复 引用 查看   
#24楼 2010-11-22 22:42 奎彤      
bookfm看过了,还是觉得Google Doc Viewer操作起来顺畅一点,或许是网速或服务器效能不同。

不过会来这里参与讨论的人,多半还是比较想了解具体的实现方法,现在比较缺乏将PDF转换成浏覧器可直接呈现格式的Know how。

 回复 引用 查看   
#25楼[楼主] 2010-11-22 23:14 canbeing      
@奎彤
之前了解过一下Google DOC Viewer,发现文档需要完全开放才能用,不便于企业应用,也不便于防下载。
刚才看了一下,FlexPaper遵从GNU General Public License v3 License,可以商用,但需要保证持续源且遵守一些其他规定

 回复 引用 查看   
#26楼[楼主] 2010-11-22 23:27 canbeing      
@moka
恩,bookfm看起来不错,刚才看了一下,好像每页都有一个js再配合另外一个文件来展示,那个主内容播放器应该也是一个flash的。
下次再仔细研空研究。

在我用的时候,PDF2SWF基本不会出问题,只要pdf文档正常都是可以生成的,即使是五六百页的大文档。
不过文档转pdf却是一个问题,成功率不高。

 回复 引用 查看   
#27楼 2010-11-22 23:30 adonis      
11月份也一直在研究文档播放器,看了楼主的帖子,清晰了很多。尤其是两个格式之间转换的逻辑控制。期待楼主
(1)flexPaper预加载的实现
(2)是否考虑office软件宏病毒的处理?

 回复 引用 查看   
#28楼 2010-11-22 23:33 adonis      
文档转pdf,我采取的是openOffice+jodconverter.写了和批量处理程序,没有测试出来失败的呀。
加密的文件没有测试。

 回复 引用 查看   
#29楼[楼主] 2010-11-22 23:37 canbeing      
@adonis
引用adonis:
文档转pdf,我采取的是openOffice+jodconverter.写了和批量处理程序,没有测试出来失败的呀。
加密的文件没有测试。

如果一个word文档本来已经损坏,或者格式有些小错误,你会怎么样处理?

 回复 引用 查看   
#30楼[楼主] 2010-11-22 23:39 canbeing      
@adonis
引用adonis:
11月份也一直在研究文档播放器,看了楼主的帖子,清晰了很多。尤其是两个格式之间转换的逻辑控制。期待楼主
(1)flexPaper预加载的实现
(2)是否考虑office软件宏病毒的处理?

1、flexpaper确实比较慢,我现在是研究了百度文库的播放器来播放flash,当然flash还要另做处理,详情后面我的博客会写;
2、这个还没有遇到过,感谢你提醒我这个隐患;

 回复 引用 查看   
#31楼 2010-11-22 23:44 奎彤      
的確Google DOC Viewer雖然功能不錯,但不能用在企業應用。
我在想它是否是使用將PDF轉為HTML再呈現出來的方法,Google應該在文字辨識上花了不少功夫。

Flash不失为一个暂时性的解决方案,毕竟有很多现成的套件可以用。

 回复 引用 查看   
#32楼 2010-11-22 23:44 奎彤      
等到HTML5出来后,不晓得会不会有更好的解决方案。
 回复 引用 查看   
#33楼 2010-11-23 17:36 星辰大海      
学习了
 回复 引用 查看   
#34楼 2010-11-23 21:38 moka      
引用canbeing:
@moka
恩,bookfm看起来不错,刚才看了一下,好像每页都有一个js再配合另外一个文件来展示,那个主内容播放器应该也是一个flash的。
下次再仔细研空研究。

在我用的时候,PDF2SWF基本不会出问题,只要pdf文档正常都是可以生成的,即使是五六百页的大文档。
不过文档转pdf却是一个问题,成功率不高。


你把Flash给禁用了,看还能不能阅读?文档转换成PDF的成功率是很高的,转换成Flash的成功率跟文档的大小没有太大的关系,很重要的一点是PDF2SWF对于那些加密的或者只有形没有字的文档失败率极高,因为XPDF就不支持加密PDF的

 回复 引用 查看   
#35楼 2010-11-23 21:50 moka      
引用奎彤:
bookfm看过了,还是觉得Google Doc Viewer操作起来顺畅一点,或许是网速或服务器效能不同。

不过会来这里参与讨论的人,多半还是比较想了解具体的实现方法,现在比较缺乏将PDF转换成浏覧器可直接呈现格式的Know how。

google的服务器群实在太强悍了,可以实时对文档进行在线转换,这个没有一个很强的后台系统支撑是很难实现的。
对于要做一个跨平台的文档在线阅读器,建议大家还是不要用FLASH(GOOGLE 就是没有用FLASH),如果用PDF2SWF的话,把所有文档转换成PDF的思路如下:
1.MS OFFICE系列,直接用MS软件转成PDF,成功率极高
2.WPS 系列,一种可以另存为MS的格式,再参照第一条;另一种就是直接调用WPS的接口生成PDF,不过前者的效果更好,后者他调用的好像是PDFLIB的库
3.OPENOFFICE系列,直接用JODCONVERTER就可以实现转换
4.TXT,RTF直接用MS WORD打开转换成PDF
6.PS 可以用GHOSTSCRIPT转换成PDF
以上是我知道的一些关于文档转换的经验。

 回复 引用 查看   
#36楼 2010-11-23 21:59 moka      
引用申健:如何防止豆丁下载器这类工具呢?

豆丁下载器的原理其实就是将豆丁加密过的文档(SWF),解密成SWF,然后通过SWF2IMAGE生成PDF,缺点就是变成图片了,非矢量。
解密过程一般是通过下载豆丁的播放器,进行反编译,获取核心加密算法以便可以自行解开SWF。豆丁不管怎么变化花样,原理就是如此,变化的仅仅是加密算法。除非豆丁自己用FLASH渲染整个文档,这样才能拿做到真正的加密,但是据我了解,豆丁用的也是PDF2SWF,所以豆丁自称的什么文档重排都是瞎掰,随便整合了几个开源软件,自己搞了个FLASH播放器,就说有啥啥啥。哎,一切都是浮云,要知道文档之间的格式是非常难的,绝非一般的公司能做的。

 回复 引用 查看   
#37楼[楼主] 2010-11-23 23:12 canbeing      
@moka
mora在这方面了解广泛,欢迎多多分享。
bookfm是你做的吗?

 回复 引用 查看   
#38楼 2010-11-24 10:42 moka      
引用canbeing:
@moka
mora在这方面了解广泛,欢迎多多分享。
bookfm是你做的吗?

你去看看bookfm的JS,动则3000多行,我没这个能力写出这么高深的代码。
以前弄个文档库的东西,略知一二。

 回复 引用 查看   
#39楼[楼主] 2010-11-24 12:39 canbeing      
@moka
引用moka:
引用canbeing:
@moka
mora在这方面了解广泛,欢迎多多分享。
bookfm是你做的吗?

你去看看bookfm的JS,动则3000多行,我没这个能力写出这么高深的代码。
以前弄个文档库的东西,略知一二。

哈哈,好吧,多多交流。

 回复 引用 查看   
#40楼 2010-11-26 22:14 c#在路上      
不错的东西,标记一下。
 回复 引用 查看   
#41楼 2010-11-28 11:29 没有结局      
@ffffff
群拒绝我加入的。

 回复 引用 查看   
#42楼 2010-11-29 17:36 失落小羊      
顶 很不错
 回复 引用 查看   
#43楼 2010-11-29 18:16 ffffff      
@没有结局

不好意思,防止发广告的人进来。我的QQ是:282324121

 回复 引用 查看   
#44楼 2010-11-30 17:14 夜色朦胧      
@奎彤
我本来想用Google Doc View的,感觉是不错,但是必须要文件的URL难道我了,我只会Java配置虚拟路径然后生成URL,但是.net MVC不会,能不能教教菜鸟

 回复 引用 查看   
#45楼 2010-12-02 16:39 真睡不醒      
我用了flashpaper我不知道是不是哪里需要配置, 好像没有权限去让服务器操作exe程序,我给了.net权限也不行给了every全部权限也不行,但是我在本地测试成功了 ,可是把网站放到服务器上,却没有反应,也没有报错
 回复 引用 查看   
#46楼[楼主] 2010-12-02 22:13 canbeing      
@真睡不醒
引用真睡不醒:我用了flashpaper我不知道是不是哪里需要配置, 好像没有权限去让服务器操作exe程序,我给了.net权限也不行给了every全部权限也不行,但是我在本地测试成功了 ,可是把网站放到服务器上,却没有反应,也没有报错

试着用这个方法增加权限:
右击FlashPaper打印机,选择“打印机属性”,在安全选项卡里,将应用程序池的模拟用户(默认为network service)加到里面去

 回复 引用 查看   
#47楼 2010-12-03 11:29 真睡不醒      
引用canbeing:
@真睡不醒
引用真睡不醒:我用了flashpaper我不知道是不是哪里需要配置, 好像没有权限去让服务器操作exe程序,我给了.net权限也不行给了every全部权限也不行,但是我在本地测试成功了 ,可是把网站放到服务器上,却没有反应,也没有报错

试着用这个方法增加权限:
右击FlashPaper打印机,选择“打印机属性”,在安全选项卡里,将应用程序池的模拟用户(默认为network service)加到里面去

谢谢LZ,我还真没给打印机加权限,如果真的可以实现的话 那么 每一次操作,主机那边的程序就会运行一次(闪一下flashpaper的程序),而我试过,如果一个很大的文档进行转换的话会比较慢,如果并发性很高的话,那么如果不是主机集群,很多服务器的那种一般服务器,估计会吃不消吧

 回复 引用 查看   
#48楼[楼主] 2010-12-03 12:44 canbeing      
@真睡不醒
引用真睡不醒:
引用canbeing:
@真睡不醒
引用真睡不醒:我用了flashpaper我不知道是不是哪里需要配置, 好像没有权限去让服务器操作exe程序,我给了.net权限也不行给了every全部权限也不行,但是我在本地测试成功了 ,可是把网站放到服务器上,却没有反应,也没有报错

试着用这个方法增加权限:
右击FlashPaper打印机,选择“打印机属性”,在安全选项卡里,将应用程序池的模拟用户(默认为network service)加到里面去

谢谢LZ,我还真没给打印机加权限,如果真的可以实现的话 那么 每一次操作,主机那边的程序就会运行一次(闪一下flashpaper的程序),而我试过,如果一个很大的文档进行转换的话会比较慢,如果并发性很高的话,那么如果不是主机集群,很多服务器的那种一般服务器,估计会吃不消吧

恩,是的
如果要做集群,为了保证一致性,建议用后台任务执行转化,并且只在一台服务器上运行任务。

 回复 引用 查看   
#49楼 2011-10-28 16:34 半根烟      
有没有人遇到过FlashPaper在64位操作系统上不支持的,功能倒是实现了,但找不到64位的虚拟打印机。
 回复 引用 查看   
#50楼 2011-12-12 10:14 雷少      
canbeing
你好,我之前也做过一些相关的工作,
只是有个问题想请教,如果做成类似百度文库的模型的话,
之中的全文检索似乎不是很理想,你是否有相关的涉及。。。???

 回复 引用 查看   
#51楼[楼主] 2011-12-12 14:54 canbeing      
@雷少
可以使用“xpdf”软件,调用命令行“pdftotext.exe c:\1.pdf c:\1.txt”进行转化;获取到文本,对文本进行索引,即可实现全文检索。
不过这种搜索范围太大,还是建议只对标题和摘要搜索吧。

 回复 引用 查看   
#52楼 2011-12-12 17:13 雷少      
多谢楼主了,目前全文检索的已经实现,是借用了Lucene.net 的东西,目前的难题卡在了检索到相关的信息后无法实现高亮定位,就是在阅读的页面定位搜索信息,这块你有好的建议吗?

多谢回复。