zoukankan      html  css  js  c++  java
  • 微信或手机浏览器在线显示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文件,并读取内容-------------------------

    此类借鉴原地址并改动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; } }


     

  • 相关阅读:
    木马后门入侵与RKHunter,ClamAV检测工具
    Jenkins环境搭建
    Mha-Atlas-MySQL高可用
    JAVA企业级应用服务器之TOMCAT实战
    Keepalived高可用集群
    scp ssh-key连接原理
    jumpserver跳板机搭建
    DNS域名解析服务器
    DHCP服务
    Keepalived高可用集群
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5207230.html
Copyright © 2011-2022 走看看