Python實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF的方法分析
本文實(shí)例講述了Python實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF的方法。分享給大家供大家參考,具體如下:
主要使用的是wkhtmltopdf的Python封裝——pdfkit
安裝
1. Install python-pdfkit:
$ pip install pdfkit
2. Install wkhtmltopdf:
- Debian/Ubuntu:
$ sudo apt-get install wkhtmltopdf
- Redhat/CentOS
sudo yum intsall wkhtmltopdf
- MacOS
brew install Caskroom/cask/wkhtmltopdf
使用
一個(gè)簡(jiǎn)單的例子:
import pdfkit pdfkit.from_url('http://google.com', 'out.pdf') pdfkit.from_file('test.html', 'out.pdf') pdfkit.from_string('Hello!', 'out.pdf')
你也可以傳遞一個(gè)url或者文件名列表:
pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf') pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')
也可以傳遞一個(gè)打開(kāi)的文件:
with open('file.html') as f: pdfkit.from_file(f, 'out.pdf')
如果你想對(duì)生成的PDF作進(jìn)一步處理, 你可以將其讀取到一個(gè)變量中:
# 設(shè)置輸出文件為False,將結(jié)果賦給一個(gè)變量 pdf = pdfkit.from_url('http://google.com', False)
你可以制定所有的 wkhtmltopdf 選項(xiàng) <http://wkhtmltopdf.org/usage/wkhtmltopdf.txt>. 你可以移除選項(xiàng)名字前面的 '--' .如果選項(xiàng)沒(méi)有值, 使用None, Falseor * 作為字典值:
options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None } pdfkit.from_url('http://google.com', 'out.pdf', options=options)
默認(rèn)情況下, PDFKit 將會(huì)顯示所有的 wkhtmltopdf 輸出. 如果你不想看到這些信息,你需要傳遞一個(gè) quiet 選項(xiàng):
options = { 'quiet': '' } pdfkit.from_url('google.com', 'out.pdf', options=options)
由于wkhtmltopdf的命令語(yǔ)法 , TOC 和 Cover 選項(xiàng)必須分開(kāi)指定:
toc = { 'xsl-style-sheet': 'toc.xsl' } cover = 'cover.html' pdfkit.from_file('file.html', options=options, toc=toc, cover=cover)
當(dāng)你轉(zhuǎn)換文件、或字符串的時(shí)候,你可以通過(guò)css選項(xiàng)指定擴(kuò)展的 CSS 文件。
# 單個(gè) CSS 文件 css = 'example.css' pdfkit.from_file('file.html', options=options, css=css) # Multiple CSS files css = ['example.css', 'example2.css'] pdfkit.from_file('file.html', options=options, css=css)
你也可以通過(guò)你的HTML中的meta tags傳遞任意選項(xiàng):
body = """ <html> <head> <meta name="pdfkit-page-size" content="Legal"/> <meta name="pdfkit-orientation" content="Landscape"/> </head> Hello World! </html> """ pdfkit.from_string(body, 'out.pdf') #with --page-size=Legal and --orientation=Landscape
配置
每個(gè)API調(diào)用都有一個(gè)可選的參數(shù)。這應(yīng)該是pdfkit.configuration()
API 調(diào)用的一個(gè)實(shí)例. 采用configuration 選項(xiàng)作為初始化參數(shù)??捎玫倪x項(xiàng)有:
- wkhtmltopdf ——wkhtmltopdf二進(jìn)制文件所在的位置。默認(rèn)情況下pdfkit 會(huì)嘗試使用which (在類(lèi)UNIX系統(tǒng)中) 或 where (在Windows系統(tǒng)中)來(lái)判斷.
- meta_tag_prefix -- pdfkit的前綴指定 meta tags(元標(biāo)簽) - 默認(rèn)情況是pdfkit-
示例 :針對(duì)wkhtmltopdf不在系統(tǒng)路徑中(不在$PATH里面):
config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf')) pdfkit.from_string(html_string, output_file, configuration=config)
問(wèn)題
- IOError: 'No wkhtmltopdf executable found':
確保 wkhtmltopdf 在你的系統(tǒng)路徑中($PATH), 會(huì)通過(guò) configuration進(jìn)行了配置 (詳情看上文描述)。 在Windows系統(tǒng)中使用where wkhtmltopdf命令 或 在 linux系統(tǒng)中使用 which wkhtmltopdf 會(huì)返回 wkhtmltopdf二進(jìn)制可執(zhí)行文件所在的確切位置.
- IOError: 'Command Failed'
如果出現(xiàn)這個(gè)錯(cuò)誤意味著 PDFKit不能處理一個(gè)輸入。你可以嘗試直接在錯(cuò)誤信息后面直接運(yùn)行一個(gè)命令來(lái)查看是什么導(dǎo)致了這個(gè)錯(cuò)誤 (某些版本的 wkhtmltopdf會(huì)因?yàn)槎五e(cuò)誤導(dǎo)致處理失?。?/p>
- 正常生成,但是出現(xiàn)中文亂碼
確保兩項(xiàng):
1)、你的系統(tǒng)中有中文字體
2)、在html中加入<meta charset="UTF-8">
下面是我隨便寫(xiě)的一個(gè)HTML表格:
<html> <head><meta charset="UTF-8"></head> <body> <table width="400" border="1"> <tr> <th align="left">Item....</th> <th align="right">1</th> </tr> <tr> <td align="left">衣服</td> <td align="right">$241.10</td> </tr> <tr> <td align="left">化妝品</td> <td align="right">$30.00</td> </tr> <tr> <td align="left">食物</td> <td align="right">$730.40</td> </tr> <tr> <th align="left">tOTAL</th> <th align="right">$1001.50</th> </tr> </table> </body> </html>
下面是生成的PDF截圖
另:https://pdfcrowd.com/#convert_by_input
更多Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python文件與目錄操作技巧匯總》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Pytorch+PyG實(shí)現(xiàn)GraphSAGE過(guò)程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實(shí)現(xiàn)GraphSAGE過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Django Rest framework三種分頁(yè)方式詳解
這篇文章主要介紹了Django Rest framework三種分頁(yè)方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解
這篇文章主要介紹了Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊)
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04NumPy實(shí)現(xiàn)多維數(shù)組中的線性代數(shù)
本文主要介紹了NumPy實(shí)現(xiàn)多維數(shù)組中的線性代數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Python實(shí)現(xiàn)拉格朗日插值法的示例詳解
插值法是一種數(shù)學(xué)方法,用于在已知數(shù)據(jù)點(diǎn)(離散數(shù)據(jù))之間插入數(shù)據(jù),以生成連續(xù)的函數(shù)曲線,而格朗日插值法是一種多項(xiàng)式插值法。本文就來(lái)用Python實(shí)現(xiàn)拉格朗日插值法,希望對(duì)大家有所幫助2023-02-02Django 通過(guò)JS實(shí)現(xiàn)ajax過(guò)程詳解
這篇文章主要介紹了Django 通過(guò)JS實(shí)現(xiàn)ajax過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07