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类
Jul 15 PHP
数字转英文
Dec 06 PHP
php at(@)符号的用法简介
Jul 11 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
php实现可运算的验证码
Nov 10 PHP
php判断邮箱地址是否存在的方法
Feb 13 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
php判断目录存在的简单方法
Sep 26 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函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
django中的ajax组件教程详解
2018/10/18 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue实现简单加法计算器
2020/10/22 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
python简单验证码识别的实现方法
2019/05/10 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
企业文化标语大全
2014/06/10 职场文书
违章停车检讨书
2014/10/21 职场文书
2014年人事科工作总结
2014/11/19 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
分享python函数常见关键字
2022/04/26 Python