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">
说明
- 用
BytesIO在内存中保存二维码图片,完全不需要写入磁盘或媒体目录 - Base64编码后生成的Data URI直接嵌入
img标签的src属性,pisa解析HTML时可直接读取图片内容 - 保持原有PDF生成流程,仅增加图片转码步骤,适配pisa的渲染逻辑
内容的提问来源于stack exchange,提问作者ad1
相关产品推荐
相关产品推荐

