2019/10/17 :補充更新
參考這篇就可以了,pptraas.com可以處理中文問題
—————————————————————————–
原則上,
HTML 產出 PDF的方法很多種,最出名的大概就是wkhtmltopdf了
今天要介紹的是另一種我認為目前最簡便的方式 :
- 透過Chrome Headless 模擬將網頁列印成PDF
- 透過現成的docker image (puppeteer)啟動Chrome Headless服務
如果不曉得什麼事puppeteer可以先參考
https://ithelp.ithome.com.tw/articles/10199544
其實只要依照下方參考文件直接啟動puppeteer docker image就可以產出PDF了,本篇的重點在於”中文”
需要在套件中多安裝中文語言套件才可以正確將中文網頁轉換成PDF檔案,否則中文字都會變成亂碼
如果你對docker還不熟悉,可以先閱讀以下文章
docker 小工具 : Kitematic 與 懶人指令包
參考文件
https://hub.docker.com/r/zenato/puppeteer-renderer
https://github.com/zenato/puppeteer-renderer
https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
如何加入中文字型套件?
這就是今天的重點了,首先到原作的github上,將整個專案下載下來
你會找到一個Dockerfile 檔案,透過編輯器來編輯他
1 2 3 4 5 6 7 8 9 10 11 12 13 |
FROM zenato/puppeteer USER root COPY . /app RUN cd /app && npm install --quiet EXPOSE 3000 WORKDIR /app CMD npm run start |
我們必須要將安裝中文字型檔的指令加入Dockerfile中,並且重新打包image
根據puppeteer github上issue的討論需要加入以下指令
1 2 3 4 5 6 |
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ && apt-get update \ && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* |
因此編輯完成的Dockerfile將變成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
FROM zenato/puppeteer USER root RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ && apt-get update \ && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* COPY . /app RUN cd /app && npm install --quiet EXPOSE 3000 WORKDIR /app CMD npm run start |
接著重新打包docker image
1 |
docker build -t IMAGENAME . --no-cache |
以上,完成
最後稍微說明一下如何使用
透過docker run 啟動image
1 |
docker run -d --name renderer -p 9999:3000 IMAGENAME |
當然,IMAGENAME就是剛剛build時輸入的,將著等待容器啟動後就可以透過URL來轉換PDF
1 |
http://localhost:9999/?url=https://www.google.com |
如果將上面的url輸入瀏覽器有看到網頁的話代表docker正確執行,後面接上參數就可以依照指令執行
Name | Required | Value | Description | Usage |
---|---|---|---|---|
url |
yes | Target URL | http://puppeteer-renderer?url=http://www.google.com |
|
type |
pdf or screenshot |
Rendering another type. | http://puppeteer-renderer?url=http://www.google.com&type=pdf |
|
(Extra options) | Extra options (see puppeteer API doc) | http://puppeteer-renderer?url=http://www.google.com&type=pdf&scale=2 |
範例1 :
1 |
http://localhost:9999/?url=https://www.google.com&type=screenshot |
範例2 :
1 |
http://localhost:9999/?url=https://www.google.com&type=pdf&printBackground=true |
option可以接哪些參數可以參考 puppeteer API doc