應公司需求需要線上生成合同資訊,合同是一個 word 檔案裡面有些資訊需要透過資料庫讀取計算出並填寫到 word 文件中最終顯示線上 pdf 預覽功能,接下來我交大家如果實現該需求
1、首先我們要解決如果替換 word 文件中的資料,我使用的 phpword 包,安裝方式如下
composer require phpoffice/phpword
2、接下來實現如何替換文件內容
我們新建一個 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 協議》,轉載必須註明作者和本文連結