應公司需求需要線上生成合同資訊,合同是一個 world 檔案裡面有些資訊需要通過資料庫讀取計算出並填寫到 world 文件中最終顯示線上 pdf 預覽功能,接下來我交大家如果實現該需求
1、首先我們要解決如果替換 world 文件中的資料,我使用的 phpworld 包,安裝方式如下
composer require phpoffice/phpword
2、接下來實現如何替換文件內容
我們新建一個 aa.docx 的文件,裡面放了一個變數資訊
3、接下來使用 php 來替換這個變數資訊 程式碼如下
...
use PhpOffice\PhpWord\TemplateProcessor;
...
$path = storage_path('templateWorld/aa.docx');
// 生成world 存放目錄
$filePath = storage_path('world/contract.docx');
// 宣告模板象並讀取模板內容
$templateProcessor = new TemplateProcessor($path);
// 替換模板內容
$templateProcessor->setValue('contract', '北京乙方'); // 乙方
// 生成新的 world
$templateProcessor->saveAs($filePath);
這樣我們就完成了world 裡面模板變數的替換是不是比較簡單呢
4、接下來我們需要處理 world 文件轉為 pdf 我也在網上了查了比較多的資料,什麼先轉為 html 然後通過 其它包的方式或者擴充套件來轉 pdf 確實都能實現,但是有一點world 轉為 html 的時候格式會丟失這就和我們的需求有點偏離,後面轉換了方向,使用工具來把 world 轉為 pdf 這裡我推薦的工具為 unoconv
安裝方式如下
apt-get install unoconv
#如果報錯請求伺服器語言設定為 LANG=”en_US.UTF-8″
#使用命令把world 轉為 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')
如有疑問歡迎留言交流