Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
程序员文章站
2023-02-03 10:54:28
这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来阐述如何使用Django的HttpResponse生成PDF的文档。 先上效果图: 安装依赖库 首先安装Django最新版2.2.2和PDF依赖包xhtml2pdf 编写表单验证 为了简单起见,这个demo依赖数据库,只需要表单验证数 ......
这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来阐述如何使用django的httpresponse生成pdf的文档。
先上效果图:
安装依赖库
首先安装django最新版2.2.2和pdf依赖包xhtml2pdf
pip install django pip install xhtml2pdf
编写表单验证
为了简单起见,这个demo依赖数据库,只需要表单验证数据即可,小编整理一套python资料和pdf,有需要python学习资料可以加学习群:631441315 ,反正闲着也是闲着呢,不如学点东西啦~~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构建,代码更简洁
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响应response
view.py
这里为了方便直接把处理函数写到视图函数的文件里
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响应前
按照以上大致步骤大家就能够生成pdf文件了,可以在网页中浏览、放大、缩小,也可以下载,非常方便、简单。
大家可以直接clone一份代码试试效果