Java模拟实现百度文档在线浏览


这个思路是我参考网上而来,代码是我实现。

采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览。

ok,

A、下载OpenOffice (转换资源文件)

B、下载JodConverter(调用OpenOffice)

C、下载Swftools(Pdf2Swf)

D、下载 FlexPaper(浏览swf文件)


这里我已经全部下载好了,大家只需要下载:http://down.51cto.com/data/1980603


下载之后,先别急安装,请看完这篇博文


1、先看我们的MyEclipse工程结构

Java模拟实现百度文档在线浏览_第1张图片


2、

将我们下载下来的wKiom1TPOwCAE5YQAAAZW7nJ3Nk933.jpg解压之后将所有的jar文件拷贝到baiduDoclib下面去

Java模拟实现百度文档在线浏览_第2张图片


3、  WebRoot下面新建wKioL1TPPFKQcG8VAAAO_BfzbDc134.jpg文件夹,将解压后的wKiom1TPO5Piigy_AAAg5uWVZqM672.jpg全部拷贝到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.p_w_picpathio.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"%>


  
    百度文库在线预览
   
   
       
   
   
  
  
   /BaiDuServlet?savFile=1234.xls">在线预览
  


6、编写baseFile.jsp文件


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




在线阅读


html,body{height: 100%;}
body {
	margin: 0;padding: 0;overflow: auto;
}
#flashContent { display:none; }




	        
	         
				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'
						 }});
	        
        


注意baseFile.jsp中的代码,不会你可以参考这里


Java模拟实现百度文档在线浏览_第3张图片


/**************************************************************************************/


7、到这里就完成,需要注意的是:

1、wKioL1TPPbDCQ7SOAAAj1OEioRA406.jpg文件安装路径不要太深,不然Java调用外部命令不能执行,我这里是C盘下

wKioL1TPPdeTPZf0AAAk56wHaeA554.jpg


2、wKioL1TPPfzR23txAACPHt6wVzY664.jpg

    2.1、红色1标记路径不能错,我就犯这个错误了        

    2.2、红色标记2还可以写http://127.0.0.1:8080/baiduDoc/reader/...


3、启动OpenOffice的命令,不是直接双击启动的。官网启动方式,使用cd命令打开安装目录!

安装完openoffice后

1.安装服务

cd C:\Program Files (x86)\OpenOffice4\program

这一步你可以看你的OpenOffice安装哪里

执行

soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

2.查看是否安装成功

   2.1查看端口对应的pid

   netstat -ano|findstr "8100"

   2.2查看pid对应的服务程序名

   tasklist|findstr "ipd值"


效果图示:


Java模拟实现百度文档在线浏览_第4张图片


源码地址:


http://down.51cto.com/data/1980608


有问题留言,来找我吧!