最詳細(xì)的文件在線預(yù)覽(openoffice+swftools+flexpaper)
1.概述
主要原理
1.通過(guò)第三方工具openoffice,將word、excel、ppt、txt等文件轉(zhuǎn)換為pdf文件
2.通過(guò)swfTools將pdf文件轉(zhuǎn)換成swf格式的文件
3.通過(guò)FlexPaper文檔組件在頁(yè)面上進(jìn)行展示
2.安裝包下載
1.openoffice是Apache下的一個(gè)開(kāi)放免費(fèi)的文字處理軟件
下載版本:4.1.0
下載地址:http://www.openoffice.org/zh-cn/download/
2.SWFTools是一組用來(lái)處理Flash的swf文件的工具包,我們使用它將pdf文件轉(zhuǎn)成swf文件!
下載版本:swftools-2013-04-09-1007
下載地址:http://www.swftools.org/download.html
3.FlexPaper是一個(gè)開(kāi)源輕量級(jí)的在瀏覽器上顯示各種文檔的組件
下載地址:FlexPaper官網(wǎng)下載
4.JODConverter一個(gè)Java的OpenDocument文件轉(zhuǎn)換器,在此我們只用到它的jar包
下載地址:JODCConverter下載
3.安裝文件
1.將所下載的文件(JODConverter除外)進(jìn)行安裝,盤符可隨自己設(shè)定!需要注意的是在openoffice安裝完成后,當(dāng)我們使用它時(shí),需將它的服務(wù)打開(kāi)。在次我們需要以命令的方式打開(kāi):
打開(kāi)dos窗口,進(jìn)入openoffice安裝盤符,輸入以下代碼來(lái)啟動(dòng)服務(wù):
soffice-headless -accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard
注意最后一個(gè)命令前邊的‘—’,可不要寫錯(cuò)!服務(wù)起不來(lái),項(xiàng)目可是繼續(xù)不下去的哦.
官網(wǎng)啟動(dòng)服務(wù)截圖如下:
本地截圖:
3.開(kāi)發(fā)過(guò)程
1.新建項(xiàng)目,將flexpaper文件中的js文件夾(包含了flexpaper_handlers.js,flexpaper.js,jquery.extensions.min.js, jquery.min.js, three.min.js這五個(gè)js文件主要是預(yù)覽swf文件的插件)拷貝至網(wǎng)站根目錄下的js文件夾;把locale文件夾拷貝到根目錄下,把css文件夾拷貝到根目錄下,將FlexPaperViewer.swf拷貝至網(wǎng)站根目錄下(該文件主要是用在網(wǎng)頁(yè)中播放swf文件的播放器),目錄結(jié)構(gòu)如下圖:
注:jar包去下載的文件的lib目錄下找. DocConverter類方法 pdf2swf()中pdf2swf命令的路徑要根據(jù)實(shí)際值配置。
2.創(chuàng)建fileUpload.jsp
<%@ pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>文檔在線預(yù)覽系統(tǒng)</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>
<divid="msg-box">
<formname="form1" method="post"enctype="multipart/form-data"action="docUploadConvertAction.jsp">
<divclass="title">
請(qǐng)上傳要處理的文件,過(guò)程可能需要幾分鐘,請(qǐng)稍候片刻。
</div>
<p>
<inputname="file1"type="file">
</p>
<p>
<inputtype="submit"name="Submit"value="上傳">
</p>
</form>
</div>
</body>
</html>
3.創(chuàng)建轉(zhuǎn)換頁(yè)docUploadConvertAction.jsp
<%@page language="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<%@pageimport="java.io.*"%>
<%@pageimport="java.util.Enumeration"%>
<%@pageimport="com.oreilly.servlet.MultipartRequest"%>
<%@pageimport="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@pageimport="com.cectsims.util.DocConverter"%>
<%
//文件上傳采用cos組件上傳,可更換為commons-fileupload上傳,文件上傳后,保存在upload文件夾
//獲取文件上傳路徑
String saveDirectory=application.getRealPath("/")+"upload";
//String saveDirectory="D:\\upload";
//打印上傳路徑信息
System.out.println(saveDirectory);
//每個(gè)文件最大50m
int maxPostSize = 50 * 1024 * 1024;
//采用cos缺省的命名策略,重名后加1,2,3...如果不加dfp重名將覆蓋
DefaultFileRenamePolicy dfp =new DefaultFileRenamePolicy();
//response的編碼為"UTF-8",同時(shí)采用缺省的文件名沖突解決策略,實(shí)現(xiàn)上傳,如果不加dfp重名將覆蓋
MultipartRequest multi = new MultipartRequest(request,saveDirectory, maxPostSize,"UTF-8",dfp);
//MultipartRequest multi = newMultipartRequest(request, saveDirectory, maxPostSize,"UTF-8");
//輸出反饋信息
Enumeration files =multi.getFileNames();
while (files.hasMoreElements()) {
String name =(String)files.nextElement();
File f =multi.getFile(name);
if(f!=null){
String fileName =multi.getFilesystemName(name);
//獲取上傳文件的擴(kuò)展名
StringextName=fileName.substring(fileName.lastIndexOf(".")+1);
//文件全路徑
String lastFileName=saveDirectory+"\\" + fileName;
//獲取需要轉(zhuǎn)換的文件名,將路徑名中的'\'替換為'/'
String converfilename =saveDirectory.replaceAll("\\\\","/")+"/"+fileName;
System.out.println(converfilename);
//調(diào)用轉(zhuǎn)換類DocConverter,并將需要轉(zhuǎn)換的文件傳遞給該類的構(gòu)造方法
DocConverter d = new DocConverter(converfilename);
//調(diào)用conver方法開(kāi)始轉(zhuǎn)換,先執(zhí)行doc2pdf()將office文件轉(zhuǎn)換為pdf;再執(zhí)行pdf2swf()將pdf轉(zhuǎn)換為swf;
d.conver();
//調(diào)用getswfPath()方法,打印轉(zhuǎn)換后的swf文件路徑
System.out.println(d.getswfPath());
//生成swf相對(duì)路徑,以便傳遞給flexpaper播放器
String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().lastIndexOf("/"));
System.out.println(swfpath);
//將相對(duì)路徑放入sessio中保存
session.setAttribute("swfpath", swfpath);
out.println("上傳的文件:"+lastFileName);
out.println("文件類型"+extName);
out.println("<hr>");
}
}
%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-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>
<formname="viewForm"id="form_swf"action="documentView.jsp"method="POST">
<inputtype='submit'value='預(yù)覽'class='BUTTON SUBMIT'/>
</form>
</div>
</body>
</html>
4.創(chuàng)建查看頁(yè)documentView.jsp
<%@page language="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<!doctypehtml>
<html>
<head>
<title>FlexPaper AdaptiveUI</title>
<metahttp-equiv="Content-Type"content="text/html; charset=utf-8" />
<metacontent="IE=Edge"http-equiv="X-UA-Compatible"></meta>
<metaname="viewport"content="initial-scale=1,user-scalable=no,maximum-scale=1,width=device-width"/>
<styletype="text/css"media="screen">
html,body{height:100%; }
body {margin:0;padding:0;overflow:auto; }
#flashContent {display:none; }
</style>
<linkrel="stylesheet"type="text/css"href="css/flexpaper.css"/>
<scripttype="text/javascript"src="js/jquery.min.js"></script>
<scripttype="text/javascript"src="js/jquery.extensions.min.js"></script>
<!--[ifgte IE 10 | !IE]><!-->
<scripttype="text/javascript"src="js/three.min.js"></script>
<!--<![endif]-->
<scripttype="text/javascript"src="js/flexpaper.js"></script>
<scripttype="text/javascript"src="js/flexpaper_handlers.js"></script>
</head>
<body>
<%
String swfpath =(String)session.getAttribute("swfpath");
%>
<divid="documentViewer"class="flexpaper_viewer"style="position:absolute;left:10px;top:10px;"></div>
<scripttype="text/javascript">
var startDocument ="Paper";
$('#documentViewer').FlexPaperViewer(
{ config : {
//傳入的swfpath路徑必須是相對(duì)路徑,如果是絕對(duì)路徑,可以建立虛擬目錄,在TOMCAT中建虛擬目錄,要在server.xml的host中添加context,如:
//<host><ContextcrossContext="true" docBase="C:/Users/dimeng/fileStore"path="/fileStore" reloadable="false"/></host>
//C:/Users/dimeng/fileStore是我文件的根目錄 /fileStore訪問(wèn)文件的虛擬路徑
//如:通過(guò)/fileStore/10/2015/9/22/11.pdf訪問(wèn)C:/Users/dimeng/fileStore/10/2015/9/22/11.pdf
SWFFile :escape('<%=swfpath%>'),
Scale : 0.6,
ZoomTransition :'easeOut',
ZoomTime : 0.5,
ZoomInterval : 0.1,
FitPageOnLoad : true,
FitWidthOnLoad :false,
FullScreenAsMaxWindow :false,
ProgressiveLoading :false,
MinZoomSize : 0.2,
MaxZoomSize : 5,
SearchMatchAll :false,
InitViewMode : 'TwoPage',//默認(rèn)雙頁(yè)
//InitViewMode : 'Portrait',//單頁(yè)
RenderingOrder :'flash,html',
StartAtPage : '',
EnableWebGL : true,
ViewModeToolsVisible:true,
ZoomToolsVisible :true,
NavToolsVisible :true,
CursorToolsVisible :true,
SearchToolsVisible :true,
WMode : 'transparent',
localeChain: 'zh_CN'
}}
);
</script>
</body>
</html>
5.創(chuàng)建轉(zhuǎn)換類DocConverter.java
package com.cectsims.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
importcom.artofsolving.jodconverter.openoffice.connection.OpenOfficeException;
importcom.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
/**
* doc docx格式轉(zhuǎn)換
*/
publicclass DocConverter {
privatestaticfinalintenvironment = 1;// 環(huán)境 1:windows 2:linux
private StringfileString;// (只涉及pdf2swf路徑問(wèn)題)
private StringoutputPath ="";//輸入路徑,如果不設(shè)置就輸出在默認(rèn)的位置
private StringfileName;
private FilepdfFile;
private FileswfFile;
private FiledocFile;
public DocConverter(StringfileString) {
ini(fileString);
}
/**
* 重新設(shè)置file
*
* @param fileString
*/
publicvoid setFile(StringfileString) {
ini(fileString);
}
/**
* 初始化
*
* @param fileString
*/
privatevoid ini(StringfileString) {
this.fileString =fileString;
fileName =fileString.substring(0,fileString.lastIndexOf("."));
docFile =new File(fileString);
pdfFile =new File(fileName +".pdf");
swfFile =new File(fileName +".swf");
}
/**
* 轉(zhuǎn)為PDF
*
* @param file
*/
privatevoid doc2pdf()throws Exception {
if (docFile.exists()) {
if (!pdfFile.exists()) {
OpenOfficeConnectionconnection =newSocketOpenOfficeConnection(8100);
try {
connection.connect();
DocumentConverterconverter = new OpenOfficeDocumentConverter(connection);
converter.convert(docFile,pdfFile);
// close the connection
connection.disconnect();
System.out.println("****pdf轉(zhuǎn)換成功,PDF輸出:" + pdfFile.getPath()+"****");
} catch (java.net.ConnectExceptione) {
e.printStackTrace();
System.out.println("****swf轉(zhuǎn)換器異常,openoffice服務(wù)未啟動(dòng)!****");
throwe;
} catch (OpenOfficeExceptione) {
e.printStackTrace();
System.out.println("****swf轉(zhuǎn)換器異常,讀取轉(zhuǎn)換文件失敗****");
throwe;
} catch (Exceptione) {
e.printStackTrace();
throwe;
}
} else {
System.out.println("****已經(jīng)轉(zhuǎn)換為pdf,不需要再進(jìn)行轉(zhuǎn)化****");
}
} else {
System.out.println("****swf轉(zhuǎn)換器異常,需要轉(zhuǎn)換的文檔不存在,無(wú)法轉(zhuǎn)換****");
}
}
/**
* 轉(zhuǎn)換成 swf
*/
@SuppressWarnings("unused")
privatevoid pdf2swf()throws Exception {
Runtime r = Runtime.getRuntime();
if (!swfFile.exists()) {
if (pdfFile.exists()) {
if (environment == 1) {// windows環(huán)境處理
try {
Process p = r.exec("D:/install/swftool/pdf2swf.exe"+pdfFile.getPath() +" -o "+ swfFile.getPath() + " -f -T 9 ");
//Process p =r.exec("D:\\install\\swftool\\pdf2swf.exe "+"D:\\upload\\33.pdf" + " -o "+ "D:\\upload\\33.swf"+ " -f -T 9 ");
loadStream(p.getInputStream());
//System.err.print(loadStream(p.getErrorStream()));
System.out.println("****swf轉(zhuǎn)換成功,文件輸出:"
+ swfFile.getPath() +"****");
/* if (pdfFile.exists()){
pdfFile.delete();
} */
} catch (IOExceptione) {
e.printStackTrace();
throwe;
}
} elseif (environment == 2) {// linux環(huán)境處理
try {
Process p = r.exec("pdf2swf " +pdfFile.getPath()
+ " -o " + swfFile.getPath() +" -f -T 9 ");
loadStream(p.getInputStream());
//System.err.print(loadStream(p.getErrorStream()));
System.out.println("****swf轉(zhuǎn)換成功,文件輸出:"
+ swfFile.getPath() +"****");
/* if(pdfFile.exists()) {
pdfFile.delete();
} */
} catch (Exceptione) {
e.printStackTrace();
throwe;
}
}
} else {
System.out.println("****pdf不存在,無(wú)法轉(zhuǎn)換****");
}
} else {
System.out.println("****swf已經(jīng)存在不需要轉(zhuǎn)換****");
}
}
static String loadStream(InputStreamin) throws IOException {
intptr = 0;
in =new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while ((ptr =in.read()) != -1) {
buffer.append((char)ptr);
}
returnbuffer.toString();
}
/**
* 轉(zhuǎn)換主方法
*/
@SuppressWarnings("unused")
publicboolean conver() {
if (swfFile.exists()) {
System.out.println("****swf轉(zhuǎn)換器開(kāi)始工作,該文件已經(jīng)轉(zhuǎn)換為swf****");
returntrue;
}
if (environment == 1) {
System.out.println("****swf轉(zhuǎn)換器開(kāi)始工作,當(dāng)前設(shè)置運(yùn)行環(huán)境windows****");
} else {
System.out.println("****swf轉(zhuǎn)換器開(kāi)始工作,當(dāng)前設(shè)置運(yùn)行環(huán)境linux****");
}
try {
doc2pdf();
pdf2swf();
} catch (Exceptione) {
e.printStackTrace();
returnfalse;
}
if (swfFile.exists()) {
returntrue;
} else {
returnfalse;
}
}
/**
* 返回文件路徑
*
* @param s
*/
public String getswfPath() {
if (swfFile.exists()) {
String tempString = swfFile.getPath();
tempString =tempString.replaceAll("\\\\","/");
returntempString;
} else {
return"";
}
}
/**
* 設(shè)置輸出路徑
*/
publicvoid setOutputPath(StringoutputPath) {
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");
}
}
}
publicstaticvoid main(String[]args) {
DocConverterd =new DocConverter("D:\\upload\\33.pdf");
try {
d.pdf2swf();
} catch (Exceptione) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6.部署發(fā)布
啟動(dòng)tomcat,部署當(dāng)前web應(yīng)用
地址欄輸入http://localhost:8080/ctcesims/documentUpload.jsp如下圖:
單擊選擇文件,選擇您要上傳的文檔,然后單擊上傳,處理完成后,打印如下信息,如下圖所示:
單擊預(yù)覽按鈕,就會(huì)生成預(yù)覽界面,如下圖:
4.常見(jiàn)問(wèn)題
若出現(xiàn)swf無(wú)法預(yù)覽,請(qǐng)?jiān)L問(wèn)
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065
將生成swf的文件夾設(shè)置為信任文件位置。
在TOMCAT中建虛擬目錄,要在server.xml的host中添加context,如:
<host><Context crossContext="true"docBase="C:/Users/dimeng/fileStore" path="/fileStore"reloadable="false"/></host>
C:/Users/dimeng/fileStore是我文件的根目錄 /fileStore訪問(wèn)文件的虛擬路徑
如:通過(guò)/fileStore/10/2015/9/22/11.pdf訪問(wèn)C:/Users/dimeng/fileStore/10/2015/9/22/11.pdf
聯(lián)系客服