You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

成因分析

  1. CSRF令牌缺失导致HTML渲染异常:模板中使用了{% csrf_token %}标签,但渲染模板时传入的context未包含CSRF令牌,生成的HTML存在无效内容,导致wkhtmltopdf无法解析生成合法的PDF。
  2. 渲染模板时仅传入自定义字典作为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:23