Linux下使用PHP 替换模板变量合并多文档方案

需求: 有 很多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                                                               杀掉对应的进程 

若出现找不到命令之类 一般都是依赖包没装好。


搞定。 完美解决需求。尊涩博客 


尊云CMS
请先登陆后发表评论
  • 最新评论
  • 总共0条评论