Django中使用wkhtmltopdf生成PDF无法打开的问题排查与解决
Django使用wkhtmltopdf生成PDF无法打开的问题解决
问题现象
- 点击下载按钮可触发PDF下载,但打开时提示**“无法加载PDF文档”**错误
- 终端抛出警告:
UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.
相关代码
views.py
@login_required def download_resume(request): # 从模型获取数据 personal_info = personalinfo.objects.filter(user=request.user).last() summaries = summary.objects.filter(user=request.user).last() experiences = experience.objects.filter(user=request.user) educations = education.objects.filter(user=request.user) certs = certificates.objects.filter(user=request.user) skillset = skills.objects.filter(user=request.user) # 加载模板 template = get_template('template0.html') context = { 'personal_info': personal_info, 'summaries': summaries, 'experiences': experiences, 'educations': educations, 'certs': certs, 'skillset': skillset } # 渲染模板 html_content = template.render(context) # 配置wkhtmltopdf路径 pdfkit_config = pdfkit.configuration(wkhtmltopdf='C:/Users/lulu/PProjects/resumebuilderproject/wkhtmltopdf/bin/wkhtmltopdf.exe') # HTML转PDF pdf = pdfkit.from_string(html_content, False, configuration=pdfkit_config) # 构造响应 response = FileResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="resume.pdf"' return response
HTML下载按钮代码
{% csrf_token %} <button type="submit">下载</button>
成因分析
- CSRF令牌缺失导致HTML渲染异常:模板中使用了
{% csrf_token %}标签,但渲染模板时传入的context未包含CSRF令牌,生成的HTML存在无效内容,导致wkhtmltopdf无法解析生成合法的PDF。 - 渲染模板时仅传入自定义字典作为context,未结合Django的请求上下文,缺少CSRF等必要的系统上下文变量。
解决方法
方法一:传入request对象渲染模板
修改views.py中模板渲染的代码,将request对象传入render方法,自动注入CSRF令牌:
# 替换原渲染代码 html_content = template.render(context, request=request)
方法二:手动添加CSRF令牌到context
如果不想传入request,可手动生成CSRF令牌并添加到context中:
from django.middleware.csrf import get_token # 在context中添加csrf_token字段 context['csrf_token'] = get_token(request) # 再执行模板渲染 html_content = template.render(context)
额外排查点
- 确认wkhtmltopdf的路径配置正确,可直接运行该路径下的exe文件验证是否能正常启动
- 检查
template0.html模板是否存在HTML语法错误,避免因无效HTML导致PDF生成失败
内容的提问来源于stack exchange,提问作者developer-re
相关产品推荐
相关产品推荐

