0

我的帖子

个人中心

设置

  发新话题
【51CTO.com原创稿件】在一些特殊场景,用户需要展示的数据不是手动输入的纯文本或者手动编辑的富文本内容,而是通过上传Word文件形成生成最后需要在APP上显示的HTML内容,也就是将上传的Word文件转换为最后显示的HTML文件,那么面对这样的需求,我们应该怎么办呢?

业务场景


应朋友的请求,本次需要完成的功能如上图,从上图我们能够看到,首先从管理后台上传WORD文件,然后后端脚本对这个WORD文件进行转换操作,将其转换为HTML文件,然后将这个HTML文件保存在某个目录下面,最后手机APP里面直接显示这个HTML文件就可以了,换句话说,就是将WORD文件转换为HTML文件,并且这个HTML文件兼容HTML5标准,从而能够让APP能够尽可能的、友好的显示这个HTML文件。
目前主要的解决方案


目前能够完成WORD文件转HTML的第三方库或者软件很多,不过最常用的有两种:Apache OpenOffice和LibreOffice,这两种方案的最大优点就是跨平台型比较强,也就是它们都提供了关于Windows、Linux、Mac OS操作系统的版本,这样我们就能够放心的使用了,尽可能的减少移植代码成本,在此,我选择的是LibreOffice这种解决方案。
环境介绍
进行本次开发的本地环境如下:
OS:Windows 10
PHP:7.1以上
MySQL:5.6以上
WEB SERVER:Apache 2.4
PHP Framework:LV框架
IDE:PhpStorm
服务器环境介绍:
OS:Ubuntu
PHP:最新版
MySQL:最新版
WEB SERVER:Nginx
安装LibreOffice环境
由于本地环境是Windows环境,所以我仅仅需要下载Windows版本的软件包进行安装就可以了,而该版本的软件就是一个exe文件,所以安装很简单,仅仅需要像安装一般的软件一样点击下一步下一步就可以完成整个安装。
用命令行进行转换
其实将Word文件转换为HTML文件,主要用到的是LibreOffice这个安装目录下面的soffice.exe文件,下图是我本地的文件路径。


下面我新建一个目录,用于测试转换,新建目录、转换文件和转换命令、转换结果等到参考下面的截图。


刚刚开始仅仅就一个20170818.docx文件,下面我们将在这个目录下面生成一个html文件。


经过上面的运行,我们能够看到生成了一个20170818.html的HTML文件,主要应用的命令:”soffice.exe --convert-to html --outdir HTML文件保存目录 要转换的文件名”。
用PHP代码进行转换
上面我们已经用命令行的方式验证了,能够成功将Word文件转换为HTML文件,由于我们的环境是PHP脚本,所以需要用PHP调用soffice.exe文件进行转换,那么在PHP中调用这些执行程序的函数有:shell_exec、exec、system、passthru等等,下面是我用LV实现的转换为HTML的代码片段。


还有一个需要解决的问题
虽然上面我已经成功用PHP来实现后台上传的Word文件转换为HTML文件保存起来,但是还有一个致命的问题,就是转换后的HTML文件不能够自适应,这就导致这个页面在APP里面打开的时候,显示效果非常糟糕,甚至会出现横向滚动条,图片的右下角开始显示文本等等,于是为了解决这个问题,我不得不将生成的HTML文件内容读取出来,然后在里面添加各种各样的HTML标签和CSS属性,参考下面的代码。


同时还有一点需要说明的是,对于Word文件里面的图片,转换为HTML文件的时候是经过base64编码的。
一个潜在的性能问题
由于转换Word到HTML文件的时候,脚本执行时间或许会很长,所以如果有很多Word文件或者同时有很多用户进行Word文件的转换,这个时候就不太建议上传之后就转换,而是将转换交由单独的主机或者单独的进程来进行,而后端上传成功之后仅仅将转换任务添加到消息队列里面就可以了。
一些附加的注意事项
由于转换时间或许长、上传的Word文件或许很大,所以我们需要做好一些PHP配置选项的设置,比如脚本最大执行时间、文件最大上传大小、POST最大上传大小等等。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】




本帖最后由 七彩极 于 2017-11-12 17:43 编辑



可惜还没有纯PHP的解决方案。。PHPword只能简单的创建,但貌似不能读取,更不用说复杂的word功能了。。。相信在以后的更新会跟进的哈



宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
这个给力,经常演示也需要html展示!



‹‹ 上一贴:【教程经验】十面埋伏? 程序世界里的不信任原则 ...   |   下一贴:从零学习PHP专帖指南(基础→进阶→进修) ... ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2017 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com