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

最近开发微信企业号,发现微信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; } }

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

时间: 2024-08-24 21:45:57

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

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

最近开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,但是ios版没有问题,原因是ios版使用的是safari浏览器 支持文档直接打开,但是andriod版使用的是腾讯浏览器x5内核,不知道什么原因不支持,可能是集成出现的问题,这里提供解决方法,这种方法也同样适用手机浏览器或者安卓开发.通过此方法可以在微信上开发自己的第三方应用,或者解决自己的项目问题,解决方法及核心代码如下:1.判断浏览器类型HttpServletRequest req = ServletActionCo

电脑-网页加了一段53客服代码之后,网页在手机浏览器上显示会放的很大。

问题描述 网页加了一段53客服代码之后,网页在手机浏览器上显示会放的很大. 就是这段53客服代码 我把它加到网页的最底部,电脑上浏览网页是没有问题的,正常显示.但是在手机浏览器上看网页就被强制放大,而且不能把网页缩到最小(适合手机屏幕大小显示).请问怎么解决?跪求各位大神.

微信内置浏览器无法显示https的图片

问题描述 微信内置浏览器无法显示https的图片 现在有图片,路径是https的,在微信内置浏览器中打不开,在pc端能够正常显示,有知道答案的吗,谢谢! 解决方案 证书的问题,你可以架设代理转换下 http://www.zhihu.com/question/22238665

net 如何实现在线浏览office文件

问题描述 net如何实现在线浏览office文件 解决方案 解决方案二:直接用或者下载没.net什么事解决方案三:officewebapp解决方案四:把word转换html在程序上浏览

免流量惠生活360手机浏览器6.9.9.2评测

本文讲的是 :   免流量惠生活360手机浏览器6.9.9.2评测 , [IT168应用]从信息到服务.从兼容到云端,科技的发展使人们对于浏览器的诉求发生转移.如今,移动互联网使人们的生活方式发生着突飞猛进的变化,人们已经习惯了团购优惠,习惯了来自手机互联网的信息与服务,同时,也习惯了面对每月月底流量的不足.2015年5月,360突然宣布360手机浏览器开启免流量模式,这个"小改动解决大问题"的消息一出,在短短的两个月时间,360手机浏览器下载量屡创新高,360手机浏览器迅速的成为了关

如何实现移动端浏览器不显示 pc 端的广告_javascript技巧

前一段时间写了一篇博文, 关于微信内置浏览器不显示联盟广告 根据 window.navigator.userAgent 来判断当前浏览器是否是微信内置浏览器 window.navigator.userAgent=='micromessenger' 今天要分享的内容差不多,因为之前只考虑了微信浏览器的适配,回头在移动端浏览器打开站点,发现适配问题. 有的联盟会自动屏蔽移动端,但是有的联盟就不能屏蔽,所以只能手动去判断. 根据浏览器 userAgent 判断来源 安卓设备的的 userAgent 判

手机浏览器用户可视面积横评谁在浪费你的屏幕

飞象网讯(魏德龄/文)近期,飞象手机将针对手机浏览器进行多项指标的测试,本次专门针对用户在手机浏览器中的有效浏览范围进行了测试,测试结果显示,Skyfire与海豚浏览器的有效浏览面积最大,而Opera.UCWEB处于中游水平,360与QQ的手机浏览器的可视面积偏小. 参评浏览器:QQ浏览器.360浏览器.UCWEB V8.Opera Mobile.Skyfire.海豚浏览器. 测试方法为进入手机浏览器后,输入同样的网址,读取进入网页后,使用手指下滑,使拥有隐藏网址栏功能的手机浏览器达到最大用户可

《灌篮高手》经典重温 百度手机浏览器让你随心看

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 可爱.冲动的樱木花道,深沉.英俊的流川枫,木讷.彪悍的赤木刚宪--<灌篮高手>这部整整影响了一代人的动画片,最近因为HD重制版的开播,再次火爆起来.同时,也掀起了7080这代人对童年和青春的集体回忆热潮.百度手机浏览器(官方下载地址:http://wuxian.baidu.com /browser/)凭借着单手视频和信息前置等功能

手机浏览器安全性也开始逐渐被用户所重视

中国IT研究中心(CNIT-Research)近日发布了<2014年第3季度第三方手机浏览器市场监测报告>.报告显示,在2014年第3季度,选择使用第三方手机浏览器的用户占比已达到了65.7%.此外,环比2014年第2季度,各第三方手机浏览器的活跃用户市场渗透率均有所增长,其中UC浏览器以66.7%的活跃用户市场渗透率排名首位,QQ浏览器.百度浏览器.360手机浏览器则分别以42.5%.24.4%.23.1%的活跃用户市场渗透率分列二至四位.根据CNIT的监测报告,其中UC浏览器活跃用户市场渗