自己的小结
Aug 31
#### 一.服务器端支持 ####

1. openoffice.org3.0 + jodconverter + swftools



原理:开启openoffice监听,利用jodconverter调用oo3的转换脚本将 office文件转换成pdf文件。

          再通过swftools将pdf文件转换为swf文件



前提:安装OpenOffice,安装OpenOffice SDK3.3,jodconverter及swftools,并开启openoffice监听

环境变量:

export PATH=$PATH:/usr/local/swftools/bin/




shell下命令:



第一步:开启openoffice监听 8100端口

export DISPLAY=localhost:2.0

Xvfb :2 -screen 0 800x600x24 2> /dev/null &

/usr/lib/libreoffice/program/soffice --accept="socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" --nologo --headless --nofirststartwizard --display :2 &



第二步:通过jodcconverter转换文档成pdf

java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar /opt/lampp/htdocs/sociax/1.txt /opt/lampp/htdocs/sociax/text.pdf



第三步:将pdf转化为swf、txt文件

//转化为swf -- 展示用
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=72 -s flashversion=9 "/opt/123.pdf" -o "/opt/test/1.swf"
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=30 -p 1 -s flashversion=9 "/opt/123.pdf" -o "/opt/test/1.swf"



//转化为txt纯文本 -- sphinx搜索用

pdftotext -q "/opt/lampp/htdocs/sociax/1.pdf" "/opt/lampp/htdocs/sociax/1.txt"







#### 二. java程序 ####



说明:通过计划任务定时执行java程序,通过java程序执行文档转化命令,转化文档。

注:如果能实现java程序内部监听,不需要服务器端计划任务配置,则为更佳的方案。





java程序结构



1. sociax.java

方法:main()

实现://伪代码



     loadConfig ()                    // 载入配置 conf/sociax.xml

     startTransformListener ()   // 调用转化(监听)程序,文件名称 :src/SociaxTransAdmin.java





2. conf/sociax.xml

要求:

能配置sociax数据库信息,包括host,port,database,username,password, prefix (表前缀)

转化信息:limit 单次转化的文件个数上限, filedir:文件路径前缀

能配置转化命令:(由于不同服务器安装的环境可能有区别)

com_file2pdf:java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar $fileoffice $filepdf

com_pdf2swf: pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=150 -s flashversion=9 "$filepdf" -o "$fileswf"

com_pdf2txt:pdftotext -q "$filepdf" "$filetxt"





mysql
127.0.0.1
3306
root
123456
sociax
sociax_



20
/usr/data



java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar $fileoffice $filepdf
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=150 -s flashversion=9 "$filepdf" -o "$fileswf"
pdftotext -q "$filepdf" "$filetxt"



实现可参考:pdf2swf/conf/sociax.xml



3.sociaxTransAdmin.java

方法:startTransformListener()



参数:无

实现://伪代码



    initData();           //初始化数据将需要转化的内容导入到转换缓冲表

    trans_list =  getData();           //获取需要转化的数据 ,最多limit个,并保存到转换队列 变量 trans_list 中

    doTrans(trans_list);           //执行转化





方法:initData();

参数:无

实现:需要执行下面的sql:注意将里面的sociax_替换为配置的表前缀

String sql = "insert into  `sociax_document_cache` (aid,status,cTime)

select attach_id,0,ctime from sociax_doc where attach_id > ( select IFNULL(max(aid),0) from `sociax_document_cache` ) ";



参考:CrawlingFile.java 里面的 insertNoneTransformDoc函数



方法:getData();

参数: 自己定义

实现:需要执行下面的SQL,并返回结果,其中config.limi为配置的单次最多转化数

String sql="select doc.id,doc.aid,CONCAT(attach.save_path,'',attach.save_name) as outputFile from sociax_document_cache as doc left join sociax_attach as attach on  attach.attach_id = doc.aid where doc.status='0' limit 0,"+config.limit;





方法:  doTrans(trans_list);

参数:无

实现:伪代码

if( empty(trans_list) ){ return false;} //如果转化队列为空,则不执行转化操作

start();                                          //开始转化服务 -- 可能需要开启一些服务之类的,待调试

trans_ids = array();                        //转换的文件的id集合  

//开始对转换队列进行转化操作

for(i=0; i
     transfile(file);                           //单个文件的转化操作          

     ids []

}

updateDataBase(trans_ids);           //通过trans_ids集合将缓存表里面的status更新为1

stop();                                          //停止转化服务 -- 可能需要关闭一些服务之类的,待调试





方法:transfile(file)

参数:file,要转化的源文件

实现:伪代码

filepdf = file+'.pdf'   //新的pdf文件地址



if(file_exsit(filepdf)){ //判断新的pdf文件是否存在,存在则不继续下面操作 -- 不知道java里面怎么实现,交给你研究

     return false;

}



//判断是否为pdf文件,如果不是则执行转化命令,将文件转化成pdf,否则直接复制一份文件到pdf

if( !ispdf(file) ){

     do_commond = com_file2pdf; //转化成pdf的命令处理,注意源文件和目标文件

     xx.runcommend(do_commond);

}else{

     xx.runcommend('cp '+file+' '+filepdf);     //直接拷贝

}



//由于转化pdf需要一定时间,在转化成swf前要判断是否已经转化完了

//判断上一个执行操作是否结束 -- 不知道怎么实现的 看小鹏的ServiceAdmin.java: 里面有个isDone

if(xx.isDone()){

     do_commond =com_pdf2swf

     //将文件转化称swf

      xx.runcommend(do_commond);

     //将文件转化称txt 可以和上个命令一起执行,不需要判断是否已经执行完了

     do_commond =com_pdf2swf

     xx.runcommend(do_commond);

}





方法:updateDataBase(ids);

参数:ids,本次转化的文档id集合

实现:执行下面的sql,后面的in ids 需要java处理好

String sql = " update sociax_document_cache set status = 1 where  id in (''+ids+")";







#### 3.数据库修改 ####

新加一张文档转化cache表

CREATE TABLE IF NOT EXISTS `sociax_document_cache` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `aid` int(11) NOT NULL,

  `status` tinyint(2) NOT NULL,

  `cTime` int(11) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;






#### 4. flexpaper显示swf部分 ####

这部分比较简单,后续补充