Lumen 替换 Word 里面变量并导出 PDF 图片

应公司需求需要在线生成合同信息,合同是一个 word 文件里面有些信息需要通过数据库读取计算出并填写到 word 文档中最终显示在线 pdf 预览功能,接下来我交大家如果实现该需求

1、首先我们要解决如果替换 word 文档中的数据,我使用的 phpword 包,安装方式如下

    composer require phpoffice/phpword

2、接下来实现如何替换文档内容

lumen 替换 world 里面变量并导出pdf 图片
我们新建一个 aa.docx 的文档,里面放了一个变量信息

3、接下来使用 php 来替换这个变量信息 代码如下

        ...
        use PhpOffice\PhpWord\TemplateProcessor;
        ...

        $path = storage_path('aa.docx');
        // 生成world 存放目录
        $filePath = storage_path('contract.docx');
        // 声明模板象并读取模板内容
        $templateProcessor = new TemplateProcessor($path);
        // 替换模板内容
        $templateProcessor->setValue('contract', '北京乙方');  // 乙方

        // 生成新的 world
        $templateProcessor->saveAs($filePath);

这样我们就完成了word 里面模板变量的替换是不是比较简单呢

4、接下来我们需要处理 word 文档转为 pdf 我也在网上了查了比较多的资料,什么先转为 html 然后通过 其它包的方式或者扩展来转 pdf 确实都能实现,但是有一点 word 转为 html 的时候格式会丢失这就和我们的需求有点偏离,后面转换了方向,使用工具来把 word 转为 pdf 这里我推荐的工具为 unoconv 安装方式如下

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

#使用命令把 word 转为 pdf
unoconv -f pdf aa.docx
#这个时候在当前目录下就会有一个 aa.pdf 的文件出来
#但是会发现如果是中文的情况下转出来的 pdf 是乱码该如何解决

5、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
    # 看是不是中文乱码的问题解决了

6、使用 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中下载的中文是乱码,请自行安装一个中文字体到服务器字体目录即可

如有疑问欢迎留言交流

本作品采用《CC 协议》,转载必须注明作者和本文链接
994914376
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3

大佬好 我想把 ${contract} 这个替换成 " 有空格 " 的字符串, 但是空格被自动过滤了, 请问有好的办法解决么?

4年前 评论
wanghan

unoconv -f pdf aa.docx,不能用了 unoconv: UnoException during import phase: The document 'file:///root/20201026175522_50992146.docx' could not be opened.

3年前 评论
porygonCN 3年前

我们也是合同 我是先转html 再转PDF

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!