java 實現word文檔在線預覽

1、準備工具javascript

1.經過第三方工具openoffice,將word、excel、ppt、txt等文件轉換爲pdf文件css

下載地址:http://www.openoffice.org/download/index.htmlhtml

下載後,解壓縮,安裝java

而後找到安裝目錄下的program 文件夾jquery

在目錄下運行linux

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

2.經過swfTools將pdf文件轉換成swf格式的文件web

下載地址:http://www.swftools.org/download.htmlwindows

3.經過FlexPaper文檔組件在頁面上進行展現session

將flexpaper文件中的js文件夾(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,這三個js文件主要是預覽swf文件的插件)拷貝至網站根目錄;將FlexPaperViewer.swf拷貝至網站根目錄下(該文件主要是用在網頁中播放swf文件的播放器app

4.JODConverter

<dependency>
            <groupId>com.artofsolving</groupId>
            <artifactId>jodconverter</artifactId>
            <version>2.2.1</version>
        </dependency>

fileUpload.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="../doctopdf/submit">
        <div class="title">  
            請上傳要處理的文件,過程可能須要幾分鐘,請稍候片刻。  
        </div>  
        <p>  
            <input name="file" type="file">
        </p>  
        <p>  
            <input type="submit" name="Submit" value="上傳">  
        </p>  
    </form >  
</div>  
</body>  
</html>  

上傳方法有2種

cos組建

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="com.oreilly.servlet.MultipartRequest"%>  
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>  
<%@page import="filetest.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="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 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>

普通上傳

docUploadConvertAction.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>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="../doctopdf/look" method="POST">
            <input type='submit' value='預覽' class='BUTTON SUBMIT'/>  
        </form>  
    </div>  
</body>  
</html>  

後臺方法:

controller:

 /**
     * 上傳文件
     */
    @RequestMapping("/submit")
    public ModelAndView upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
        if (file.isEmpty()) {
            throw new RRException("上傳文件不能爲空");
        }
        //上傳文件
        Map<String,Object> map = uService.upload(file,request);

        ModelAndView mav = new ModelAndView();
        mav.addObject("url",map.get("url"));
        mav.addObject("fileName",map.get("fileName"));
        mav.addObject("swfpath",map.get("swfpath"));
        mav.setViewName("doc/docUploadConvertAction.jsp");
        request.getSession().setAttribute("swfpath",map.get("swfpath"));
        return mav;
    }

serviceImpl

 @Override
    public String getPath() {
        String userId = ShiroUtils.getUserId();
        UserEntity sysUserEntity = userDao.queryObject(userId);
        String userNo = sysUserEntity.getLoginName();
        //文件路徑
        String path = userNo + "/" + DateUtils.format(new Date(), "yyyyMMdd");

        return path;
    }
    @Override
    public Map<String,Object> upload(MultipartFile file, HttpServletRequest request) throws Exception {
        String Name = file.getOriginalFilename();
        //獲取上傳文件的擴展名
        String extName=Name.substring(Name.lastIndexOf("."));
        String fileName = String.valueOf(new Date().getTime()/1000)+extName;
        String path = request.getSession().getServletContext().getRealPath("upload") +"/"+ this.getPath();
        File targetFile = new File(path, fileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        file.transferTo(targetFile);
        String filepath = String.valueOf(targetFile);
        String url = request.getRequestURL().toString().replace(request.getRequestURI(),"")+request.getContextPath()+"/upload/"+this.getPath()+"/"+fileName;
        int a = url.lastIndexOf(fileName);
        String b = url.substring(0,a-1);
        //調用轉換類DocConverter,並將須要轉換的文件傳遞給該類的構造方法
        DocConverter d = new DocConverter(filepath);
        //調用conver方法開始轉換,先執行doc2pdf()將office文件轉換爲pdf;再執行pdf2swf()將pdf轉換爲swf;
        d.conver();
        //調用getswfPath()方法,打印轉換後的swf文件路徑
        System.out.println(d.getswfPath());
        //生成swf相對路徑,以便傳遞給flexpaper播放器
        String swfpath = b+d.getswfPath().substring(d.getswfPath().lastIndexOf("/"));
        FileEntity fileEntity = new FileEntity();
        fileEntity.setId(Utils.uuid());
        fileEntity.setCreateTime(new Date());
        fileEntity.setCreateUser(ShiroUtils.getUserId());
        fileEntity.setFileName(fileName);
        fileEntity.setFileUrl(url);
        fileEntity.setStatus(0);
        fileDao.save(fileEntity);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("url",url);
        map.put("fileName",fileName);
        map.put("swfpath",swfpath);
        return map;
    }

documentView.jsp

<%@ 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="${webRoot}/statics/js/pdf/jquery.js"></script>
<script type="text/javascript" src="${webRoot}/statics/js/pdf/flexpaper_flash.js"></script>
<script type="text/javascript" src="${webRoot}/statics/js/pdf/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(     
                         '${webRoot}/statics/js/pdf/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>  

轉換類:

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.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:/pdf2swf/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");  
                        //Process p=new Process();
                        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");  
            }  
        }  
    }  
  
}  

運行

相關文章
相關標籤/搜索