Django生成PDF中文乱码解决方案及示例

2 下载量 150 浏览量 更新于2024-08-31 收藏 195KB PDF 举报
"这篇教程主要介绍了在Django框架下如何解决生成PDF文档时中文显示乱码的问题,并提供了一个简单的示例项目,该项目可以根据用户输入的个人信息生成简历PDF。" 在Django开发过程中,生成PDF文档是一项常见的需求。然而,当涉及到中文字符时,可能会出现乱码问题。本教程将讲解如何解决这个问题。 首先,我们需要安装必要的库。Django是最新的2.2.2版本,而xhtml2pdf是用于生成PDF的库。你可以通过以下命令安装这两个库: ```bash pip install django pip install xhtml2pdf ``` 接下来,我们需要创建一个表单来收集用户的个人信息。在`pdf/forms.py`文件中定义一个`MessageForm`,包含几个字段如姓名、学历、教育背景、工作经验和技能等: ```python from django import forms 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。在`pdf/views.py`中,我们可以使用Django的`View`类来实现。这里创建了一个`MessageView`,它处理GET请求展示表单,处理POST请求则验证表单数据并生成PDF: ```python from django.shortcuts import render from .forms import MessageForm from django.http import HttpResponse from xhtml2pdf import pisa 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(): # 渲染HTML模板为PDF response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="resume.pdf"' html = '<h1>欢迎,{}</h1><p>您的简历如下:...'.format(form.cleaned_data['name']) # 使用用户数据填充HTML模板 # 使用pisa库将HTML转换为PDF pisa_status = pisa.CreatePDF(html, dest=response) # 检查转换过程中是否有错误 if pisa_status.err: return HttpResponse('We had some errors <pre>%s</pre>' % html) else: return response else: return render(request, 'index.html', {'form': form}) ``` 在这个示例中,`pisa.CreatePDF()`函数用于将HTML字符串转换为PDF,同时将响应设置为PDF类型以便下载。注意,要确保HTML中的字符编码正确,通常需要在HTML头部添加`<meta charset="utf-8">`来指定UTF-8编码,以确保中文字符能正确显示。 最后,你需要创建一个HTML模板`index.html`,用于显示表单并处理POST请求。在这个模板中,可以使用Django的表单标签来渲染表单,并设置提交按钮指向`MessageView`的POST方法。 通过以上步骤,你就可以在Django项目中生成包含中文的PDF文档了,同时避免了中文乱码的问题。记得在处理中文时,确保整个项目的编码环境(包括文件编码、数据库编码和HTTP响应头)都支持UTF-8,以确保中文字符的正确显示。