企业微信打开office文档

2019-04-11 18:16:09 weixin_42276004 阅读数 9197

微信公众号或者浏览器实现在线浏览pdf文件

实现在线浏览pdf文件方法

我们在日常的开发当中经常需要实现pdf文件的显示,最近做了一个在微信公众号中实现pdf浏览,因为微信浏览器是基于H5的,所以这个也支持别的浏览器。其实方法很简单,主要需要一个插件pdf.js。你可以直接去官网下载或者在GitHub上有很多还有模板。pdf.js 是一个主要用于HTML5 平台上在线阅读PDF文档的小插件,基于JavaScript技术编写而成,无需任何本地技术支持。
到官网下载 pdf.js 插件并解压 (地址: http://mozilla.github.io/pdf.js/ )

开发步骤:

下载之后直接放到你的项目中,放在js文件夹里面就行。这个里面需要你关注的文件主要是viewer.html、pdf.js和viewer.js。在web下面有一个compressed.tracemonkey-pldi-09.pdf文件,这个是用来测试的文件。现在运行你的程序可以直接打开viewer.html这个页面就会在线浏览pdf文件。
在这里插入图片描述
现在运行你的程序可以直接打开viewer.html这个页面就会在线浏览pdf文件。

在这里插入图片描述
这个是配置pdf文件的地方。
在这里插入图片描述
如果我们的pdf需要在本地获取或者是文件服务器获取,我们就将这里直接去空。
在这里插入图片描述
在viewer.js中,我们发现他可以通过file参数来指定pdf的路径。
在这里插入图片描述
这里我们可以直接跳转到viewer.html,通过window.location.href=“product-descritption-pdf.html?fileContent=”+fileContent; fileContent是你的pdf文件路径。如果是本地的你可以直接在把路径赋给fileContent=“C:\Users\Administrator\Desktop\allss\pdf01 \web\compressed.tracemonkey-pldi-09.pdf”。如果是从文件服务器获取的话,你先要从后台获取到文件服务器的pdf地址然后返给前端就行了。
在这里插入图片描述
最后,如果你要从本地或者是文件服务器获取pdf文件,可能会出现跨域问题。其实跨域问题很好解决。看我的另一篇博客:https://blog.csdn.net/weixin_42276004/article/details/89225757

2016-03-16 11:32:05 aeaiesb 阅读数 5294

你每天看多少次微信?有多少次是为了工作?

微信几乎是今天所有中国人的办公工具,从中小企业到大国企,甚至已经配备了 Skype、Sharepoint 之类办公工具的外企,都将越来越多的日常沟通、公告甚至文件传输放在微信上完成。

而现在的问题是,微信什么都有,而什么时候都得看,你也不知道是工作还是一个无关的推送,这让我们本来就很有限的时间更加零碎了。

最近浮出水面的企业微信,就是一个试图将你工作和生活分开的微信工具。《好奇心日报》拿到内测,我们使用这个工具工作了一天。

来看看未来用微信工作将会是什么样子。

用企业微信来工作是怎样的?

下载和登陆:不需要重新加同事为好友。

目前,“企业微信”还在内测,所以不能在 iPhone 或者 Android 应用商店下载。

如果你所在的公司已经在使用腾讯企业邮或微信企业号,就能向微信团队申请内测。

尽管企业微信还没有正式发布,但它已具备了 iOS、Android、Windows、Mac 多个平台。这和拖了近 3 年才推出 Windows 客户端的微信比就大为不同,而且 Mac 版企业微信现在还能读取历史消息,这跟 Mac 普通微信有着截然不同的区别。




获得短信邀请的管理员用户,根据链接开通帐号后,即可导入原本企业邮或微信企业号内已有的员工通讯录和组织架构关系。因此,新入职的员工就无需再一个个添加同事的联系方式了。

对于不在现有通讯录里的员工,则需要另外在后台录入手机,邀请加入。




被邀请的员工会在短信上收到企业微信的下载链接,应用下载安装之后之后,用微信账号,输入手机号就可以完成登陆。当然,这一过程也可以通过微信分享完成。员工注册后,只要由管理员确认通过即可。

沟通和聊天:就是阉割版的微信,不能发表情和视频聊天。

如果你平时工作是用微信来沟通,可能也意识到了微信朋友圈和推送的公众号等功能,很容易让人分心进而降低工作效率。




左边为企业微信,右边为普通微信,朋友圈功能没有了,替换成了同事通讯录。

而在企业微信应用里,和工作无关的功能就统统被取消了。




左边是企业微信,右边是普通微信,聊天对话框里面的可用组件不一样,例如语音聊天、红包等功能都没了。

企业微信在聊天界面是精简化的微信:小视频录制、名片分享、卡券分享、发红包、转账、语音输入都没有在聊天的功能组件里出现。

表情列表里,也仅有 QQ 默认的那套表情,而自定义表情却不能添加和发送。可能是微信团队认为,这些在工作时用不上吧。

对讲机,以及视频/语音电话功能也被取消了。在企业微信,你只能用最常用的文字和语音发消息。

公费电话:可以给多位同事打语音电话

但和阿里的钉钉一样,企业微信也可以拨打免费电话。其支持两人通话,也可以用于多方电话会议。同时,不管团队规模大小如何,目前一律共享 1000 分钟。如果超时则可以另外充值,价格为 0.06 元/分钟。




公费电话拨打页面

有了“公费电话”的功能,并不意味着员工可随意打私人电话了。在管理员后台可以查到所有的通话记录和通话时长。

回执消息功能:你会看到别人是否阅读了这条消息

企业微信也不止是在微信基础上砍功能。例如,它新加入的“回执消息”功能,就可以让消息在每个人读过后,提示为已读状态。如果一段时间后,有的人还没有阅读,发送者就能方便地找出未读者,重发一遍。但该功能并非默认开启,需要在每条消息发送前在插件框手动设置。




回执消息,你可以看到到底谁已经阅读了消息。

有趣的是,微信之父张小龙在 2012 年的一次活动上就说:“如果你的上级(通过微信)找你,你看了然后你又不回,就很麻烦。我们要给人撒谎的机会。我们说人性是什么?给他撒谎的机会。”不知道如今的“回执消息”是否是为了企业市场的一种妥协。

提醒和休息功能:类似于一个给同事看待办事项提醒。

企业微信还在聊天插件中加入了提醒功能。用户可以直接对话、群聊中设置提醒时间,到时所有人都收到通知。




对话框中的提醒功能,可以设定某个对话的提醒时间,也就是说,对方会在你设定的时间点再收到提醒。

在谈话中,如果做出安排,也可以长按该条消息,将之直接转化为提醒。如此,该应用又能化身为任务协作的工具了。




休息功能,你可以选择自己休息一个小时或者更长的时间,消息不会推送但是还会继续接收。

和微信 24 小时在线的逻辑不同,企业微信首页菜单里还加入了一个名为“休息一下”的功能。员工可以选择“小休”或“下班了”。在这个休息期间,员工将分别可在 1 小时内和第二天早上 9 点前不接受来自企业微信的提醒。

问题是,对方要是选择打电话过来,你还是能接得到。所以,如果想要拒绝临时加班,这个功能显然是无效的。

还有符合中国公司的考勤、报销和打卡功能:

针对行政工作,企业微信里还加入了一些专门的功能。公告、考勤、请假、报销这些都能在该应用中完成。




不过它们的实用性,目前还是个问题。比如报销并不能直接对接财务系统,而需要后台管理员手动导出 Excel 表单,然后转发给人事部门。

还有一个比较可怕的打卡功能,就是直接抓取员工的地理位置打卡,也可以作为考勤的一部分,员工不能手动调整距离太远的位置来打卡。




目前,企业微信仍是定位于一个公司内部的通讯平台。但如果你需要和公司之外的人打交道,恐怕还是得用微信。

这个其他的协作产品有什么不一样

国内的竞争对手:钉钉

阿里巴巴 2015 年 1 月推出的钉钉是微信企业号的主要竞争对手。这个推出之初显得粗陋的产品经过一年改进和大量市场推广,获得了超过一百万企业,当中包括:Uber、锤子、今日头条。

钉钉强调为企业专门定制的功能,比如:

  1. 所有发出的信息都显示对方是否阅读;

  2. 重要的消息,钉钉会自动转为语音,以电话形式播到对方手机上;

  3. “澡堂模式”,所有公司员工匿名交流。

就通信功能来说,钉钉更倾向于企业管理者,比如 boss 发一条信息, 可以变成自动播出的电话打给员工,同时来电显示为 boss 的名字。




左边是企业微信,右边是钉钉

而微信企业版相对来说更平衡一些,没有给管理者这样特殊的功能。

钉钉目前领先的地方是它的企业服务平台。它在去年 8 月升级 2.0 版本后,引入第三方服务,比如麦客表单、Tower,企业用户可以在钉钉直接实现表单搜集、任务管理甚至简单的 ERP。

一位钉钉上的主要服务商告诉《好奇心日报》,它们也有意为企业微信开发类似功能,但微信暂时还没对外开放。

微信团队在公众号内称企业微信还只是企业应用市场的中“一个水洼里扑腾的小鱼”,因为做同样生意的“中国的成规模的企业至少有数百万家”。不过很显然在中国只有阿里巴巴和它相同规模。阿里巴巴已于今年 1 月任命虾米创始人王皓为钉钉的商务副总裁。

国外的佼佼者 Slack

全球最受关注的企业社交工具肯定是 Slack,这家 2012 年才成立的创业公司估值已达 40 亿美元。

和企业微信、钉钉的最大不同在于,Slack 的频道相当于一个个讨论组,成员可以浏览到所有公开频道,然后自由选择加入其中,而且还能看到过往讨论的记录。



Slack 界面

简单说,Slack 是个开放得多的产品。它的开放也体现在合作工具里,目前主流的海外服务都大多都已经接入 Slack,企业自己开发新功能也非常容易。开放性让 Slack 的频道可以变成几乎任何工具:订酒店、叫车、看新闻、筛选信息……

相比之下,企业微信只是更适合企业用的微信。不过对于大多数中国企业来说,它可能也是更合适的工具。
其实腾讯已经做了十多年企业服务了,他们之前的产品是怎样的?
昨天,微信团队官方回应称“企业微信正是在 RTX 的基础上优化而来。”

2003 年 9 月 9 号腾讯在北京嘉里中心发布了企业即时通讯工具腾讯通 RTX(Real Time eXchange)。这一年,腾讯除了推出腾讯网、 QQ 游戏之外,还创立了企业业务品牌 BQQ(Business QQ)。RTX 是第一个成型的产品。


RTX 早期产品截图

为了做到和平时社交足够分离,RTX 最开始是一个局域网 QQ,公司内部不需要联网也能互相打招呼、发送文件。但公司员工除了要装客户端版本之外,IT 部还要配置服务器端——这对中小企业来说极其不友好。

腾讯在企业服务里也延续了不同部门产品相互竞争的传统。RTX 推出 3 个月后,腾讯又推出侧重于办公室环境中使用的即时通信软件——Tencent Messenger(TM)。


2009 年的腾讯 TM 界面

它能够与 QQ 账号联通,但产品砍掉了几乎所有的娱乐功能,只能聊天、视频、语音和传文件。2014 年 6 月这款只支持 Windows 系统 PC 的软件就停止更新了。

RTX 活到了现在,但主要是腾讯自己内部使用的服务。这可能是中国互联网巨头推出失败的 IM 产品的归宿,百度嗨和网易泡泡同样变成了公司内部通信工具。

腾讯第二轮做企业服务是 2008 年的企业 QQ。它和 RTX 的区别是能够导入客户的 QQ 号,沟通不仅局限在一个公司里面。企业 QQ 没有成了一个普及的企业服务,而是变成了一个营销/客服产品。比如你打开小型留学中介的网站,首先弹出来就是 QQ 客服。



企业 QQ 的界面

可以说直到今天,腾讯也没能真的做出一款企业协同办公软件。如果不算你用微信聊工作的话。

有消息称,2014 年初腾讯微信事业群就在认真考虑做企业办公软件。2014 年 8 月微信企业号内测。一个月后,它对外开放测试接口。

但企业号只是一种针对企业内部运作的公众号,虽然提供在线打卡、在线出差申请、报销等等移动办公功能,但用户日常沟通还是通过微信完成——私人信息、公事、消费促销、公众号文章混在一条信息流里,根本问题没有解决。

企业版微信还意味着什么?

中国人一直没有使用数字协作工具的传统,大多数公司连电子邮件都不常用,办公中用到的数字工具基本停留在微软 Office 和企业业务流程直接相关的软件上——比如租房公司的房屋管理后台。

但工作强度其实是越来越高,不管在不在办公室,都需要实时沟通。已经覆盖了超过 5 亿中文用户的微信,现在已经被用于工作是大多数公司第一次大规模使用“移动办公”,无论它有没有发布专业版。

但微信并不是理想的协作工具,它把人们的公私事情都混杂,还带有阅读器、购物和钱包功能,这让你所有时间都可能被工作缠住(想想那些周末看到微信提醒有点担心是工作任务的时候)。更不用说,我们工作的时候也会被各种无关的事情打断了。

阿里巴巴旗下的企业协作软件的钉钉,抓住了这样一个需求,尽管阿里巴巴本身并没有什么社交关系的数据,钉钉现在的经营状况不错。

现在,微信做了一个同类产品,并且在两个月内发布。尽管它出现得晚,但微信的优势也正在于它的社交关系,本来那 5 亿用户,就在用微信进行工作沟通和协作。

而要甩开企业微信竞争对手,估计钉钉们要做得比现在优秀许多,可能才会有机会了。

原文来自好奇心日报,唐怡园,赵长存,如有侵权请联系公众号:数通畅联或QQ群:299719834,将会第一时间删除处理。

2020-04-07 22:01:55 weixin_42677168 阅读数 1709

报错如图
如图所示。

解决方案:

点击右上角的三个点,选择用其他应用打开
在这里插入图片描述
观察红圈处显示的图标,是哪个第三方APP,卸载掉!!!!直到变成如图所示的Word图标!
问题解决
在这里插入图片描述

2018-01-03 17:18:00 weixin_34279246 阅读数 21

在2017微软技术暨生态大会(Microsoft Tech Summit)上, 微软宣布Office 365微助理正式商用。Office 365微助理将微软Office 365的生产力服务扩展到微信平台,能够在人们熟悉的微信操作界面中,为企业及用户带来 Office 365 的安全性、管理性和更多深层功能。这项由微软中国自主研发的全新功能能够为习惯利用微信进行日常沟通和工作的中国用户,提供一个功能强大、智能化,且简单易用的移动办公和通信解决方案。此外,Office 365 微助理还允许第三方合作伙伴开发出更多基于 Office 365 平台的商业解决方案。

 

Office 365商用客户将可以通过产品官方页面部署中文版的Office 365微助理服务。

 

20171101-3.jpg

Office 365 微助理

 

Office 365为微信带来全新生产力工具

作为中国影响最广的移动社交软件,微信拥有超过 9 亿活跃用户,且大部分用户每天都在频繁使用微信。人们不但将微信用于私人交流,同时也经常将其用于日常的工作沟通和相互协作。但把私人微信用于工作,常常会让人手忙脚乱,因为用户要经常在微信、电子邮件、语音通话及更多其它应用之间来回切换;与此同时,企业 IT 部门则要为如何确保这些基于聊天的交流和数据的安全、可追踪、可管理而大伤脑筋。

 

Office 365 微助理将企业级的安全性、管理性,以及统一的通信及协作工具与微信的操作体验融会贯通。通过将 Office 365 服务植入微信,用户和企业既能继续使用他们最熟悉的通信工具,同时又能得到由 Office 365 提供的更高水平的生产力、团队协作能力,以及安全性的保障。

 

实现高效沟通及信息管理

Office 365 微助理的智能通知(intelligent notifications)功能可以帮助用户更高效地管理信息,并在微信中更轻松地找到联系人和文档。用户不但能及时收到邮件和会议提醒,还能在组织内快速查找联系人、文件和邮件信息。Office 365 微助理能确保信息发布的安全性,员工也可以通过公司内网查看企业内部的政策规定或及时获取 IT 部门的支持。Office 365 微助理还能提供对最近打开的文档或常用联系人的快速访问,智能识别图片信息,并能生成可以编辑的 PowerPoint 文档。

20171101-4.jpg

通过“个人助理”接收工作提醒

 

20171101-5.jpg

 

 

通过“同事圈”了解同事动态

促进高效的团队协作

Office 365 微助理不但能帮助用户快速与同事取得联系,还提供了安全的文档共享服务、基于人工智能的智能会议调度及任务协调功能,可以显著提升团队协作的效率。用户可以通过多种方式与他人沟通,包括使用企业通讯簿快速查找特定联系人,通过身份同步(ID sync)自动将 Office 365 联系人同步到企业通讯簿中。此外,用户还能够借助 OneDrive 安全地共享文件。所有讨论交流都可以自动存档,便于以后参考使用。

20171101-6.jpg

通过“团队协作”查看最近联系人

确保企业级的信息安全和管理性

利用 Office 365 微助理,企业可以对数据访问权限进行更好的管理,对数据进行更周全的保护,在确保合规的同时,提供简单易用的管理性。微信将得到企业级的数据保护,静态数据和传输中的动态数据都能全程得到增强的数据保护。收到文档的用户需要具有相应的权限才能对文档进行访问和共享,对于保密文档,用户浏览文件时就会自动添加水印,同时禁止文档转发。

Office 365 微助理能确保员工进入与其身份、职责相符的聊天群组或对话中,从而有效防止信息泄露。同时,每名员工的Office 365 账户信息与其企业微信身份始终保持同步,因此 IT 管理员能够轻松地对用户身份进行统一管理。Office 365 平台与微信的集成,不但能为企业提供企业级的数据保护,同时还能确保移动设备上的数据安全。

 

 

20171101-7-1024x640.jpg

IT 管理员能够轻松地对用户身份进行统一管理

 

即刻体验 Office 365 微助理

从今天开始,Office 365 商用客户将可以通过产品官方页面即刻部署和使用 Office 365 微助理服务。

 

(本文转自微软官网

慧都联合apple及多家厂商开启折扣盛宴

转载于:https://my.oschina.net/u/3279502/blog/1601291

2015-06-02 12:48:49 myfmyfmyfmyf 阅读数 28666

     最近开发微信企业号,发现微信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  muyunfei
	 * tel     15562579597
	 * qq      1147417467
	 * @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.muyunfei.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;

	}
}