所用到的七牛文档转换服务,主要是:ppt文件转为pdf文件,pdf文件转图片(png)。

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

文档类型

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

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

  1. application/vnd.openxmlformats-officedocument.presentationml.presentation
  2. application/zip
  3. application/vnd.ms-powerpoint
  4. application/ppt
  5. 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-sdk使用-文档处理的更多相关文章

  1. Async Cow Python 七牛异步SDK

    # Async Cow Python 七牛异步SDK > gitee链接 >github链接本SDK基于官方SDK改造而成,但又对其进行了进一步封装,简化了相关操作例如:- 1.不需要使用 ...

  2. 基于七牛Python SDK写的一个批量下载脚本

    前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...

  3. 基于七牛Python SDK写的一个同步脚本

    需求背景 最近刚搭了个markdown静态博客,想把博客的图片放到云存储中. 经过调研觉得七牛可以满足我个人的需求,就选它了. 博客要引用图片就要先将图片上传到云上. 虽然七牛网站后台可以上传文件,但 ...

  4. [转载]Android SDK 离线文档 (api 20)(升级至api 23)

    原文地址:SDK 离线文档 (api 20)(升级至api 23)">Android SDK 离线文档 (api 20)(升级至api 23)作者:leechenhwa Android ...

  5. 七牛php sdk 生成上传凭证时出现 undefined function Qiniu_SetKeys()

    将qiniu/http.php文件改名即可,原因是xampp等集成环境会安装pear存在了http.php

  6. 【Mongodb教程 第七课 】MongoDB 查询文档

    find() 方法 要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法. 语法 基本的find()方法语法如下 >db.COLLECTION_NAME.find() ...

  7. 七牛Qshell 常用命令打印

    下载 该工具使用Go语言编写而成,当然为了方便不熟悉Go或者急于使用工具来解决问题的开发者,我们提供了预先编译好的各主流操作系统平台的二进制文件供大家下载使用,由于平台的多样性,我们把这些二进制打包放 ...

  8. iOS 客户端获取七牛上传token

    一.官方参考文档: 1.上传策略http://developer.qiniu.com/article/developer/security/put-policy.html 2.上传凭证(即uptoke ...

  9. 七牛用户搭建c# sdk的图文讲解

    Qiniu 七牛问题解答 问题描写叙述:非常多客户属于小白类型. 可是请不要随便喷七牛的文档站.由于须要一点http的专业知识才干了解七牛的api文档.如今我给大家弄个c# sdk的搭建步骤 问题解决 ...

  10. 受不了Android SDK文档打开缓慢问题,自己开发简易脱机浏览器。

    google android sdk离线文档打开的时候特别慢,据说是要从谷歌官网拉取一些东西导致的.脱机浏览能够解决该问题.PC端能够使用firefox. 可是Android端貌似没有支持脱机工作的浏 ...

随机推荐

  1. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

  2. Not++规范格式(格式化)

    Notepad++功能比Windows中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码.Notepad++ 有语法高亮度显示和语法折叠功能,并且支 ...

  3. centos6.5安装git

    1.git源码地址:http://codemonkey.org.uk/projects/git-snapshots/git/

  4. python scipy计算机数值库

    scripy有聚类的python 代码,如: http://blog.csdn.net/elaine_bao/article/details/50242867

  5. cocoapods使用 swift注意事项

    版权声明:本文为博主原创文章,未经博主允许不得转载. 说明:2015年12月2日更新,增加一个可能遇到的问题,优化排版.使用CocoaPods过程中遇到问题,欢迎评论交流. 一.CocoaPods的安 ...

  6. JavaWeb框架_Struts2_(五)----->Struts2的标签库

    1.  Struts2的标签库 1.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1 ...

  7. Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

    1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引 ...

  8. HNOI2013 BZOJ3142 数列

    尝试用Markdown写一篇博客 3142: [Hnoi2013]数列 Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的 ...

  9. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  10. bzoj 3620: 似乎在梦中见过的样子

    Description "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回 ...