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


Posted in PHP onDecember 09, 2020

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

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

PHP 相关文章推荐
坏狼的PHP学习教程之第1天
Jun 15 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
php笔记之常用文件操作
Oct 12 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
PHP sdk实现在线打包代码示例
Dec 09 #PHP
基于PHP实现生成随机水印图片
Dec 09 #PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 #PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 #PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 #PHP
浅谈PHP中的那些魔术常量
Dec 02 #PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 #PHP
You might like
PHP 编程的 5个良好习惯
2009/02/20 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
php数组去重实例及分析
2013/11/26 PHP
php生成二维码
2015/08/10 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现连接mongodb的方法
2015/05/08 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
2014年迎新年活动方案
2014/02/19 职场文书
经理助理岗位职责
2014/03/05 职场文书
煤矿安全承诺书
2014/05/22 职场文书
七一建党节慰问信
2015/02/14 职场文书
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技