【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】