Tools
首页
画图
音乐
采集
记事
博客
实验室
登录
lypeng
146
文章
11
分类
46
记事
分类
生活-[23]
Linux-[24]
前端-[9]
数据库-[16]
PHP-[31]
git-[7]
其他-[6]
python-[20]
算法-[4]
React-Native-[4]
中草药-[2]
广告位1
广告位2
首页
/ PHP
返回列表
使用phpword类库替换word内容,生成新文件,然后用libreoffice转换为PDF
阅读:1075
发布:2020-05-26
作者:lypeng
最近的新需求:合同文件线上签约与管理 ## 需求描述 公司有一些合同文件,需要线上签约~ 合同格式是固定的,里面有一些内容需要替换为数据库查找出来的用户信息,然后以短信与邮件形式将PDF发送给用户签署盖章(调用esign的接口完成盖章相关操作)。 采购合同、销售合同、代理合同等等,即有多个word模板,跟用户A/B/C等多个用户 需要我这边实现的 1. 模板内容替换; 2. word转PDF(接口自动转换经常报错,所以还是自己转) 3. 调用接口实现甲方自动盖章,创建乙方盖章区域等 ## word模板内容替换与生成新word `composer require phpoffice/phpword` 主要代码如下 ``` $template_file = '/data/template.docx'; $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($template_file); $var = ['name'=>'AAA', 'email'=>'123@qq.com', 'code'=>'J_4118_ABC']; //从form表单获取 $param['effective_time'] = time(); $param['expire_time'] = strtotime("+1 year",time()); foreach ($var as $k => $v) { $templateProcessor->setValue('{$'.$k.'}', $v); } // 替换生效时间与到期时间 $templateProcessor->setValue('{$effective_time}',date('Y年m月d日',$param['effective_time'])); $templateProcessor->setValue('{$expire_time}',date('Y年m月d日',$param['expire_time'])); // 生成合同文件 $contract_file_name = 'contract/'.$param['code'].'.docx'; $templateProcessor->saveAs(FILE_UPLOAD_DIR.$contract_file_name); ``` 1. 先在word里面,把需要替换的内容,更改为{$name} {email} {$code} {$effective_time} {$expire_time} 等等 2. 然后使用TemplateProcessor类的setValue方法去替换内容 3. 最后调用saveAs方法,生成新的word文档 由于生效时间,与到期时间需要在合同列表里面展示出来,且每一份合同模板都需要,所以我把它提出来!作为公共变量 ## 使用libreoffice将word转换为PDF 怎么用代码怎么生成PDF文件? 1. 前端js方法 主要是(html2canvas.js,jspdf.min.js)这两个文件,可以直接把HTML生成PDF,效果不好 2. tcpdf类库 可以创建PDF文档,设置header,footer,内容等等,如果是生成简单的,应该可以用 3. libreoffice 不错,可以把word直接转为PDF,转换效果也很好 ------------------ 下面简单说下libreoffice ### 1.先安装 `apt-get install libreoffice 或 yum -y install libreoffice` ### 2.转换命令如下 `libreoffice --headless --convert-to pdf:writer_pdf_Export /data/aaa.docx --outdir /data` 查看`libreoffice --help`可以看到几个转换示例如下: ``` --convert-to pdf *.doc --convert-to pdf:writer_pdf_Export --outdir /home/user *.doc --convert-to "html:XHTML Writer File:UTF8" *.doc --convert-to "txt:Text (encoded):UTF8" *.doc ``` ### 问题1:关于乱码,字体文件丢失 转换出来的全是方框,即字体不存在 怎么给centos安装微软雅黑,宋体,楷体等等?? 1. 创建目录 /usr/share/fonts/chinese/TrueType 2. 上传字体文件(我把黑体,楷体,仿宋,微软雅黑都传了) 3. 建立字体缓存 4. 我这不用重启,重新执行下转换命令,看到效果不错,很nice~~ 第3步,建立缓存命令如下 ``` cd /usr/share/fonts/chinese/TrueType mkfontscale (如果提示 mkfontscale: command not found,需自行安装 # yum install mkfontscale ) mkfontdir fc-cache -fv (如果提示 fc-cache: command not found,则需要安装# yum install fontconfig ) ``` 参考:https://www.cnblogs.com/luckystarfl/p/7999907.html?_blank ### 问题2:使用PHP的exec()函数返回77以及Warning: failed to read path from javaldx 原本命令如下: ``` exec("libreoffice --headless --convert-to pdf:writer_pdf_Export /data/aaa.docx --outdir /data 2>&1",$result,$status); // var_dump($result); // var_dump($status); ``` 结果报错,`failed to read path from javaldx` 不能读取一个javaldx的路径,这个不知道是干嘛的,百度一下加了`export HOME=/tmp/`执行成功,修改后代码如下: ``` exec("export HOME=/tmp/ && libreoffice --headless --convert-to pdf:writer_pdf_Export /data/aaa.docx --outdir /data 2>&1",$result,$status); // var_dump($result); // var_dump($status); ``` $result里面还有错误`javaldx: Could not find a Java Runtime Environment! `,但是 $status=0 提示执行成功,也能看到PDF文件了,搜索了下是java环境问题,那就不管这个错误了~ ------------ End 2020-05-26 20:14
------本文结束
感谢阅读------
上一篇:
html转图片下载与保存
下一篇:
文字转语音