您的位置:首页 > 移动开发 > 微信开发

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

2016-02-22 15:17 645 查看
近期开发微信企业号,发现微信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文件,并读取内容-------------------------

此类借鉴原地址并改动/article/4125139.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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: