Lumen 替換 world 裡面變數並匯出 PDF 圖片

994914376發表於2019-08-14

應公司需求需要線上生成合同資訊,合同是一個 world 檔案裡面有些資訊需要通過資料庫讀取計算出並填寫到 world 文件中最終顯示線上 pdf 預覽功能,接下來我交大家如果實現該需求

1、首先我們要解決如果替換 world 文件中的資料,我使用的 phpworld 包,安裝方式如下

    composer require phpoffice/phpword

2、接下來實現如何替換文件內容

lumen 替換 world 裡面變數並匯出pdf 圖片
我們新建一個 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')

如有疑問歡迎留言交流

相關文章