本文和大家分享的主要是python
中使用pdfkit
生成
PDF
文檔相關(guān)內(nèi)容,一起來看看吧,希望對(duì)大家
學(xué)習(xí)python有所幫助。
pdfkit 方案
pdfkit
這個(gè)庫是一個(gè)叫做
wkhtmltopdf
的開源項(xiàng)目的一個(gè) Wrapper
, 它就直接調(diào)用
wkhtmltopdf
的命令行工具實(shí)現(xiàn)生成
PDF
文檔的功能,所以需要安裝
wkhtmltopdf
才能使用。
pdfkit
的
API
非常簡(jiǎn)單,它就三個(gè)函數(shù),分別支持從
URL
、文件或者字符串傳入
HTML
文檔, 然后根據(jù)傳入的文件名參數(shù)輸出一個(gè)
PDF
文檔。 控制
PDF
的輸出樣式可以傳入一個(gè)叫
options
的字典作為參數(shù),支持的選項(xiàng)都是
wkhtmltopdf
的選項(xiàng), 官方文檔里面有很詳細(xì)的說明。 此外
pdfkit
文檔還給出了一個(gè)自定義
CSS
的使用樣例,不過我沒有用上。
最后我用 Flask
做了一個(gè)
API
,用
POST
傳進(jìn)來的數(shù)據(jù)渲染一個(gè)
HTML
模板,然后把
HTML
交給
pdfkit
, 處理一下文件名生成策略和文件存儲(chǔ),這個(gè)
API
就搞成了。 結(jié)論是
pdfkit
還是蠻好用的,雖然速度不算很快。
開發(fā)起來很容易,部署時(shí)候遇到了一點(diǎn)小問題,主要是 wkhtmltopdf
和字體的問題。 我用
Docker
部署
API
,基礎(chǔ)鏡像用的是
Python on Alpine
。 在
Mac
上我直接用
brew
安裝了
wkhtmltopdf
就可以用了,但是
Linux
服務(wù)器上需要額外處理一下。
首先,Alpine
的主倉庫里還沒有
wkhtmltopdf
,所以需要從
testing
倉庫來安裝:
apk add --no-cache qt5-qtbase-dev wkhtmltopdf \
--allow-untrusted
此外,服務(wù)器上沒有 X
,所以用
xvfb
來代替,并且安裝了字體管理器。
apk add --no-cache tzdata xvfb ttf-freefont fontconfig dbus
然后把系統(tǒng)安裝的 wkhtmltopdf
可執(zhí)行文件改名為
wkhtmltopdf-origin
, 用下面這個(gè)腳本替代
wkhtmltopdf
命令,記得加執(zhí)行權(quán)限:
#!/usr/bin/env sh
Xvfb :0 -screen 0 1024x768x24 -ac +extension GLX +render -noreset &DISPLAY=:0.0 wkhtmltopdf-origin
[email protected]
killall Xvfb
這樣修改完之后,因?yàn)槿鄙僮煮w,所以打印出來中文會(huì)亂碼。
因?yàn)槲臋n樣式要求,我沒有安裝開源字體,
而是直接把 Mac
里的
Songti.ttc
拷貝到了
Docker
鏡像里面, 字體文件直接放在了系統(tǒng)
/usr/share/fonts/
目錄。
另一個(gè)沒實(shí)現(xiàn)方案
使用 pdfkit
之前,我本來打算用
LaTeX
來實(shí)現(xiàn)
PDF
生成,思路大概是這樣的。
首先寫一個(gè) LaTeX
模板,用
Pandoc
把傳入的數(shù)據(jù)渲染進(jìn) LaTeX
模板,生成
tex
源碼文件。 然后用
pdflatex
生成 PDF
,返回地址。
這個(gè)方案主要的缺點(diǎn)是 Python
需要直接和很多系統(tǒng)命令打交道,好用的
Wrapper
得額外開發(fā)。 另外需要安裝的東西比較多,
Pandoc
和
LaTeX
是必須的,中文字體也一樣需要額外安裝。 不過如果有要求的話,
LaTeX
排版效果會(huì)更好一點(diǎn),速度的話我這個(gè)小文檔兩者感覺差不多。
Docker
里安裝
Pandoc
沒問題,
LaTeX
的話裝
Texlive
就太大了,也沒必要。 我找到有一個(gè)
MiKTeX
的
Docker 鏡像
,大小還可以,如果需要以后可以用。
docker run -it -v miktex:/miktex/.miktex -v `pwd`:/miktex/work miktex/miktex \
pdflatex main.tex
第一次生成 PDF
時(shí)會(huì)從網(wǎng)絡(luò)上下載一些依賴包,之后再生成同一個(gè)模板制作的
PDF
,速度還是很快的。
來源:網(wǎng)絡(luò)