模仿豆丁网的在线阅读
由于更换了新OA,制度查询不能很好满足要求,企管提出需求需要将规则制度放在平台上查看,并且不让下载,因此模仿豆丁网做了在线阅读功能。
用到的工具如下:
1、FlexPaper,一个基于Flex框架的插件,能通过flash来展现漂亮的界面。
2、swftools,一款将pdf转换成swf的工具。
3、OpenOffice,可以将office文档转换成pdf的工具,但是有一个缺点,需要开启他自己的服务,因此建议将该服务写进批处理中,并且让服务器开机运行该服务。
FlexPager的安装方法就不说了,请参照官网文档。
说一下思路,如果用户上传的是doc或者excel文档,需要调用OpenOffice进行转换成pdf。然后将pdf通过swftools转换成swf文件,最后通过FlexPager进行展示。
说一下关键代码:
1、doc,excel转换成pdf
先要开启服务,如下:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
当然可以写进.bat中
比如:
@echo off
set /p disc=请输入openOffice的安装盘符(比如:C:):
set /p path=请输入openOffice的安装路径(比如:C:\openOffice):
%disc%
cd %path%\program
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
最好将地址固定,放到服务器启动项中
比如:
@echo off
G:
cd G:\openOffice\program
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
然后在我们的程序中调用的关键代码如下:
FilesourceFile=newFile(req.getSession().getServletContext().getRealPath("")+"\\sourceFile\\"+id+postfix);
File pdfFile=new File(req.getSession().getServletContext().getRealPath("")+"\\pdfFile\\"+id+".pdf");
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
logger.info("准备建立连接");
try {
connection.connect();
logger.info("连接成功");
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
logger.debug("开始转换成pdf文件");
converter.convert(sourceFile, pdfFile);
logger.debug("转换成功");
pdfFile.createNewFile();
connection.disconnect();
logger.info("释放连接");
这样就可以将任何office文档转换成pdf了
2、pdf转换成swf
关键代码如下:
String cmdString = toolPath+" -F G:\\SWFTools\\Fonts -t " +tempPath+"\\"+id+".pdf" + " -o " + tempPath+"\\"+id+".swf" + " -T 9";
logger.debug("执行cmd命令:"+cmdString);
Process p = r.exec(cmdString);
Thread errorBackFromCMD=new Thread(new BackFromCMD("error",p.getErrorStream())); errorBackFromCMD.start();
Thread infoBackFromCMD=new Thread(new BackFromCMD("info",p.getInputStream())); infoBackFromCMD.start();
logger.debug("cmd命令执行结束");
p.waitFor();
logger.debug("swf文件转换完成");
3、将swf文件展示出来
关键代码如下:
主要实在SwfFile选项中指定swf文件就可以了,必须注意的是swf文件必须放在FlexPaper文件夹下,不然无法找到。而且这里不需要写成\FlexPaper表示相对路径。
最后有一点要说明,如果pdf转换swf速度很慢,可以自己建一个文件夹,把系统常用字库放进去,并在-F G:\\SWFTools\\Fonts -t " + tempPath+"\\"+id+".pdf" + " -o " + tempPath+"\\"+id+".swf" + " -T 9"这个命令的-F中指定文件夹路径,这样的话,就不会从系统搜索整个字库,加快转换速度.
最终效果如下: