利用Python的Django框架生成PDF文件的教程
便攜文檔格式 (PDF) 是由 Adobe 開(kāi)發(fā)的格式,主要用于呈現(xiàn)可打印的文檔,其中包含有 pixel-perfect 格式,嵌入字體以及2D矢量圖像。 You can think of a PDF document as the digital equivalent of a printed document; indeed, PDFs are often used in distributing documents for the purpose of printing them.
可以方便的使用 Python 和 Django 生成 PDF 文檔需要?dú)w功于一個(gè)出色的開(kāi)源庫(kù), ReportLab (http://www.reportlab.org/rl_toolkit.html) 。動(dòng)態(tài)生成 PDF 文件的好處是在不同的情況下,如不同的用戶或者不同的內(nèi)容,可以按需生成不同的 PDF 文件。 The advantage of generating PDF files dynamically is that you can create customized PDFs for different purposes say, for different users or different pieces of content.
下面的例子是使用 Django 和 ReportLab 在 KUSports.com 上生成個(gè)性化的可打印的 NCAA 賽程表 (tournament brackets) 。
安裝 ReportLab
在生成 PDF 文件之前,需要安裝 ReportLab 庫(kù)。這通常是個(gè)很簡(jiǎn)單的過(guò)程: Its usually simple: just download and install the library from http://www.reportlab.org/downloads.html.
Note
如果使用的是一些新的 Linux 發(fā)行版,則在安裝前可以先檢查包管理軟件。 多數(shù)軟件包倉(cāng)庫(kù)中都加入了 ReportLab 。
比如,如果使用(杰出的) Ubuntu 發(fā)行版,只需要簡(jiǎn)單的 apt-get install python-reportlab 一行命令即可完成安裝。
使用手冊(cè)(原始的只有 PDF 格式)可以從 http://www.reportlab.org/rsrc/userguide.pdf 下載,其中包含有一些其它的安裝指南。
在 Python 交互環(huán)境中導(dǎo)入這個(gè)軟件包以檢查安裝是否成功。
>>> import reportlab
如果剛才那條命令沒(méi)有出現(xiàn)任何錯(cuò)誤,則表明安裝成功。
編寫(xiě)視圖
和 CSV 類似,由 Django 動(dòng)態(tài)生成 PDF 文件很簡(jiǎn)單,因?yàn)?ReportLab API 同樣可以使用類似文件對(duì)象。
下面是一個(gè) Hello World 的示例:
from reportlab.pdfgen import canvas from django.http import HttpResponse def hello_pdf(request): # Create the HttpResponse object with the appropriate PDF headers. response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=hello.pdf' # Create the PDF object, using the response object as its "file." p = canvas.Canvas(response) # Draw things on the PDF. Here's where the PDF generation happens. # See the ReportLab documentation for the full list of functionality. p.drawString(100, 100, "Hello world.") # Close the PDF object cleanly, and we're done. p.showPage() p.save() return response
需要注意以下幾點(diǎn):
這里我們使用的 MIME 類型是 application/pdf 。這會(huì)告訴瀏覽器這個(gè)文檔是一個(gè) PDF 文檔,而不是 HTML 文檔。 如果忽略了這個(gè)參數(shù),瀏覽器可能會(huì)把這個(gè)文件看成 HTML 文檔,這會(huì)使瀏覽器的窗口中出現(xiàn)很奇怪的文字。 If you leave off this information, browsers will probably interpret the response as HTML, which will result in scary gobbledygook in the browser window.
使用 ReportLab 的 API 很簡(jiǎn)單: 只需要將 response 對(duì)象作為 canvas.Canvas 的第一個(gè)參數(shù)傳入。
所有后續(xù)的 PDF 生成方法需要由 PDF 對(duì)象調(diào)用(在本例中是 p ),而不是 response 對(duì)象。
最后需要對(duì) PDF 文件調(diào)用 showPage() 和 save() 方法(否則你會(huì)得到一個(gè)損壞的 PDF 文件)。
復(fù)雜的 PDF 文件
如果您在創(chuàng)建一個(gè)復(fù)雜的 PDF 文檔(或者任何較大的數(shù)據(jù)塊),請(qǐng)使用 cStringIO 庫(kù)存放臨時(shí)生成的 PDF 文件。 cStringIO 提供了一個(gè)用 C 編寫(xiě)的類似文件對(duì)象的接口,從而可以使系統(tǒng)的效率最高。
下面是使用 cStringIO 重寫(xiě)的 Hello World 例子:
from cStringIO import StringIO from reportlab.pdfgen import canvas from django.http import HttpResponse def hello_pdf(request): # Create the HttpResponse object with the appropriate PDF headers. response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=hello.pdf' temp = StringIO() # Create the PDF object, using the StringIO object as its "file." p = canvas.Canvas(temp) # Draw things on the PDF. Here's where the PDF generation happens. # See the ReportLab documentation for the full list of functionality. p.drawString(100, 100, "Hello world.") # Close the PDF object cleanly. p.showPage() p.save() # Get the value of the StringIO buffer and write it to the response. response.write(temp.getvalue()) return response
其它的可能性
使用 Python 可以生成許多其它類型的內(nèi)容,下面介紹的是一些其它的想法和一些可以用以實(shí)現(xiàn)它們的庫(kù)。 Here are a few more ideas and some pointers to libraries you could use to implement them:
ZIP 文件 :Python 標(biāo)準(zhǔn)庫(kù)中包含有 zipfile 模塊,它可以讀和寫(xiě)壓縮的 ZIP 文件。 它可以用于按需生成一些文件的壓縮包,或者在需要時(shí)壓縮大的文檔。 如果是 TAR 文件則可以使用標(biāo)準(zhǔn)庫(kù) tarfile 模塊。
動(dòng)態(tài)圖片 : Python 圖片處理庫(kù) (PIL; http://www.pythonware.com/products/pil/) 是極好的生成圖片(PNG, JPEG, GIF 以及其它許多格式)的工具。 它可以用于自動(dòng)為圖片生成縮略圖,將多張圖片壓縮到單獨(dú)的框架中,或者是做基于 Web 的圖片處理。
圖表 : Python 有許多出色并且強(qiáng)大的圖表庫(kù)用以繪制圖表,按需地圖,表格等。 我們不可能將它們?nèi)苛谐?,所以下面列出的是個(gè)中的翹楚。
matplotlib (http://matplotlib.sourceforge.net/) 可以用于生成通常是由 matlab 或者 Mathematica 生成的高質(zhì)量圖表。
pygraphviz (https://networkx.lanl.gov/wiki/pygraphviz) 是一個(gè) Graphviz 圖形布局的工具 (http://graphviz.org/) 的 Python 接口,可以用于生成結(jié)構(gòu)化的圖表和網(wǎng)絡(luò)。
總之,所有可以寫(xiě)文件的庫(kù)都可以與 Django 同時(shí)使用。 The possibilities are immense.
我們已經(jīng)了解了生成“非HTML”內(nèi)容的基本知識(shí),讓我們進(jìn)一步總結(jié)一下。 Django擁有很多用以生成各類“非HTML”內(nèi)容的內(nèi)置工具。
- Python+django實(shí)現(xiàn)文件下載
- 在Python的Django框架中生成CSV文件的方法
- 在Python的Django框架中用流響應(yīng)生成CSV文件的教程
- Python+django實(shí)現(xiàn)文件上傳
- Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳
- Python的Django中將文件上傳至七牛云存儲(chǔ)的代碼分享
- 在Python的Django框架中創(chuàng)建語(yǔ)言文件
- Python的Django框架中settings文件的部署建議
- python django下載大的csv文件實(shí)現(xiàn)方法分析
相關(guān)文章
基于Python編寫(xiě)簡(jiǎn)易的成語(yǔ)接龍游戲
成語(yǔ)接龍是中華民族傳統(tǒng)的文字游戲。它歷史悠久,是傳統(tǒng)文字、文化、文明的一個(gè)縮影,也是老少皆宜的民間文化娛樂(lè)活動(dòng)。本文將用Python制作一個(gè)簡(jiǎn)單的成語(yǔ)接龍游戲,需要的可以參考一下2022-03-03python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之雙端隊(duì)列詳解
這篇文章主要介紹了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之雙端隊(duì)列,詳細(xì)講述了雙端隊(duì)列的概念、功能、定義及Python實(shí)現(xiàn)與使用雙端隊(duì)列的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python編程快速上手——正則表達(dá)式查找功能案例分析
這篇文章主要介紹了Python正則表達(dá)式查找功能,結(jié)合具體實(shí)例形式分析了Python基于正則表達(dá)式遍歷查找指定格式文件的相關(guān)操作技巧,需要的朋友可以參考下2020-02-02編寫(xiě)Python腳本批量下載DesktopNexus壁紙的教程
這篇文章主要介紹了編寫(xiě)Python腳本批量下載DesktopNexus壁紙的教程,相較于普通的爬蟲(chóng)抓取,本文的下載壁紙教程還包括了設(shè)置所要下載的分辨率等功能的實(shí)現(xiàn),需要的朋友可以參考下2015-05-05Python isalpha()函數(shù)的具體使用方法詳解
這篇文章主要介紹了Python isalpha()函數(shù)的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07