PHP替换Word中的变量并将word文件导出为PDF的实例

码农公社  210.net.cn   210是何含义?10月24日是程序员节,1024 = 210、210既 210 之意。

PHP替换Word中的变量并将word文件导出为PDF的实例


在线生成合同信息,某word文件里的部分内容(变量)需要读取数据库表的值来替换,并最终将整个word文档在线生成pdf,

接下来我给大家分享我是如何实现的。


1.jpg

我们新建一个 210.net.cn.docx 的文档,里面放了一个变量信息


1、用 php 来替换这个变量 

...
use PhpOfficePhpWordTemplateProcessor;
...
$path = storage_path('210.net.cn.docx');
// 生成world 存放目录
$filePath = storage_path('210.cx.docx');
// 声明模板象并读取模板内容
$templateProcessor = new TemplateProcessor($path);
// 替换模板内容
$templateProcessor->setValue('contract', '码农公社 www.210.cx'); // 乙方
// 生成新的 world
$templateProcessor->saveAs($filePath);


2、将word文档转为pdf

我在网上了查了较多资料,什么先转为 html 然后通过其它包的方式或者扩展来转pdf确实都能实现,但word转为html的时候格式会丢失!

这就偏离了我的需求。So,我转换了方向,使用工具把word转为pdf,这里我推荐的工具是unoconv安装方式如下:

apt-get install unoconv

#如果报错请求服务器语言设置为 LANG=”en_US.UTF-8″

#使用命令把 word 转为 pdf

unoconv -f pdf aa.docx

#这个时候在当前目录下就会有一个 aa.pdf 的文件出来

#但是会发现如果是中文的情况下转出来的 pdf 是乱码该如何解决

3、pdf 生成出来中文乱码解决方案,安装一个中文字体

# 把电脑本机的宋体上传到服务器字体目录下 /usr/share/fonts 新建一个目录 win 或者其它,把中文字体上传到该目录下

apt-get install mkfontscale #安装这个工具

# 进入到/usr/share/fonts/win/ 执行命令

mkfontscale && sudo mkfontdir && sudo fc-cache -fv

# 然后重启服务器让字体生效

reboot

# 最后在执行

unoconv -f pdf aa.docx

# 看是不是中文乱码的问题解决了

4、使用php执行shell来自动生成即可

shell_exec('/usr/binunoconv -f pdf aa.docx')

注:如 php 执行 shell 脚本命令不生效时,此处的问题是用户权限不正确导致不能执行该命令 解决方案如下:

# 编辑 vim /etc/sudoers文件

root ALL=(ALL:ALL) ALL

www-data ALL=(ALL) ALL

%www-data ALL=(ALL) NOPASSWD:ALL 

zhouyao ALL=(ALL) ALL

zhouyao ALL=(ALL) NOPASSWD:ALL

# 增加用户zhouyao 忽略执行命令需要密码

# 增加用户组和用户zhouyao

useradd zhouyao -m # -m 创建家目录

# 更改php-fpm的用户和用户组

cd /etc/php/7.1/fpm/pool.d

vim www.conf

user = zhouyao

group = zhouyao

# 退出保存

重启php-fpm和nginx,此时在浏览器在执行该文件可以看到pdf下载下来了

# 如pdf中下载的中文是乱码,请自行安装一个中文字体到服务器字体目录即可


 

原文:https://blog.csdn.net/hytfly/article/details/110180075


评论