需求:项目中需要生成文档文件,为了使用方便,同时生成word和pdf。
实现:
1、为了方便更改样式,使用了php库phpword的模板替换方式,生成指定模板样式的word文件很方便。
2、phpword也提供了导出pdf的方法,通过先生成word,再导入word生成pdf,无法直接导出,后面的坑会说明。但是这种方式文档的样式会丢失,无法使用。
3、最终生成pdf的方式改为先由phpword模板替换生成word,存入临时目录,再由php com调用office word组件生成pdf到临时目录,再读取导出。
插曲
phpword模板替换网上文档很多,难度不大,主要是表格多行克隆时用到
$phpWordProcessor->cloneRow('index',3);
和图片替换时使用
$templateProcessor->setImageValue('UserLogo', array('path' => 'path/to/logo.png', 'width' => 100, 'height' => 100, 'ratio' => false));
这两个方法较少提到
坑…………
网上关于phpword生成PDF和php调用office word的文章很少,且雷同
坑一、在测试phpword导出pdf时,官方文档写着To be completed........自己摸索,最后结论:1、模板导入的实例无法直接导出pdf,会报错,只能新创建或者读取的实例可以转PDF。所以只能先生成word,临时保存,再读取,再生成PDF。2、phpword读取生成PDF会丢失样式,文档变形无法使用。最终,放弃phpword生成PDF,脱坑。
坑二、
配置php调用word组件,以下问全过程
一、配置PHP调用COM和WORD组件环境
1、配置PHP调用COM组件
配置php.ini,有大坑
开启com_dotnet扩展,一般PHP已自带dll,直接添加:
[PHP_COMDOT]
extension=php_com_dotnet.dll
去除注释:
com.allow_dcom = true
删除com()函数禁用(某些环境需要)
disable_classes = COM
改成
disable_classes =
调试过程:thinkphp实例化com时返回空,度娘搜索无果,偶然想起用原生PHP看一下,IIS默认不返回详细错误,需要在IIS错误页设置中设置返回详细错误信息。php代码:
$obj = new COM("word.Application");
$result= $obj->demo();
echo $result;
运行报错:
com() has been disabled for security reasons in ......
百度结果:com()函数被禁止
2、安装:WPS 专业版,或者 microsoft office 2010
(microsoft office 2007 需要安装加载项:Microsoft Save as PDF)。这里使用office 2010。
正常安装,无难度
3、配置office组件,有大坑
按 win+R 快捷键进入运行菜单,输入 Dcomcnfg
找到: [组件服务] —— [计算机]—— [我的电脑] —— [DCOM配置] ——【wps……】或[Microsoft Wrord 97-2003文档]
如果没找到【wps……】或(Microsoft Wrord 97-2003文档):
按 win+R 快捷键进入运行菜单
输入:mmc -32
[文件]——[添加或删除管理单元]——[组件服务](从可用管理单元,添加到所选管理单元,点击:确定)
添加完以后,在控制台根节点下,找到【wps……】或[Microsoft Wrord 97-2003文档],右键设置属性,设置“标识”为:交互式用户

坑:有些环境需要配置权限,否则会报错

