筆者最近在給客戶開發文檔管理系統時,客戶要求上傳到管理系統的文檔(包括ppt,word,excel,txt)只能預覽不允許下載。筆者想到了百度文庫和豆丁網,百度文庫和豆丁網的在線預覽都是利用flash來播放文檔的,在網上查閱了大量資料,終於實現了該項功能,現將自己的設計和實現整理如下。
1.先用openOffice把ppt、word、excel、txt類型的文檔轉換成pdf
2.用swftools將pdf轉換成swf,然後利用FlexPaper插件實現在線播放預覽。
二、具體實現
1.安裝必備工具組件
(1)安裝openoffice,openoffice是開源免費的文字處理軟件,它可以將office文檔轉成pdf文件(筆者安裝到D:\Program Files),openOffice下載地址http://www.openoffice.org/download/index.html
(2)安裝完openoffice後必須啓動其server,以命令行方式啓動openoffice server。進入cmd命令行提示符D:\Program Files\OpenOffice.org 3\program\
鍵入如下命令:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard
進入windows任務管理器查看有個進程soffice.bin,說明openoffice啓動成功!
(3)安裝swfTools(安裝到 D:\Program Files)swftools作用是將pdf轉換爲swf文件以便flexpaper播放。下載地址:http://www.swftools.org/download.html
(4)下載flexpaper,下載地址:http://flexpaper.devaldi.com/download/
筆者下載的是FlexPaper_1.5.1,下載後將其解壓備用。
(5)下載OpenDocument文檔轉換器 JODConverter,JODConverter是一個java的OpenDucument文件轉換器,可以進行許多文件格式的轉換,它利用OpenOffice來進行轉換工作,它能進行以下的轉換工作:
a.Microsoft Office格式轉換爲OpenDucument,以及OpenDucument轉換爲Microsoft Office
b.OpenDucument轉換爲PDF,Word、Excel、PowerPoint轉換爲PDF,RTF轉換爲PDF等。
下載地址:http://sourceforge.net/projects/jodconverter/files/
我們後面開發主要用它的jodconverter-2.2.2.jar包
2.軟件開發過程
(1)啓動Eclipse,新建web項目名稱爲ctcesims
(2)將上面第4步解壓的flexpaper文件中的js文件夾(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,這三個js文件主要是預覽swf文件的插件)拷貝至網站根目錄;將FlexPaperViewer.swf拷貝至網站根目錄下(該文件主要是用在網頁中播放swf文件的播放器),目錄結構如下圖
(3)創建documentUpload.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>
- <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>
- 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;
- import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
- import com.artofsolving.jodconverter.openoffice.converter.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 (docFile.exists()) {
- if (!pdfFile.exists()) {
- OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
- try {
- connection.connect();
- DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
- converter.convert(docFile, pdfFile);
- // close the connection
- connection.disconnect();
- System.out.println("****pdf轉換成功,PDF輸出:" + pdfFile.getPath()+ "****");
- } catch (java.net.ConnectException e) {
- e.printStackTrace();
- System.out.println("****swf轉換器異常,openoffice服務未啓動!****");
- throw e;
- } catch (com.artofsolving.jodconverter.openoffice.connection.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.getRuntime();
- if (!swfFile.exists()) {
- if (pdfFile.exists()) {
- if (environment == 1) {// windows環境處理
- try {
- Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
- System.out.print(loadStream(p.getInputStream()));
- System.err.print(loadStream(p.getErrorStream()));
- System.out.print(loadStream(p.getInputStream()));
- System.err.println("****swf轉換成功,文件輸出:"
- + swfFile.getPath() + "****");
- if (pdfFile.exists()) {
- pdfFile.delete();
- }
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- }
- } else if (environment == 2) {// linux環境處理
- try {
- Process p = r.exec("pdf2swf " + pdfFile.getPath()
- + " -o " + swfFile.getPath() + " -T 9");
- System.out.print(loadStream(p.getInputStream()));
- System.err.print(loadStream(p.getErrorStream()));
- System.err.println("****swf轉換成功,文件輸出:"
- + swfFile.getPath() + "****");
- if (pdfFile.exists()) {
- 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);
- }
- return buffer.toString();
- }
- /**
- * 轉換主方法
- */
- @SuppressWarnings("unused")
- public boolean conver() {
- if (swfFile.exists()) {
- 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 (swfFile.exists()) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 返回文件路徑
- *
- * @param s
- */
- public String getswfPath() {
- if (swfFile.exists()) {
- String tempString = swfFile.getPath();
- tempString = tempString.replaceAll("\\\\", "/");
- 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");
- }
- }
- }
- }
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@page import="java.io.*"%>
- <%@page import="java.util.Enumeration"%>
- <%@page import="com.oreilly.servlet.MultipartRequest"%>
- <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
- <%@page import="com.cectsims.util.DocConverter"%>
- <%
- //文件上傳採用cos組件上傳,可更換爲commons-fileupload上傳,文件上傳後,保存在upload文件夾
- //獲取文件上傳路徑
- String saveDirectory =application.getRealPath("/")+"upload";
- //打印上傳路徑信息
- System.out.println(saveDirectory);
- //每個文件最大50m
- int maxPostSize = 50 * 1024 * 1024 ;
- //採用cos缺省的命名策略,重名後加1,2,3...如果不加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 = multi.getFileNames();
- while (files.hasMoreElements()) {
- System.err.println("ccc");
- String name = (String)files.nextElement();
- File f = multi.getFile(name);
- if(f!=null){
- String fileName = multi.getFilesystemName(name);
- //獲取上傳文件的擴展名
- String extName=fileName.substring(fileName.lastIndexOf(".")+1);
- //文件全路徑
- String lastFileName= saveDirectory+"\\" + fileName;
- //獲取需要轉換的文件名,將路徑名中的'\'替換爲'/'
- String converfilename = saveDirectory.replaceAll("\\\\", "/")+"/"+fileName;
- System.out.println(converfilename);
- //調用轉換類DocConverter,並將需要轉換的文件傳遞給該類的構造方法
- DocConverter d = new DocConverter(converfilename);
- //調用conver方法開始轉換,先執行doc2pdf()將office文件轉換爲pdf;再執行pdf2swf()將pdf轉換爲swf;
- d.conver();
- //調用getswfPath()方法,打印轉換後的swf文件路徑
- System.out.println(d.getswfPath());
- //生成swf相對路徑,以便傳遞給flexpaper播放器
- String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().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" "http://www.w3.org/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="documnetView.jsp" method="POST">
- <input type='submit' value='預覽' class='BUTTON SUBMIT'/>
- </form>
- </div>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%
- String swfFilePath=session.getAttribute("swfpath").toString();
- %>
- <!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 : 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>
8.地址欄輸入http://localhost:8080/ctcesims/documentUpload.jsp 如下圖:
單擊選擇文件,選擇您要上傳的文檔,筆者選擇的是lunwen.doc文件,然後單擊上傳,處理完成後,打印如下信息,如下圖所示:
單擊預覽按鈕,就會生成預覽界面,如下圖:
9.若出現swf無法預覽,請訪問
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065將生成swf的文件夾設置爲信任文件位置。
由於時間倉促,以上只是簡單示例,很多情況還需要進一步考慮!
參考資料:
http://blog.csdn.net/iamduoluo/article/details/6727031
http://www.cnblogs.com/star-studio/archive/2011/12/09/2282411.html#2497889