• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP sdk文档处理常用代码示例解析

    主要是:ppt文件转为pdf文件,pdf文件转图片(png)。

    描述一下需求:上传PPT或者PDF文件到七牛,最终转换为图片。文件上传部分的功能已经讲过了,这里说一下转换处理的部分。

    文档类型

    因为七牛整个的文件存储系统中文件类型并不靠后缀来区分,而是有它自己的 文件类型(mineType),所以在堆bucket中的资源进行处理的时候,首先要判断minetype。

    多次的测试结果表明,pdf文件上传后的minetype一为application/pdf,而ppt上传后的类型就比较多了,通过jssdk上传,以及直接在七牛上传,上传后缀为ppt、pptx的结果都有可能不一样。最终总结出如下的几种类型:

    application/vnd.openxmlformats-officedocument.presentationml.presentation
    application/zip
    application/vnd.ms-powerpoint
    application/ppt
    application/x-ole-storage

    这里的文档类型判断PHP-SDK已经提供了,是BucketManager这个类。

    //使用方式
    $bucketManager = new BucketManager($this->getAuth());//getAuth()方法见七牛php-sdk使用-文件上传
    $mineTypeInfo = $bucketManager->stat(bucketName, 七牛资源名);
    $mimeType = $mineTypeInfo[0]['mimeType'];

    持久化处理

    七牛的服务都是通过http请求附加不同的参数来实现的,比如我们处理剪裁一张图片,或者获取视频某一秒的截图,在我们的页面中可以直接使用src=http://qiniu.com.cn?xxx这种方式,就能得到我们想要结果,但有的时候我们需要把处理的结果保存到我们的bucket中,这个就是持久化处理了。

    根据sdk封装一个持久化处理的方法,用到的sdk类为PersistentFop:

    /**
     * 文件持久化处理
     * @param  $key 七牛资源名
     * @param  $pfop 对资源进行的数据处理操作的命令 
     * @param  $bucket bucketName 
     * @return persistentId
     */
     public function persistentOps($key,$bucket,$pfop,$notifyUrl='',$check=true)
     {
       header('Access-Control-Allow-Origin:*');
    
       $auth = $this->getAuth();
       $persistOps = new PersistentFop($auth,$bucket,$this->qiniu_image_pipeline,$notifyUrl);
       list($id,$error) = $persistOps->execute($key,$pfop);
       if($check){
         //可暂时忽略,用来检查资源持久化处理状态
         $result = $this->checkStatus($id,$persistOps);
       }else{
         $result = true;
       }
       return $result;
     }

    PPT转PDF

    使用到的持久化出来命令为:$pfop[] = 'yifangyun_preview/v2|saveas/'.$key;,这里使用的是七牛的第三方文档转换服务,因为七牛之前的odconv/pdf已经不再更新维护了,而且出现过转为pdf排版出现遮挡以及乱码等问题,所以改为使用亿方云的服务。

    这里面saveas,即保存为一个新的资源,$key需要做一下说明,按照七牛的要求必须是:

    $key = \Qiniu\base64_urlSafeEncode(bucketName.':'.$sourceName);

    如果不按照规则进行encode,无法保存成功。base64_urlSafeEncode,sdk functions.php中已经存在。

    有了原始的key,saveas的key,以及pfop持久化处理命令,就可以调用persistentOps方法了:

    $result = $this->persistentOps($sourceName,$bucketName,$pfop);

    pfop可以是一个数组,包含多个处理命令。

    PDF转图片PNG

    因为没有PPT转图片这条路,所以只能先转PDF。

    用到的pfop命令:

    odconv/png/page/页码/density/150/quality/80|saveas/'.$key;

    参数包括页码,质量,像素密度等,还有更多的参数可以查阅文档。所以这里我们首先要获取PDF文档的总页数。使用到的接口命令是:

    //odconv/png/info
    $url = 'http://'.$this->qiniu_image_domain.'/'.$sourceName.'.pdf?odconv/png/info';
    //url部分就是七牛资源可以访问的完整链接,?后面就是要用到的命令

    使用curl去请求这个链接,会返回json数据,里面会包含page_num成员。

    有了page_num,就可以构造pfop数组了。

    public function pdf2PngPfop($page,$sourceName)
    {
       $pfop = [];
       $pngName = $sourceName;//原图
       for($i=1;$i=$page;$i++){
         $randName = $pngName.'_'.$i.'.png';//原图
         $key = \Qiniu\base64_urlSafeEncode($this->bucket_for_image.':'.$randName);
         $pfop[] = 'odconv/png/page/'.$i.'/density/150/quality/80|saveas/'.$key;
       }
       return $pfop;
     }

    然后调用:

    $res = $this->persistentOps($sourceName.'.pdf',$this->bucket_for_image,$pfop,'',false);

    note:在处理比较大的文档,例如一个PPT有100多页,那PHP运行等待七牛的结果返回再进行数据的保存就可能会超时,一个解决方案,是指定回调url,persistentOps的倒数第二个参数就是回调url,当文档转换完成的时候,七牛会向这个地址发起一个请求,后续的图片链接保存操作我们交给回调来做。

    tips: 如果对每个pfop命令都指定回调地址,对我们的(普通)业务服务器也会造成些许的请求压力,所以我的做法是给最后一页的PDF转图片命令添加回调url。

    回调地址函数

    public function actionQiniuCallback()
    {
      $notifyBody = file_get_contents('php://input');
      $notifyBodyArray = json_decode($notifyBody,true);
    
      $topicId = Yii::$app->request->get('topicId');
      $totalPage = Yii::$app->request->get('totalPage');//pdf页数
      $key = $notifyBodyArray['inputKey'];//这个是pdf文件的key
      //业务代码
      ...   
    }

    总结

    php来做这个文档转换七牛七牛遇到的一个主要问题就是超时的问题,所以我们可以把转换的过程拆解,在数据库中保存处理状态,然后用定时任务来自动处理。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 使用PHPWord生成word文档的方法详解
    • PHP实现动态创建XML文档的方法
    • PHP读取word文档的方法分析【基于COM组件】
    • php删除txt文件指定行及按行读取txt文档数据的方法
    • PHPExcel导出2003和2007的excel文档功能示例
    • PHP生成word文档的三种实现方式
    • PHP库 查询Mongodb中的文档ID的方法
    • PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
    上一篇:PHP sdk实现在线打包代码示例
    下一篇:PHP如何解决微信文章图片防盗链
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    PHP sdk文档处理常用代码示例解析 PHP,sdk,文档,处理,常用,代码,