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

Django中如何在生成的PDF中展示生成的二维码(无需存媒体)

Django生成PDF嵌入二维码(无需保存到媒体目录)

问题:在Django中生成PDF时,二维码在HTML预览正常,但PDF里无法显示,且不想将二维码保存到媒体目录。

问题原因

直接将PIL生成的二维码对象传递给模板,pisa(PDF生成库)无法解析该对象,导致PDF中无法渲染图片。

解决方案:将二维码转为Base64 Data URI

通过Base64编码把图片内容嵌入到HTML的img标签中,无需保存文件即可让pisa识别并渲染到PDF里。

修改后的views.py代码

from io import BytesIO
import base64
from django.template.loader import get_template
from xhtml2pdf import pisa
from django.http import HttpResponse

def generate_pdf(request):
    template_src = 'your_template.html'  # 替换为你的实际模板路径
    
    # 生成二维码
    path_qr = 'localhost:8000/qrcode/detail/1'
    qr = QRCode()
    qr.add_data(path_qr)
    img = qr.make_image()
    
    # 将PIL图片转为Base64 Data URI
    buffer = BytesIO()
    img.save(buffer, format='PNG')  # 把图片存入内存缓冲区
    img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
    qr_data_uri = f'data:image/png;base64,{img_base64}'
    
    data = {
        'qr_code': qr_data_uri
    }
    
    # 渲染HTML并生成PDF
    template = get_template(template_src)
    html = template.render(data)
    result = BytesIO()
    pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
    
    return HttpResponse(result.getvalue(), content_type='application/pdf')

修改后的HTML模板代码

<img src="{{ qr_code }}" width="100" height="100">

说明

  1. 用BytesIO在内存中保存二维码图片,完全不需要写入磁盘或媒体目录
  2. Base64编码后生成的Data URI直接嵌入img标签的src属性,pisa解析HTML时可直接读取图片内容
  3. 保持原有PDF生成流程,仅增加图片转码步骤,适配pisa的渲染逻辑

内容的提问来源于stack exchange,提问作者ad1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:36:14