首先所用到的技术就是网上通用的openoffice+swfTools+FlexPaper。根据网上查看资料,初步理清实现思路。首先通过openoffice实现office文档转化为PDF文档。第二步通过swfTools把pdf文档转化为swf文件。最后通过FlexPaper显示swf文件。
一 、通过openoffice实现把office文档转化为PDF,首先需要用到jodconverter这个包来转化,而jodconverter通过openofficce转化所以要先安装openoffice,本例用到的是openoffice3.3.0和jodconverter2.2.2。
step1:安装启动openoffice. 1,执行命令 cd C:\Program Files (x86)\OpenOffice.org 3\program 2,输入命令:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 。3,在CMD中用以下命令查看8100是否已被监听:netstat -anop tcp
step2 用JAVA转化文档
import java.io.File; import java.net.ConnectException; import java.util.Date; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; public class Doc2PdfUtil extends Thread { private File inputFile;//需要转换的文件 private File outputFile;//输出的文件 public Doc2PdfUtil(File inputFile,File outputFile){ this.inputFile = inputFile; this.outputFile = outputFile; } public void docToPdf(){ Date start = new Date(); //链接openoffice的8100端口的 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); try { connection.connect(); DocumentConverter converter = new OpenOfficeDocumentConverter(connection); //转化和要生成的流 converter.convert(inputFile, outputFile); } catch (ConnectException e) { e.printStackTrace(); }finally{ if(connection != null){ connection.disconnect(); connection = null; } } } public void run(){ this.docToPdf(); } public File getInputFile() { return inputFile; } public void setInputFile(File inputFile) { this.inputFile = inputFile; } public File getOutputFile() { return outputFile; } public void setOutputFile(File outputFile) { this.outputFile = outputFile; } public static void main(String[] args) { File inputFile = new File("f://普京发布的白皮书.doc"); File outputFile = new File("f://普京发布的白皮书.pdf"); Doc2PdfUtil dp = new Doc2PdfUtil(inputFile, outputFile); dp.start(); } }
二、把PDF转化为swf,这个阶段转化需要使用工具swftools来实现
step1,swftools也是需要下载并且安装到我们本地的
step2.安装完成后用JAVA调用pdf2swf.exe来实现转化文档
try { //Runtime.getRuntime()使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 //.exec("d:/tool/pdf2swf/pdf2swf.exe -o f:/aobama.swf -s flashversion=9 f:/aobama.pdf")在单独的进程中执行指定的字符串命令。 //特别注意,为了生成的swf文件一页也能显示,需要转换的时候加上flashversion=9 Process p = Runtime.getRuntime().exec("d:/tool/pdf2swf/pdf2swf.exe -o f:/aobama.swf -s flashversion=9 f:/aobama.pdf"); //一直读到进程终止 BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); while(br.readLine()!=null){ p.waitFor();//注意这个方法会造成进程的堵塞。注释掉不影响程序的运行 } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
三、通过FlexPaper来读取swf文件并且在页面上显示。本人使用的是的FlexPaper_1.5.1_flash这个版本,首先把解压出来的文件中的3个js引入项目jquery.js、flexpaper_flash.js、flexpaper_flash_debug.js。然后把FlexPaperViewer.swf文件放到WebRoot根目录下,新建JSP显示页面来显示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/flexpaper_flash.js"></script> <script type="text/javascript" src="js/flexpaper_flash_debug.js"></script> <style type="text/css" media="screen"> html, body { height:100%; } body { margin:0; padding:0; overflow:auto; } #flashContent { display:none; } </style> <title>文档在线预览系统</title> </head> <body> <div style="position:absolute;left:50px;top:10px;"> <a id="viewerPlaceHolder" style="width:820px;height:650px;display:block"></a> <script type="text/javascript"> var fp = new FlexPaperViewer( 'FlexPaperViewer', 'viewerPlaceHolder', { config : { SwfFile : 'aobama.swf', Scale : 0.6, ZoomTransition : 'easeOut', ZoomTime : 0.5, ZoomInterval : 0.2, FitPageOnLoad : true, FitWidthOnLoad : false, FullScreenAsMaxWindow : false, ProgressiveLoading : false, MinZoomSize : 0.2, MaxZoomSize : 5, SearchMatchAll : false, //InitViewMode : 'TwoPage', ViewModeToolsVisible : true, ZoomToolsVisible : true, NavToolsVisible : true, CursorToolsVisible : true, SearchToolsVisible : true, localeChain: 'en_US' }}); </script> </div> </body> </html>
四、工程的结构和显示结果。
最后一个问题是关于FlexPaper指定本地硬盘的文件路径。web项目中是不允许的,只能放在WebRoot下,如果有方法请通知下,大家一起学习。