zoukankan      html  css  js  c++  java
  • 在线显示office文件

    微信或手机浏览器在线显示office文件

    1、判断浏览器类型

    HttpServletRequest req = ServletActionContext.getRequest();
    String userAgent=req.getHeader("User-Agent");//里面包含了设备类型

    2、IOS版直接使用流输出

    Andriod版利用openoffice+jod转换成html,然后对html内容重新编辑,文件中有图片的
    将路径改为网络路径或者采用流输出(改成网络路径注意特殊符号,如+号会变成空格)

    /** 
         * 从OA上抓取文件 
         * author  牟云飞 
         * company 海颐软件股份有限公司 
         * tel     15562579597 
         * qq      1147417467 
         * team    客服产品中心/于洋 
         * @return 
         */  
        public String getFileFromOa(){    
              
            HttpServletRequest req = ServletActionContext.getRequest();  
            String userAgent=req.getHeader("User-Agent");//里面包含了设备类型  
            if(-1!=userAgent.indexOf("iPhone")){  
                //-----------------//  
                //此方法需要浏览器自己能够打开,ios可以但是微信andriod版内置浏览器不支持  
                //-----------------//  
                //如果是苹果手机  
                //获得文件地址  
                 String fileUrl = ServletActionContext.getRequest().getParameter
    
    ("fileUrl");  
                 fileUrl.replaceAll("%20", "\+");//转换加号  
                 String strURL = MessageUtil.oaUrl+fileUrl;  
                 String fileType=strURL.substring(strURL.lastIndexOf(".")+1,strURL.length
    
    ());  
                //获得图片的数据流  
                try {  
                    URL oaUrl = new URL(strURL);  
                    HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection
    
    ();  
                    InputStream in = httpConn.getInputStream();  
                    //获取输出流  
                    HttpServletResponse response = ServletActionContext.getResponse();  
                    req.setCharacterEncoding("UTF-8");  
                    response.setCharacterEncoding("UTF-8");  
                    String name=fileUrl.substring(fileUrl.lastIndexOf("/")+1, 
    
    fileUrl.length());  
          
                    response.setHeader("Content-Disposition",    
                                           "attachment;filename=" +    
                                                   new String( (name ).getBytes(),    
                                                            "iso-8859-1"));  
                    if("doc".equals(fileType)||"docx".equals(fileType)){  
                        response.setContentType("application/msword");  
                    }else if("xls".equals(fileType)||"xlsx".equals(fileType)){  
                        response.setContentType("application/msexcel");   
                    }else{  
                        response.setContentType("application/"+fileType);  
                    }  
                    OutputStream out = response.getOutputStream();  
                    //输出图片信息  
                    byte[] bytes = new byte[1024];    
                    int cnt=0;    
                    while ((cnt=in.read(bytes,0,bytes.length)) != -1) {    
                        out.write(bytes, 0, cnt);    
                    }    
                    out.flush();  
                    out.close();  
                    in.close();  
          
                } catch (MalformedURLException e) {  
                    e.printStackTrace();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                return null;  
            }else{  
                //如果非苹果手机,自己处理文档  
                  
                //获得文件地址  
                String fileUrl = ServletActionContext.getRequest().getParameter
    
    ("fileUrl");  
                              
                fileUrl.replaceAll("%2B", "\+");//转换加号  
                String strURL = MessageUtil.oaUrl+fileUrl;  
                //在本地存放OA文件,然后转换成html,再对文档中的图片路径进行修改,最后输出
    
    到页面  
                try {  
                    URL oaUrl = new URL(strURL);  
                    HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection
    
    ();  
                    InputStream in = httpConn.getInputStream();  
                    //获取输出流  
                    HttpServletResponse response = ServletActionContext.getResponse();  
                    req.setCharacterEncoding("UTF-8");  
                    response.setCharacterEncoding("UTF-8");  
                    String name=fileUrl.substring(fileUrl.lastIndexOf("/")+1, 
    
    fileUrl.length());  
                      
                    //首先判断本地是否存在  
                    String path=req.getRealPath("");  
                    path=path.substring(0, path.lastIndexOf("\")+1);  
                    File htmlFile=new File(path +  "OaFileToHtml\"+name+".html");  
                    if(!htmlFile.exists()){  
                        //判断文件夹是否存在,创建文件夹  
                        String oaFilePath=path + "OaFile";//存放OA文档的文件夹路径;  
                        File oaFiles=new File(oaFilePath);  
                        if(!oaFiles.exists()){  
                            //如果文件夹不存在创建文件夹  
                            oaFiles.mkdirs();  
                        }  
                        //将OA消息存入本地  
                        File oafile=new File(oaFiles+ File.separator +name);  
                        OutputStream out = new FileOutputStream(oafile);  
                        //输出图片信息  
                        byte[] bytes = new byte[1024];    
                        int cnt=0;    
                        while ((cnt=in.read(bytes,0,bytes.length)) != -1) {    
                            out.write(bytes, 0, cnt);    
                        }    
                        out.flush();  
                        out.close();  
                        in.close();  
                        //转换成html  
                        String htmlFilePath =path + "OaFileToHtml";//OA文件转成html的位置  
                        String htmlcontext=ConvertFileToHtml.toHtmlString(oafile, 
    
    htmlFilePath);  
                        req.setAttribute("htmlcontext", htmlcontext);  
                    }else{  
                        //已经存在转换成功的文档  
                        StringBuffer htmlSb = new StringBuffer();  
                        try {  
                            BufferedReader br = new BufferedReader(new InputStreamReader
    
    (new FileInputStream(htmlFile),Charset.forName("gb2312")));  
                            while (br.ready()) {  
                                htmlSb.append(br.readLine());  
                            }  
                            br.close();  
                        } catch (FileNotFoundException e) {  
                            e.printStackTrace();  
                        } catch (IOException e) {  
                            e.printStackTrace();  
                        }  
                        // HTML文件字符串  
                        String htmlStr = htmlSb.toString();  
                        //System.out.println("htmlStr=" + htmlStr);  
                        // 返回经过清洁的html文本  
                        req.setAttribute("htmlcontext", ConvertFileToHtml.clearFormat
    
    (htmlStr, ""));  
                    }  
                      
                } catch (MalformedURLException e) {  
                    e.printStackTrace();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                return "lookfile";  
            }  
              
        }  
    

      

    -------------------将word转换成html文件,并读取内容-------------------------

    此类借鉴原地址并修改http://jadethao.iteye.com/blog/1817738
    
     
    package com.haiyisoft.wx.util;  
      
    import java.io.BufferedReader;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.net.ConnectException;  
    import java.nio.charset.Charset;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
      
    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; 
    
     
      
    /** 
     * * 端口启动命令: 
     * soffice -headless -accept="socket,port=8100;urp; 
     * 
     *  
     * author  牟云飞 
     * company 海颐软件股份有限公司 
     * tel     15562579597 
     * qq      1147417467 
     * team    客服产品中心/于洋 
     *  
     */  
    public class ConvertFileToHtml {  
        /** 
         * 将word文档转换成html文档 
         * @param docFile   需要转换的word文档 
         * @param filepath  转换之后html的存放路径 
         * @return 转换之后的html文件 
         */  
        public static File convert(File docFile, String filepath) {  
      
            // 创建保存html的文件  
            String fileName=docFile.getName();  
            File htmlFile = new File(filepath + "/" + fileName + ".html");  
            // 创建Openoffice连接  
            OpenOfficeConnection con = new SocketOpenOfficeConnection(8100);  
            try {  
                // 连接  
                con.connect();  
            } catch (ConnectException e) {  
                System.out.println("获取OpenOffice连接失败...");  
                e.printStackTrace();  
            }  
              
            // 创建转换器  
            DocumentConverter converter = new OpenOfficeDocumentConverter(con);  
            // 转换文档问html  
            converter.convert(docFile, htmlFile);  
            // 关闭openoffice连接  
            con.disconnect();  
            return htmlFile;  
        }  
      
        /** 
         *  
         * 将word转换成html文件,并且获取html文件代码。 
         * @param docFile  需要转换的文档 
         * @param filepath  文档中图片的保存位置 
         * @return 转换成功的html代码 
         */  
        public static String toHtmlString(File docFile, String filepath) {  
            // 转换word文档  
            File htmlFile = convert(docFile, filepath);  
            System.out.println(htmlFile.getAbsolutePath());  
            // 获取html文件流  
            StringBuffer htmlSb = new StringBuffer();  
            try {  
                BufferedReader br = new BufferedReader(new InputStreamReader(new 
    
    FileInputStream(htmlFile),Charset.forName("gb2312")));  
                while (br.ready()) {  
                    htmlSb.append(br.readLine());  
                }  
                br.close();  
                // 删除临时文件  
                //htmlFile.delete();  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            // HTML文件字符串  
            String htmlStr = htmlSb.toString();  
            //System.out.println("htmlStr=" + htmlStr);  
            // 返回经过清洁的html文本  
            return clearFormat(htmlStr, filepath);  
        }  
      
        /** 
         *  
         * 清除一些不需要的html标记 
        */  
      
        public static String clearFormat(String htmlStr, String docImgPath) {  
      
            // 获取body内容的正则  
            String bodyReg = "<BODY .*</BODY>";  
            Pattern bodyPattern = Pattern.compile(bodyReg);  
            Matcher bodyMatcher = bodyPattern.matcher(htmlStr);  
            if (bodyMatcher.find()) {  
                // 获取BODY内容,并转化BODY标签为DIV  
                htmlStr = bodyMatcher.group().replaceFirst("<BODY", "<DIV").replaceAll
    
    ("</BODY>", "</DIV>");  
            }  
      
            // 调整图片地址,这里将图片路径改为网络路径  
              
            htmlStr = htmlStr.replaceAll("<IMG SRC="../","<IMG SRC="" + 
    
    MessageUtil.webUrl+"/******.do?action=***);  
            //特殊处理一下+号,因为网络传输+会变成空格,用%2B替换+号  
            String temp1=htmlStr.substring(htmlStr.indexOf("action=***"), htmlStr.length
    
    ());  
            String temp2=temp1.substring(0,temp1.indexOf("."));  
            String temp3=temp2.replaceAll("\+", "%2B");  
            htmlStr=htmlStr.substring(0,htmlStr.indexOf
    
    ("action=***"))+temp3+temp1.substring(temp1.indexOf("."), temp1.length());  
              
            // 把<P></P>转换成</div></div>保留样式  
            // content = content.replaceAll("(<P)([^>]*>.*?)(<\/P>)",  
            // "<div$2</div>");  
            // 把<P></P>转换成</div></div>并删除样式  
            htmlStr = htmlStr.replaceAll("(<P)([^>]*)(>.*?)(<\/P>)", "<p$3</p>");  
            // 删除不需要的标签  
            htmlStr = htmlStr.replaceAll("<[/]?(font|FONT|span|SPAN|xml|XML|del|DEL|ins|
    
    INS|meta|META|[ovwxpOVWXP]:\w+)[^>]*?>","");  
            // 删除不需要的属性  
            htmlStr = htmlStr.replaceAll("<([^>]*)(?:lang|LANG|class|CLASS|style|STYLE|
    
    size|SIZE|face|FACE|[ovwxpOVWXP]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>","<
    
    $1$2>");  
      
            return htmlStr;  
      
        }  
    }  
    

      

     
  • 相关阅读:
    C# 检测dll的新版本号方法
    DataGridView 单击赋值
    一致性Hash算法
    .net Parallel并行使用注意事项
    析构函数和Dispose方法的区别
    查看SQLServer的最大连接数
    Hash算法-CityHash算法
    Hash算法
    Sunday算法--C#版
    KMP算法--C#版
  • 原文地址:https://www.cnblogs.com/fer-team/p/6394255.html
Copyright © 2011-2022 走看看