项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/masterhtml
这个demo实现了经过用户输入本身的我的信息生成一份简历pdf,来阐述如何使用Django的HttpResponse生成PDF的文档。python
先上效果图:
git
首先安装Django最新版2.2.2和PDF依赖包xhtml2pdfgithub
pip install django pip install xhtml2pdf
为了简单起见,这个demo依赖数据库,只须要表单验证数据便可
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
因为这里咱们只须要表单视图,因此只建立了一个类视图,post用来验证表单数据是否都存在,若是存在就把表单数据渲染到PDF模板中,通过处理后返回PDF的响应response。
这里可使用Django的通用类视图FormView构建,代码更简洁django
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'))
view.py
这里为了方便直接把处理函数写到视图函数的文件里app
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目录,用来设置全局字体。这些文件都在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'
把这个函数放在生成PDF响应前
post
按照以上大体步骤你们就可以生成PDF文件了,能够在网页中浏览、放大、缩小,也能够下载,很是方便、简单。
你们能够直接clone一份代码试试效果
项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
我的网页:https://liyuankun.cn字体