关于我把 word 和 pdf 来回整的故事; 我有一段血泪史; 惊天地;泣鬼神;痛彻心扉;穿越前世今生; 今天我准备熬夜把它控诉一遍;
之前有一些愚蠢的人类给了伟大的程序猿一份 word 文档; 里面就一段文字; 需求是能动态的替换其中的部分内容; 然后转成 pdf 供用户下载;
这简单啊; 还要啥 word 文档啊; 直接手动把内容复制出来; 放好占位符用 php 的字符串替换函数动态替换下; 然后使用 tcpdf ; 生成 pdf so easy ; 根本不用点读机; 我写过文章可以参考thinkphp整合系列之tcpdf类生成pdf文件
然鹅需求如某某; 她总是善变的; 希望能有点样式加点图片; 说起样式图片我们都知道前端是擅长的; 我们可以先用 HTML+CSS 排好版了; 整个页面作为一个字符串替换其中的占位符即可; 然后用 dompdf 把 HTML 转成 PDF; 虽然曲折麻烦了点; 但是实现起来也不算难;
可万万没想到; 她不但善变还需求不满; 希望有页眉页脚页数 图片样式间隔; 而且一搞就来10几页的 word 文档; 而且还要经常换各种花样; 而且要生成的 pdf 要跟 word 源文档要保持一致到像素级别; 显然想像之前那样纯依赖 php 就完成是有点吃力了; 那么下面就有请 LibreOffice 上场了; 现在我们开始正文; 思路是这样的; 我们用 php 来编辑替换 word 文档内容; 然后调用 LibreOffice 把 word 替换成 pdf 文档;
用 php 编辑替换 word 就比较简单了;
扩展包在这PHPWord;
按文档很容易使用;
这里简单写两句;
在 word 源文件中占位符要包裹在 ${}
中;
比如说在 source.docx 中是这样的;
${name}博客666
php 调用 setValue 方法第一个参数传 name 第二个参数传值就可以替换了;
use PhpOffice\PhpWord\TemplateProcessor;
$phpWord = new TemplateProcessor('source.docx');
$phpWord->setValue('name', 'www.7727s.com');
$phpWord->saveAs('new.docx');
new.docx 文件中就被替换成 www.7727s.com博客666
了;
重点要来了; LibreOffice 折腾起来就稍微麻烦且有坑了; 先下载软件和语言包;
cd /usr/local
wget http://downloadarchive.documentfoundation.org/libreoffice/old/5.2.7.2/rpm/x86_64/LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm.tar.gz
wget http://downloadarchive.documentfoundation.org/libreoffice/old/5.2.7.2/rpm/x86_64/LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm_langpack_zh-CN.tar.gz
wget http://downloadarchive.documentfoundation.org/libreoffice/old/5.2.7.2/rpm/x86_64/LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm_helppack_zh-CN.tar.gz
如果用 wget 速度几k到几十k不等/s 的话; 那推荐用迅雷下载到本地;在传到服务器的 /usr/local 目录; 把下载的这几个文件批量解压了;
ls LibreOffice_5.2.7_www.7727s.com_x86-64_rpm* | xargs -n1 tar -zxvf
依次安装;
sudo yum -y install ./LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm/RPMS/*.rpm
sudo yum -y install ./LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm_langpack_zh-CN/RPMS/*.rpm
sudo yum -y install ./LibreOffice_5.2.7.2_www.7727s.com_x86-64_rpm_helppack_zh-CN/RPMS/*.rpm
安装成功后到 /opt/libreoffice5.2 目录下载 unoconv; 这是一个用来方便调用命令把 word 转成 pdf 的工具;
cd /opt/libreoffice5.2
wget http://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv
给予权限并链接;
chmod +x unoconv
sudo ln -s /opt/libreoffice5.2/unoconv /usr/bin/unoconv
这个时候虽然说已经可以转换了; 但是中文是会乱码的; 创建字体文件目录;
mkdir /usr/share/fonts/Windows
然后把 C:\Windows\Fonts 中的所有字体上传到 /usr/share/fonts/Windows 给予权限并刷新;
sudo chmod -R 755 /usr/share/fonts/Windows
sudo fc-cache -fv
再来个转换的函数;
if (! function_exists('word_to_pdf')){
/**
* 把word转pdf
*
* @param $wordPath
* @param $pdfPath
* @return string
*/
function word_to_pdf($wordPath, $pdfPath)
{
set_time_limit(0);
putenv('HOME=/home/apache/');
// 生成pdf文件
shell_exec('/usr/bin/unoconv -f pdf -o ' . $pdfPath . ' ' . $wordPath);
}
}
最后需要注意的是如果是使用的是 nginx ;
php-fpm 的 user 不要是 nobody;
一般是 nginx 或者 www;
如果没有如期生成 pdf 文件;
使用 su nginx 或者 su www 后要手动执行 shell_exec 中的命令;
根据错误提示解决;
本文为www.7727s.com原创文章,转载无需和我联系,但请注明来自www.7727s.com博客 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
最新评论