這篇文章給大家分享的是有關(guān)Django如何生成PDF文檔并顯示在網(wǎng)頁中的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、花山網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為花山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。這個demo實(shí)現(xiàn)了通過用戶輸入自己的個人信息生成一份簡歷pdf,來闡述如何使用Django的HttpResponse生成PDF的文檔。
先上效果圖:
安裝依賴庫
首先安裝Django最新版2.2.2和PDF依賴包xhtml2pdf
pip install django pip install xhtml2pdf
編寫表單驗證
為了簡單起見,這個demo依賴數(shù)據(jù)庫,只需要表單驗證數(shù)據(jù)即可pdf/forms.py
class MessageForm(forms.Form): ''' 表單驗證 ''' 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)建了一個類視圖,post用來驗證表單數(shù)據(jù)是否都存在,如果存在就把表單數(shù)據(jù)渲染到PDF模板中,經(jīng)過處理后返回PDF的響應(yīng)response。
這里可以使用Django的通用類視圖FormView構(gòu)建,代碼更簡潔
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目錄,用來設(shè)置全局字體。這些文件都在github倉庫里。
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'
把這個函數(shù)放在生成PDF響應(yīng)前
按照以上大致步驟大家就能夠生成PDF文件了,可以在網(wǎng)頁中瀏覽、放大、縮小,也可以下載,非常方便、簡單。
感謝各位的閱讀!關(guān)于“Django如何生成PDF文檔并顯示在網(wǎng)頁中”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。