WINDOWS服务器下PHP利用COM组件将PPT生成图片
本文仅适用于WINDOWS服务器,且必须有安装Microsoft PowerPoint;
首先配置php.ini,启用组件:extension = php_com_dotnet.dll
com.allow_dcom = true
运行comexp.msc -32
打开组件服务,注意这里使用comexp.msc -32是因为我们将要配置的组件是32位的,运行dcomcnfg.exe无法看到组件。
一般在【组件服务】-【计算机】-【我的电脑】-【DCOM配置】-【Microsoft PowerPoint 幻灯片】上点右键,属性窗口中切换到【标识】选项卡,设置“交互式用户”即可,一般本地设置这个程序就可以跑起来了。
PHP源代码:/**
* 将指定PPT生成图片
* @param string $pptfile PPT路径
* @param boolean $iswater 是否增加水印
*/
function ppt2img($pptfile, $iswater = true){
if(!$pptfile){
return false;
}
//去除第一个'/'
$pptfile = substr($pptfile, 1);
//获得存储路径
$ext_arr = explode(".", $pptfile);
$ext_arr[0];
//没有则创建
if(!file_exists($ext_arr[0])){
@mkdir($ext_arr[0],0777,true);
}
set_time_limit(300);
$exportFolder = realpath($ext_arr[0]);
$powerpnt = new \COM("powerpoint.application") or die("Unable to instantiate Powerpoint");
$presentation = $powerpnt->Presentations->Open(realpath($pptfile), false, false, false) or die("Unable to open presentation");
$i = 1;
foreach($presentation->Slides as $slide){
$slideName = $slide->SlideNumber;
$slide->Export($exportFolder."//".$slideName.".jpg", "jpg");
//水印
if($iswater){
water($ext_arr[0].'/'.$i.'.jpg');
}
$i += 1;
}
$presentation->Close();
$powerpnt->Quit();
$powerpnt = null;
return $i;
}
提示:
如果组件服务中【我的电脑】如果出现红色向下箭头原因:msdtc 没有安装或者被卸载了!
解决方法:
msdtc -resetlog
msdtc -uninstall
重启电脑再执行:
msdtc -install
上到服务器上会提示 ERR: Failed to create COM object `powerpoint.application': 拒绝访问。
最头痛的就是这个安全权限了,网上的有关填哪个权限简直是五花八门什么都有,我的解决方式是添加3个账号:Everyone、NETWORK、SERVICE + 站点相关账号,如图:
总体来看,采用COM组件的方式代码简单,因为是调用Microsoft PowerPoint直接转换,生成图片质量较好(不丢失元素),缺点是你得忍受WINDOWS服务器~