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

994914376發表於2019-08-14

應公司需求需要線上生成合同資訊,合同是一個 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 協議》,轉載必須註明作者和本文連結

相關文章