背景
- 最近的公司有一个需求,需要在线预览office(xls ppt doc)文件, 之前使用了微软的office在线预览服务,https://view.officeapps.live.com/op/view.aspx?src=文档地址(需要是文件的真实路径,如果使用文件流的话,url的后缀必须是文件的类型,如:https://view.officeapps.live.com/op/view.aspx?src=文档地址.doc), 这样就可以在线预览,但是该网站有文件大小限制(xls小于5m, ppt doc 小于10m),因此需要自己实现一种预览服务或者使用第三方的预览服务,第三方预览服务使用方式类似上述微软,需要收费,个人实现方式也有很多,这里只说我实现的方式。
实现在线预览服务
- 用户上传office文件,
- 搭建可以转换office软件的服务, 或者直接在项目服务器上直接搭建转换服务
- 使用soffice命令转换office文件为pdf文件
- 更改header头,输出pdf文件内容
实现步骤
- 安装openoffice或liboffice, 有的系统已经预装该软件,使用soffice --help测试是否安装,如果没有安装,使用以下命令安装
centos: yum install libreoffice ubuntu: apt-get install libreoffice
- 编写php脚本, 这样使用tp3.2搭建的转换服务
public function viewFile() { define('APPLICATION_PATH', dirname(dirname(__DIR__))); define('FILE_UPLOAD_PATH', APPLICATION_PATH . '/Runtime/Uploadfile/'); define('FILE_CONVERT_PATH', APPLICATION_PATH . '/Runtime/Convertfile/'); $fileUrl = I('file_url'); if (empty($fileUrl)) { return $this->ajaxReturn(array('status' => 'failed', 'message' => 'parameters is missing!')); } $urlInfo = pathinfo($fileUrl); $httpUrlInfo = parse_url($fileUrl); switch ($urlInfo['extension']) { case 'doc': $result = $this->getConvertViewFile($fileUrl, $httpUrlInfo, $urlInfo); if ($result['status'] == 'failed') { return $this->ajaxReturn($result); } else { header('Content-type:application/pdf'); echo $result['message']; } exit(); case 'pdf': $result = $this->getViewFil