学习Java模拟实现百度文档在线浏览
作者:小夜的传说
这个思路是我参考网上而来,代码是我实现。
采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览。
ok,
A、下载OpenOffice (转换资源文件)
B、下载JodConverter(调用OpenOffice)
C、下载Swftools(Pdf2Swf)
D、下载 FlexPaper(浏览swf文件)
下载之后,先别急安装,请看完这篇博文
1、先看我们的MyEclipse工程结构
2、将我们下载下来的jodconverter-2.2.2.zip解压之后将所有的jar文件拷贝到baiduDoc的lib下面去
3、在WebRoot下面新建FlexPaper文件夹,将解压后的FlexPaper全部拷贝到FlexPaper中去
4、新建BaiDuServlet.java文件
package com.baidu.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; import javax.imageio.stream.FileImageInputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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; /** * @Author:NuoYan * @Date:2015-2-2 下午2:24:58 * TODO: 1、第一步,首先获取到需要查看的文件 * 2、第二部,将获取的文件(doc,xls,txt,ppt,03/07版本转化为PDF),这一步需要调用OpenOffice * 3、第三部,将资源文件转换好的PDF文件转换为swf文件,使用FlexPaperViewer.swf进行浏览查看 */ public class BaiDuServlet extends HttpServlet { private File sourceFile;// 要转化的源文件 private File pdfFile;// pdf中间文件对象 private File swfFile;// swf目标文件对象 private String filePath;// 用来保存文件路径 private String fileName;// 不包括后缀名的文件名 public File getSourceFile() { return sourceFile; } public void setSourceFile(File sourceFile) { this.sourceFile = sourceFile; } public File getPdfFile() { return pdfFile; } public void setPdfFile(File pdfFile) { this.pdfFile = pdfFile; } public File getSwfFile() { return swfFile; } public void setSwfFile(File swfFile) { this.swfFile = swfFile; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String saveFileName = request.getParameter("savFile"); System.out.println(saveFileName); String webPath = request.getRealPath("/"); filePath = webPath + "reader\\" + saveFileName; fileName = filePath.substring(0, filePath.lastIndexOf(".")); // 创建三个文件对象 sourceFile = new File(filePath); pdfFile = new File(fileName + ".pdf"); swfFile = new File(fileName + ".swf"); System.out.println(pdfFile); System.out.println(swfFile); // 1、将源文件转化为pdf格式文件 src2pdf(); try { // 2、将pdf文件转化为swf文件 pdf2swf(); } catch (Exception e) { e.printStackTrace(); } // 将转化好的文件绑定到session上去 request.getSession().setAttribute("swfName", swfFile.getName()); System.out.println(swfFile.getName()); // 重定向到预览页面 response.sendRedirect(request.getContextPath() + "/reader/baseFile.jsp"); } /** * @Author:NuoYan * @Date:2015-2-2 下午2:28:22 TODO://源文件转化为PDF文件 */ private void src2pdf() { if (sourceFile.exists()) { // 如果不存在,需要转份为PDF文件 if (!pdfFile.exists()) { // 启用OpenOffice提供的转化服务 OpenOfficeConnection conn = new SocketOpenOfficeConnection(8100); // 连接OpenOffice服务器 try { conn.connect(); // 建立文件转换器对象 DocumentConverter converter = new OpenOfficeDocumentConverter( conn); converter.convert(sourceFile, pdfFile); // 断开链接 conn.disconnect(); System.out.println("转换成功"); } catch (ConnectException e) { e.printStackTrace(); } } else { System.out.println("已经存在PDF文件,不需要在转换!!"); } } else { System.out.println("文件路径不存在!!!"); } } /** * @Author:NuoYan * @Date:2015-2-2 下午2:28:32 * @throws Exception * TODO:PDF转化为SWF文件 */ private void pdf2swf() throws Exception { if (!swfFile.exists()) { if (pdfFile.exists()) { String command = "C:\\Pdf2swf\\pdf2swf.exe " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"; System.out.println("转换命令:" + command); // Java调用外部命令,执行pdf转化为swf Runtime r = Runtime.getRuntime(); Process p = r.exec(command); System.out.println(loadStream(p.getInputStream())); System.out.println("swf文件转份成功!!!"); System.out.println(swfFile.getPath()); } else { System.out.println("不存在PDF文件"); } } } private static String loadStream(InputStream in) throws Exception { int len = 0; in = new BufferedInputStream(in); StringBuffer buffer = new StringBuffer(); while ((len = in.read()) != -1) { buffer.append((char) len); } return buffer.toString(); } }
5、修改index.jsp
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>百度文库在线预览</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <a href="<%=request.getContextPath()%>/BaiDuServlet?savFile=1234.xls">在线预览</a> </body> </html>
6、编写baseFile.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"> <title>在线阅读</title> <script type="text/javascript" src="../FlexPaper/js/flexpaper_flash.js"></script> <style type="text/css"> html,body{height: 100%;} body { margin: 0;padding: 0;overflow: auto; } #flashContent { display:none; } </style> </head> <body> <div style="position:absolute;left:10px;top:10px;"> <a id="viewerPlaceHolder" style="width:1000px;height:480px;display:block"></a> <script type="text/javascript"> var fp = new FlexPaperViewer( '../FlexPaper/FlexPaperViewer', 'viewerPlaceHolder', { config : { SwfFile : escape('../reader/<%=(String)session.getAttribute("swfName")%>'), 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 : 'Portrait', PrintPaperAsBitmap : false, ViewModeToolsVisible : true, ZoomToolsVisible : true, NavToolsVisible : true, CursorToolsVisible : true, SearchToolsVisible : true, localeChain: 'zh_CN' }}); </script> </div> </body> </html>
注意baseFile.jsp中的代码,不会你可以参考这里
/**************************************************************************************/
7、到这里就完成,需要注意的是:
(1)、swftools-2013-04-09-1007.exe文件安装路径不要太深,不然Java调用外部命令不能执行
(2)、
2.1、红色1标记路径不能错,我就犯这个错误了
2.2、红色标记2还可以写http://127.0.0.1:8080/baiduDoc/reader/...
(3)、启动OpenOffice的命令,不是直接双击启动的。官网启动方式,使用cd命令打开安装目录!
安装完openoffice后
A.安装服务
cd C:\Program Files (x86)\OpenOffice4\program
这一步你可以看你的OpenOffice安装哪里
执行
soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
B.查看是否安装成功
2.1查看端口对应的pid
netstat -ano|findstr "8100"
2.2查看pid对应的服务程序名
tasklist|findstr "ipd值"
效果图示:
以上就是本文的全部内容,希望对大家的学习有所帮助。