Django生成PDF文檔顯示在網(wǎng)頁(yè)上以及解決PDF中文顯示亂碼的問(wèn)題
項(xiàng)目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
這個(gè)demo實(shí)現(xiàn)了通過(guò)用戶輸入自己的個(gè)人信息生成一份簡(jiǎn)歷pdf,來(lái)闡述如何使用Django的HttpResponse生成PDF的文檔。
先上效果圖:



安裝依賴庫(kù)
首先安裝Django最新版2.2.2和PDF依賴包xhtml2pdf
pip install django pip install xhtml2pdf
編寫(xiě)表單驗(yàn)證
為了簡(jiǎn)單起見(jiàn),這個(gè)demo依賴數(shù)據(jù)庫(kù),只需要表單驗(yàn)證數(shù)據(jù)即可
pdf/forms.py
class MessageForm(forms.Form): ''' 表單驗(yàn)證 ''' name = forms.CharField(required=True) degree = forms.CharField(required=True) edu = forms.CharField(required=True) work = forms.CharField(required=True) tech = forms.CharField(required=True) phone = forms.CharField(required=True)
編寫(xiě)類視圖
pdf/views.py
由于這里我們只需要表單視圖,所以只創(chuàng)建了一個(gè)類視圖,post用來(lái)驗(yàn)證表單數(shù)據(jù)是否都存在,如果存在就把表單數(shù)據(jù)渲染到PDF模板中,經(jīng)過(guò)處理后返回PDF的響應(yīng)response。
這里可以使用Django的通用類視圖FormView構(gòu)建,代碼更簡(jiǎn)潔
class MessageView(View):
def get(self, request):
form = MessageForm(data=request.GET)
return render(request, 'index.html', {
'form': form
})
def post(self, request):
form = MessageForm(data=request.POST)
if form.is_valid():
response = generate_pdf_response(context=form.cleaned_data)
return response
return redirect(reverse('pdf:message'))
編寫(xiě)生成PDF響應(yīng)response
view.py這里為了方便直接把處理函數(shù)寫(xiě)到視圖函數(shù)的文件里
def link_callback(uri):
if uri.startswith(settings.MEDIA_URL):
path = os.path.join(settings.MEDIA_ROOT,
uri.replace(settings.MEDIA_URL, ""))
elif uri.startswith(settings.STATIC_URL):
path = os.path.join(settings.STATIC_ROOT,
uri.replace(settings.STATIC_URL, ""))
else:
return uri
# 確保本地文件存在
if not os.path.isfile(path):
raise Exception(
"Media URI 必須以以下格式開(kāi)頭"
f"'{settings.MEDIA_URL}' or '{settings.STATIC_URL}'")
return path
def generate_pdf_response(context):
response = HttpResponse(content_type="application/pdf")
response["Content-Disposition"] = \
f"attachment; filename='{context['name']}.pdf'"
html = render_to_string("pdf.html", context=context)
status = pisa.CreatePDF(html,
dest=response,
link_callback=link_callback)
if status.err:
return HttpResponse("PDF文件生成失敗")
return response
解決中文亂碼問(wèn)題
需要下載中文字體msyh.ttf放在static目錄下的font目錄,用來(lái)設(shè)置全局字體。這些文件都在github倉(cāng)庫(kù)里。
def font_patch():
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from xhtml2pdf.default import DEFAULT_FONT
pdfmetrics.registerFont(TTFont('yh', '{}/font/msyh.ttf'.format(
settings.STATICFILES_DIRS[0])))
DEFAULT_FONT['helvetica'] = 'yh'
把這個(gè)函數(shù)放在生成PDF響應(yīng)前

按照以上大致步驟大家就能夠生成PDF文件了,可以在網(wǎng)頁(yè)中瀏覽、放大、縮小,也可以下載,非常方便、簡(jiǎn)單。
大家可以直接clone一份代碼試試效果
項(xiàng)目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行
這篇文章主要介紹了python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python實(shí)現(xiàn)txt文件格式轉(zhuǎn)換為arff格式
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)txt文件格式轉(zhuǎn)換為arff格式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
如何通過(guò)Python收集MySQL MHA 部署及運(yùn)行狀態(tài)信息的功能
本篇幅主要介紹如何通過(guò)Python實(shí)現(xiàn)收集MHA 集群 節(jié)點(diǎn)信息 和 運(yùn)行狀態(tài)的功能。這些信息將是CMDB信息的重要組成部分,感興趣的朋友一起看看吧2021-10-10
關(guān)于Qt6中QtMultimedia多媒體模塊的重大改變分析
如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對(duì)您的實(shí)現(xiàn)進(jìn)行更改。這篇博文將嘗試引導(dǎo)您完成最大的變化,同時(shí)查看 API 和內(nèi)部結(jié)構(gòu)2021-09-09
python基礎(chǔ)篇之pandas常用基本函數(shù)匯總
Pandas是一個(gè)python數(shù)據(jù)分析庫(kù),它提供了許多函數(shù)和方法來(lái)加快數(shù)據(jù)分析過(guò)程,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)篇之pandas常用基本函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-07-07
Python基于Socket實(shí)現(xiàn)的簡(jiǎn)單聊天程序示例
這篇文章主要介紹了Python基于Socket實(shí)現(xiàn)的簡(jiǎn)單聊天程序,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python聊天程序的客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn)
本文主要介紹了python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

