微信或手机浏览器在线显示office文件(已测试ios、android)

互联网 17-1-17
最近开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,但是ios版没有问题,原因是ios版使用的是safari浏览器 支持文档直接打开,但是andriod版使用的是腾讯浏览器x5内核,不知道什么原因不支持,可能是集成出现的问题,这里提供解决方法,这种方法也同样适用手机浏览器或者安卓开发。通过此方法可以在微信上开发自己的第三方应用,或者解决自己的项目问题,解决方法及核心代码如下: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文件,并读取内容-------------------------

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;      }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多微信或手机浏览器在线显示office文件(已测试ios、android)相关文章请关注PHP中文网!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法

相关资讯