百度文库阅读模式关键技术要点就是将文档转换成SWF文件,然后用Flex开发的播放器进行播放,整个逻辑如下:
用户上传Office系列文档(或者其他格式也行)
保存后,系统在后台另外启动一个线程进行转换工作:
一般利用OpenOffice将文档转换成PDF
然后再利用SWFTools将PDF转换成SWF
浏览是通过阅读器(在FlexPaper上改造的)阅读SWF文件
发布时将SWF文件发布,然后在发布的页面调用阅读器,网民就可以按照百度阅读的方式进行文档浏览了
TRS WCM V6.5.11474以上的版本如果文档为外部文件,并且为Office系列文档、文本文件、PDF、网页类文件,那么查看时和发布时就是百度文库模式
1、在WCM服务器上安装OpenOffice(以下将简称OO)
官网地址:http://www.openoffice.org/
2、将OpenOffice服务启动
进入OO的安装目录:cd /d C:Program FilesOpenOffice.org 3program
执行服务启动命令(端口默认为8100,如果冲突请修改):soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"
3、验证OO安装成功
使用Windows任务管理器确认有soffice.exe和soffice.bin的进程
确认服务已经启动:netstat -an | find "8100"
4、从官网下载安装SWFTools
1、在WCM服务器上安装从官网下载的OpenOffice(以下将简称OO)
官网地址:http://www.openoffice.org/
2、拷贝Linux缺失的字体(中文、小语种对应的字体等等)
OO转换Office系列文档成PDF时,如果一些字体缺失,将会转换为?,为了规避问题出现,请提前将Windows上的一些字体更新到系统中,更新步骤:
在系统目录/usr/share/fonts/下创建新的目录other
将Windows系统中的C:WindowsFonts 目下需要的字体拷贝到/usr/share/fonts/other中
# fc -cache /usr/share/fonts/other 更新字体缓存
3、将OpenOffice服务启动
执行服务启动命令(端口默认为8100,如果冲突请修改):/opt/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
可以用nohup放入后台执行
4、验证OO安装成功
确认是否有soffice的进程:ps –ef | grep soffice
5、从官网下载安装SWFTools
在用户新增配置中新增或者修改已有的配置
1、OO的端口
名称:OPEN_OFFICE_PORT
内容:启动OO服务设置的端口
说明:OpenOffice的服务端口
2、SWFTools的安装路径
名称:SWF_TOOLS_PATH
内容:SWFTools的安装路径
说明:SWFTools的安装路径
需要使用一个Flash播放器 + JavaScript才可以实现百度文库的效果;
所以需要在preview、pub以及分发点的各个站点根目录下拷贝这个附件的内容:相关站点根目录下的更新.rar
细览模板撰写方法和以前一模一样,系统会自动判断文档类型,另外判断是否转换生成了SWF文件;
播放器的效果HTML代码由WEB-INF/classes/swf_view.html的内容决定,可以自行修改。
1、新建一篇文档,类型为外部文件,上传的文件为Office系列文档,保存
2、查看后台是否有异常,有异常反馈给研发解决,没有继续下一步
3、确认附件对应的文件名,在Protect对应的目录中检查是否有同名不同后缀的文件
如果不存在pdf后缀的文件,说明OpenOffice没有配置成功,重新参考上面章节进行配置
如果不存在swf后缀的文件,说明SWFTools没有配置成功,重新参考上面章节进行配置
4、点击文档列表中的类型图标进行文档查看,确认可以出百度文库阅读效果:
5、预览文档,确认可以看到百度文库阅读效果
JODConvertor在网上有很多资料,不再叙述,共享一下WCM的转化代码:com.trs.util.swf.SWFCreator.toPDF()
源文件:
注意:这个包需要使用JDK1.6+,如果是一些历史遗留环境使用的JDK版本低于这个,需要安装新的JDK并设置。
WCM的转化代码:com.trs.util.swf.SWFCreator.toSWF()
WCM将Document的新增和修改,判断如果是外部文件就尝试开一个线程进行转换;
监听器代码如下:
public void notifyOnAddObj(BaseObj _oObjAdded) throws WCMException { if (!(_oObjAdded instanceof Document)) { loggr.error("Listener[" + getClass() + "]不能监听对象[" + _oObjAdded.getClass() + "]的新增!"); return; } Document document = (Document) _oObjAdded; // 仅仅处理外部文件类型的文档 if (document.getType() != Document.DOC_TYPE_FILE) { return; } // 提取出需要转换的文件 String sFileName = document.getPropertyAsString("DOCFILENAME"); convertToSWF(document, sFileName); }
查看页面的关键代码(swf.rar):
<td class="content_inner">
<%@include file="../swf/create_swfview.jsp"%>
如果文档是外部文件类型,置标
<TRS_Document Field="DOCHTMLCON"/>
会产生一段模拟百度文库阅读器的代码,代码内容由WEB-INF/classes/swf_view.html(swf_view.zip)内容决定,TRS_Document的Parser(com.trs.components.wcm.publish.tagparser.WCMTagParserDocument)进行了改造,获取对应的PDF URL方法,以便实现在线下载:
<TRS_Document Field="DOCHTMLCON" pdfurlonly="true" UrlIsAbs="true"/>
将会返回对应的PDF绝对地址
使用参考WCM的细览展示代码:
swf.rar中的create_swfview.jsp
WCM改造后的源码:
官网地址:
http://flexpaper.devaldi.com/default.jsp
http://code.google.com/p/flexpaper/downloads/list