需求: 有 很多word.doc模板, 模板中有很多 变量 如 ${test1} 需要替换为 实际内容,然后 再将多个模板 进行合并,组合成 一个完整文件。
在Windows服务器下 可以用COM组件,但是服务器用Windows毕竟不多,这里解决的是Linux,服务器环境是 LNMP。
1.先使用 PHPWord 解决变量替换问题,里面有很多Word文档的操作,便于应对后续 如替换图片 插入内容 这种需求
github 地址 https://github.com/PHPOffice/PHPWord
注意:安装需要使用 composer 方式,不然会提示 找不到类,安装后使用代码参考
//将字符串写入word文档再保存为指定类型 $save_type Word2007 or HTML public function setWordByString($string= '', $save_file_name = '', $save_type = 'Word2007') { vendor('PHPWord.bootstrap'); $phpWord = new \PhpOffice\PhpWord\PhpWord(); $section = $phpWord->addSection(); $section->addText($string); $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, $save_type); $objWriter->save($save_file_name); } //模板替换变量替换 public function setTemplateVal($file_name = '', $save_file_name = '', $set_data = array()) { vendor('PHPWord.bootstrap'); $phpWord = new \PhpOffice\PhpWord\PhpWord(); $template = $phpWord->loadTemplate($file_name); foreach ($set_data as $k => $v) $template->setValue($k, $v); empty($save_file_name) ? $template->save($save_file_name) : $template->saveAs($save_file_name); }
2.模板变量问题解决后,需要将多个文档转换成pdf文件
github 地址 https://github.com/dagwieers/unoconv/
此处使用 unoconv 进行文档格式转换,安装后使用代码参考
//doc转pdf public function doc2Pdf($file_name = '') { return shell_exec('unoconv -f pdf '.$file_name); } //doc转pdf 批量 public function batchDoc2Pdf($file_name_array = array()) { foreach ($file_name_array as $file_name) { $this->doc2Pdf($file_name); } }
此处循环处理批量请求,因为此系统模板 不是特别多,如果合并的模板比较多的情况 可以将 多条命令合并 一次执行即可
3.现在有很多pdf文件了,最后一步就是 把多个文件合并
参考文章 http://www.zunkr.com/article/34
此处使用 pdftk 进行合并,安装后使用代码参考
//合并pdf public function mergePdf($file_names = array(), $output_name = 'output.pdf') { !empty($file_names) || !(2 > count($file_names)) || die('请检查文件数量'); $file_names_str = arr2str($file_names, ' '); return shell_exec("pdftk $file_names_str cat output $output_name"); }
中途可能出现的问题及对应的解决方法:
解决中文字体乱码 http://toptree.iteye.com/blog/1600616
Unable to connect or start own listener. Aborting 若报此错误需杀掉进程
ps -ef|grep soffice.bin 查看需杀的进程
kill -9 pid 杀掉对应的进程
若出现找不到命令之类 一般都是依赖包没装好。
搞定。 完美解决需求。