1. 程式人生 > >五分鐘上線——函式計算 Word 轉 PDF 雲服務

五分鐘上線——函式計算 Word 轉 PDF 雲服務

函式計算的按呼叫量收費,動態伸縮特性使其比較適合部署線上轉化工具(如:圖片裁剪,網頁轉圖片,文字轉音訊)。這類轉換工具通常考慮是 cpp 實現,最終編譯成二進位制的命令列工具或動態連結庫。而函式計算支援多種語言執行時,採用 HTTP 協議進行遠端呼叫,也非常適用於異構模式。本文將介紹如何基於 fc-libreoffice 專案快速搭建一個 Word 轉  PDF 的雲服務。

fc-libreoffice 是一個基於 nodejs 進行介面封裝的 npm,其中內建了針對函式計算 執行時預編譯的 libreoffice 。雖然 libreoffice 已經經過裁剪,並使用壓縮比較高的

Brotli 演算法進行壓縮。但最終的壓縮包大小為 84M,超過了函式計算 50M 壓縮包的大小限制。所以示例專案採用上傳 OSS,執行時預下載並解壓 libreoffice。下文將側重於快速搭建 libreoffice 雲服務,呼叫幾個指令碼封裝的 make 命令即可快速體驗。

依賴工具

  • docker-ce 安裝方法參考官方安裝文件
  • fun 一款函式計算的編排工具,用於快速部署函式計算應用。

    MacOS 平臺可以使用如下方法安裝

    brew tap vangie/formula
    brew install fun

    其他平臺可以通過 npm 安裝

    npm install @alicloud/fun -g
  • ossutil oss 的命令列工具。將其下載並放置到 $PATH 所在目錄。

克隆專案

fc-libreoffiice 專案下有一個 example 專案,進行簡單配置就可以快速部署。

# 克隆專案
git clone https://github.com/awesome-fc/fc-libreoffice.git

# 進入示例工程目錄
cd fc-libreoffice/example

修改配置檔案

# 配置 .env 檔案
cp env.example .env

填充 .env 檔案裡的環境變數

# 阿里雲 AK。建議使用主 AK,fun 部署需要角色修改許可權。
ALIBABA_CLOUD_ACCESS_KEY_ID=
ALIBABA_CLOUD_ACCESS_KEY_SECRET=

# 阿里雲賬戶 ID。去阿里雲賬戶中心可以查到
ALIBABA_CLOUD_ACCOUNT_ID=

# 部署的 region
ALIBABA_CLOUD_DEFAULT_REGION=

# 用於上傳 liboffice 壓縮檔案的 oss bucket,請先去 oss 控制檯建立一個
OSS_BUCKET=

部署函式並驗證效果

部署函式,此過程中會安裝依賴,上傳 OSS,並部署函式到函式計算平臺

$ make deploy
.... (此處略去了大量輸出內容)

Waiting for service libre-svc to be deployed...
        Waiting for function libre-fun to be deployed...
                Waiting for packaging function libre-fun code...
                package function libre-fun code done
        function libre-fun deploy success
service libre-svc deploy success

呼叫函式,將預製的 example.docx 檔案轉換層 example.pdf 檔案,並上傳到 OSS。

$ make invoke
bin/invoke.sh
+ fcli function invoke -s libre-svc -f libre-fun
{"name":"example.pdf","url":"http://vangie-test.oss-cn-shanghai-internal.aliyuncs.com/example.pdf","res":{"status":200,"statusCode":200,"headers":{"server":"AliyunOSS","date":"Sat, 01 Dec 2018 03:42:25 GMT","content-length":"0","connection":"keep-alive","x-oss-request-id":"5C02032129DDF1C134B9BC7C","x-oss-event-status":"eyJSZXN1bHQiOiAiT2sifQ==","etag":"\"94829EEB576E66A2B5760DD034EECB0B\"","x-oss-hash-crc64ecma":"5833133482735102142","content-md5":"lIKe61duZqK1dg3QNO7LCw==","x-oss-server-time":"60"},"size":0,"aborted":false,"rt":83,"keepAliveSocket":true,"data":{"type":"Buffer","data":[]},"requestUrls":["http://vangie-test.oss-cn-shanghai-internal.aliyuncs.com/example.pdf"],"timing":null,"remoteAddress":"100.118.102.36","remotePort":80,"socketHandledRequests":3,"socketHandledResponses":3}}

從 OSS 下載 example.pdf 到當前目錄,檢視轉換後的結果。

$ make download
bin/download.sh
Succeed: Total num: 1, size: 33,811. OK num: 1(download 1 objects).
0.192966(s) elapsed

下面是轉換後的結果,左圖為 word 原始檔,右圖為生成的 pdf 檔案。中文和內嵌圖片都效果不錯。

_2018_12_01_11_47_56

小結

fc-libreoffcie/example 僅僅是一個示例專案,對於正在的生產環境應用,還有不少的優化空間,比如下載檔案的完整性校驗、流式解壓、支援 http 介面輸入原始檔和輸出目標檔案、使用 time trigger 進行預熱以減少冷啟動開銷等。上面幾個簡單的 make 命令背後呼叫了一些 bash 指令碼編寫的自動化步驟,這些步驟涉及到一些常用的函式計算領域的方法和技巧,如果您對 libreoffice 的移植過程比較感興趣可以閱讀另一篇文章《手把手教您將 libreoffice 移植到函式計算平臺》或者你可以直接閱讀 fc-libreoffice 的原始碼。