Java实现word⽂档在线预览,读取office(word,excel,ppt)⽂件
想要实现word或者其他office⽂件的在线预览,⼤部分都是⽤的两种⽅式,⼀种是使⽤openoffice转换之后再通过其他插件预览,还有⼀种⽅式就是通过POI读取内容然后预览。
⼀、使⽤openoffice⽅式实现word预览
主要思路是:
1.通过第三⽅⼯具openoffice,将word、excel、ppt、txt等⽂件转换为pdf⽂件
2.通过swfTools将pdf⽂件转换成swf格式的⽂件
3.通过FlexPaper⽂档组件在页⾯上进⾏展⽰
我使⽤的⼯具版本:
openof:3.4.1
swfTools:1007
FlexPaper:这个关系不⼤,我随便下的⼀个。推荐使⽤1.5.1
JODConverter:需要jar包,如果是maven管理直接引⽤就可以
操作步骤:
1.office准备jquery在线库
下载openoffice:
从过往⽂件,其他语⾔中到中⽂版3.4.1的版本
下载后,解压缩,安装
然后到安装⽬录下的program ⽂件夹
在⽬录下运⾏
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
如果运⾏失败,可能会有提⽰,那就加上 .\ 在运⾏试⼀下
这样openoffice的服务就开启了。
2.
将flexpaper⽂件中的js⽂件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js⽂件主要是预览swf⽂件的插件)拷贝⾄⽹站根⽬录;将FlexPaperViewer.swf拷贝⾄⽹站根⽬录下(该⽂件主要是⽤在⽹页中播放swf⽂件的播放器)
项⽬结构:
页⾯代码:
fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>⽂档在线预览系统</title>
<style>
body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}
a {color:#CE4614;}
#msg-box {color: #CE4614; font-size:0.9em;text-align:center;}
#msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}
#msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}
#msg-box .nav {margin-top:20px;}
</style>
</head>
<body>
<div id="msg-box">
<form name="form1" method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp">
<div class="title">
请上传要处理的⽂件,过程可能需要⼏分钟,请稍候⽚刻。
</div>
<p>
<input name="file1" type="file">
</p>
<p>
<input type="submit" name="Submit" value="上传">
</p>
</form >
</div>
</body>
</html>
docUploadConvertAction.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="java.io.*"%>
<%@page import="java.util.Enumeration"%>
<%@page import="illy.servlet.MultipartRequest"%>
<%@page import="illy.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="filetest.DocConverter"%>
<%
//⽂件上传采⽤cos组件上传,可更换为commons-fileupload上传,⽂件上传后,保存在upload⽂件夹
//获取⽂件上传路径
String saveDirectory =RealPath("/")+"upload";
//打印上传路径信息
System.out.println(saveDirectory);
//每个⽂件最⼤50m
int maxPostSize = 50 * 1024 * 1024 ;
//采⽤cos缺省的命名策略,重名后加1,如果不加dfp重名将覆盖
DefaultFileRenamePolicy dfp = new DefaultFileRenamePolicy();
//response的编码为"UTF-8",同时采⽤缺省的⽂件名冲突解决策略,实现上传,如果不加dfp重名将覆盖MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8",dfp);
//MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8");
//输出反馈信息
Enumeration files = FileNames();
while (files.hasMoreElements()) {
String name = (Element();
File f = File(name);
if(f!=null){
String fileName = FilesystemName(name);
//获取上传⽂件的扩展名
String extName=fileName.substring(fileName.lastIndexOf(".")+1);
//⽂件全路径
String lastFileName= saveDirectory+"\\" + fileName;
//获取需要转换的⽂件名,将路径名中的'\'替换为'/'
String converfilename = placeAll("\\\\", "/")+"/"+fileName;
System.out.println(converfilename);
//调⽤转换类DocConverter,并将需要转换的⽂件传递给该类的构造⽅法
DocConverter d = new DocConverter(converfilename);
//调⽤conver⽅法开始转换,先执⾏doc2pdf()将office⽂件转换为pdf;再执⾏pdf2swf()将pdf转换为swf;
//调⽤getswfPath()⽅法,打印转换后的swf⽂件路径
System.out.swfPath());
//⽣成swf相对路径,以便传递给flexpaper播放器
String swfpath = "upload"+d.getswfPath().swfPath().lastIndexOf("/"));
System.out.println(swfpath);
//将相对路径放⼊sessio中保存
session.setAttribute("swfpath", swfpath);
out.println("上传的⽂件:"+lastFileName);
out.println("⽂件类型"+extName);
out.println("<hr>");
}
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"> <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}
a {color:#CE4614;}
#msg-box {color: #CE4614; font-size:0.9em;text-align:center;}
#msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}
#msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}
#msg-box .nav {margin-top:20px;}
</style>
</head>
<body>
<div>
<form name="viewForm" id="form_swf" action="documentView.jsp" method="POST">
<input type='submit' value='预览' class='BUTTON SUBMIT'/>
</form>
</div>
</body>
</html>
documentView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String Attribute("swfpath").toString();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/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 >
<a id="viewerPlaceHolder" ></a>
<script type="text/javascript">
var fp = new FlexPaperViewer(
'FlexPaperViewer',
'viewerPlaceHolder', { config : {
SwfFile : escape('<%=swfFilePath%>'),
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 : 'SinglePage',
ViewModeToolsVisible : true,
ZoomToolsVisible : true,
NavToolsVisible : true,
CursorToolsVisible : true,
SearchToolsVisible : true,
localeChain: 'en_US'
}});
</script>
</div>
</body>
</html>
转换类:
DocConverter.java
package filetest;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.tion.OpenOfficeConnection; import com.artofsolving.tion.SocketOpenOfficeConnection; import com.artofsolving.verter.OpenOfficeDocumentConverter; /**
* doc docx格式转换
*/
public class DocConverter {
private static final int environment = 1;// 环境 1:windows 2:linux
private String fileString;// (只涉及pdf2swf路径问题)
private String outputPath = "";// 输⼊路径,如果不设置就输出在默认的位置
private String fileName;
private File pdfFile;
private File swfFile;
private File docFile;
public DocConverter(String fileString) {
ini(fileString);
}
/**
* 重新设置file
*
* @param fileString
*/
public void setFile(String fileString) {
ini(fileString);
}
/**
* 初始化
*
* @param fileString
*/
private void ini(String fileString) {
this.fileString = fileString;
fileName = fileString.substring(0, fileString.lastIndexOf("."));
docFile = new File(fileString);
pdfFile = new File(fileName + ".pdf");
swfFile = new File(fileName + ".swf");
}
/**
* 转为PDF
*
* @param file
*/
private void doc2pdf() throws Exception {
if (ists()) {
if (!ists()) {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
try {
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
// close the connection
connection.disconnect();
System.out.println("****pdf转换成功,PDF输出:" + Path()+ "****");
} catch (java.ConnectException e) {
e.printStackTrace();
System.out.println("****swf转换器异常,openoffice服务未启动!****");
throw e;
} catch (com.artofsolving.tion.OpenOfficeException e) {
e.printStackTrace();
System.out.println("****swf转换器异常,读取转换⽂件失败****");
throw e;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
} else {
System.out.println("****已经转换为pdf,不需要再进⾏转化****");
}
} else {
System.out.println("****swf转换器异常,需要转换的⽂档不存在,⽆法转换****");
}
}
/**
* 转换成 swf
*/
@SuppressWarnings("unused")
private void pdf2swf() throws Exception {
Runtime r = Runtime();
if (!ists()) {
if (ists()) {
if (environment == 1) {// windows环境处理
try {
Process p = r.exec("D:/ "+ Path() + " -o "+ Path() + " -T 9");
//Process p=new Process();
System.out.print(InputStream()));
System.out.print(InputStream()));
+ Path() + "****");
if (ists()) {
pdfFile.delete();
}
} catch (IOException e) {
e.printStackTrace();
throw e;
}
} else if (environment == 2) {// linux环境处理
try {
Process p = r.exec("pdf2swf " + Path()
+ " -o " + Path() + " -T 9");
System.out.print(InputStream()));
+ Path() + "****");
if (ists()) {
pdfFile.delete();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
} else {
System.out.println("****pdf不存在,⽆法转换****");
}
} else {
System.out.println("****swf已经存在不需要转换****");
}
}
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while ((ptr = in.read()) != -1) {
buffer.append((char) ptr);
}
String();
}
/**
* 转换主⽅法
*/
@SuppressWarnings("unused")
public boolean conver() {
if (ists()) {
System.out.println("****swf转换器开始⼯作,该⽂件已经转换为swf****");
return true;
}
if (environment == 1) {
System.out.println("****swf转换器开始⼯作,当前设置运⾏环境windows****");
} else {
System.out.println("****swf转换器开始⼯作,当前设置运⾏环境linux****");
}
try {
doc2pdf();
pdf2swf();
} catch (Exception e) {
e.printStackTrace();
return false;
}
if (ists()) {
return true;
} else {
return false;
}
}
/**
* 返回⽂件路径
*
* @param s
*/
public String getswfPath() {
if (ists()) {
String tempString = Path();
tempString = placeAll("\\\\", "/");
return tempString;
} else {
return "";
}
}
/**
* 设置输出路径
*/
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
if (!outputPath.equals("")) {
String realName = fileName.substring(fileName.lastIndexOf("/"),
fileName.lastIndexOf("."));
if (outputPath.charAt(outputPath.length()) == '/') {
swfFile = new File(outputPath + realName + ".swf");
} else {
swfFile = new File(outputPath + realName + ".swf");
}
}
}
}
然后运⾏。
中间遇到的问题,存放上传的upload⽂件夹要创建。
存放pdf2swf的位置的代码有问题,不知道为什么我第⼀次运⾏失败后,修改为正确地址,然后重启重写了很多次还是报错地址错误,最后将推荐哦那个样的代码放到新的项⽬⾥却可以正常运⾏不报错。
运⾏结果:
⼆、利⽤jodconverter(基于OpenOffice服务)将⽂件转化为html格式或者pdf格式(不成熟):
package org.pan.poi.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.ConnectException;
SimpleDateFormat;
import java.util.Date;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.tion.OpenOfficeConnection;
import com.artofsolving.tion.SocketOpenOfficeConnection;
import com.artofsolving.verter.OpenOfficeDocumentConverter;
/**
* @包名 org.pan.poi.poi
* @创建⼈蒋⽂章
* @⽇期 2018/4/23 0023
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论