歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python中使用pdfkit 如何生成 PDF 文檔?

發(fā)布時(shí)間:2018-04-23 22:26  回復(fù):0  查看:4144   最后回復(fù):2018-04-23 22:26  
本文和大家分享的主要是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 \
  --repository  http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \
  --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ò)
您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?