Django生成PDF文檔顯示網(wǎng)頁(yè)上以及PDF中文顯示亂碼的解決方法
項(xiàng)目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
這個(gè)demo實(shí)現(xiàn)了通過用戶輸入自己的個(gè)人信息生成一份簡(jiǎn)歷pdf,來(lái)闡述如何使用Django的HttpResponse生成PDF的文檔。
先上效果圖:
安裝依賴庫(kù)
首先安裝Django最新版2.2.2和PDF依賴包xhtml2pdf
pip install django pip install xhtml2pdf
編寫表單驗(yà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)
編寫類視圖
pdf/views.py
由于這里我們只需要表單視圖,所以只創(chuàng)建了一個(gè)類視圖,post用來(lái)驗(yàn)證表單數(shù)據(jù)是否都存在,如果存在就把表單數(shù)據(jù)渲染到PDF模板中,經(jīng)過處理后返回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'))
編寫生成PDF響應(yīng)response
view.py這里為了方便直接把處理函數(shù)寫到視圖函數(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 必須以以下格式開頭" 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
解決中文亂碼問題
需要下載中文字體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一份代碼試試效果
以上這篇Django生成PDF文檔顯示網(wǎng)頁(yè)上以及PDF中文顯示亂碼的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python+Turtle實(shí)現(xiàn)繪制簡(jiǎn)易的大風(fēng)車
大風(fēng)車,吱呀吱呦呦地轉(zhuǎn),這里的風(fēng)景呀真好看!天好看,地好看……一首熟悉的歌曲,是否已經(jīng)把你拉回了童年?本文將用Turtle庫(kù)繪制簡(jiǎn)易的大風(fēng)車,需要的可以參考一下2022-06-06Python數(shù)據(jù)分析處理(三)--運(yùn)動(dòng)員信息的分組與聚合
這篇文章主要介紹了Python數(shù)據(jù)清洗與處理?運(yùn)動(dòng)員信息的分組與聚合,根據(jù)Python數(shù)據(jù)清洗與處理?的相關(guān)資料展開運(yùn)動(dòng)員信息的分組與聚合的文章內(nèi)容,需要的朋友可以參考一下2021-12-12【python】matplotlib動(dòng)態(tài)顯示詳解
這篇文章主要介紹了matplotlib動(dòng)態(tài)顯示,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤
這篇文章主要介紹了python 使用三引號(hào)時(shí)容易犯的小錯(cuò)誤,幫助新手學(xué)習(xí),避免入坑,感興趣的朋友可以了解下2020-10-10Python畫圖小案例之多啦A夢(mèng)叮當(dāng)貓超詳細(xì)注釋
在看了很多Python教程之后,覺得是時(shí)候做點(diǎn)什么小項(xiàng)目來(lái)練練手了,于是想來(lái)想去,用python寫了一個(gè)童年記憶的卡通人物哆啦A夢(mèng),代碼注釋無(wú)比詳細(xì)清楚,快來(lái)看看吧2021-09-09Python利用PyExecJS庫(kù)執(zhí)行JS函數(shù)的案例分析
這篇文章主要介紹了Python利用PyExecJS庫(kù)執(zhí)行JS函數(shù),本文通過案例分析給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12