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

在Django生成含用户专属内容与图片的PDF时遇TypeError报错

解决Django生成PDF时的TypeError:expected str, bytes or os.PathLike object, not JpegImageFile

错误原因

ReportLab的drawImage()方法不支持直接传入PIL的JpegImageFile对象,它仅接受文件路径字符串、字节流对象或类文件对象作为图片输入。你当前代码中直接把PIL打开后的图片对象传给drawImage(),导致类型不匹配错误。

解决方案

下面提供两种可靠的修正方式,优先推荐第一种(适配本地/云存储场景):

方法1:将PIL图片转为字节流传入(通用型)

把图片读取到BytesIO字节流中,再传递给drawImage(),这种方式不管图片存在本地还是云存储(比如S3)都能正常工作:

from django.shortcuts import render
from django.http import HttpResponse , HttpResponseServerError
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile
import tempfile
import os
from .models import Reports  # 确保导入你的Reports模型

def generate_pdf(request, pid):
    # 获取用户对象
    user = Reports.objects.get(id=pid)

    # 设置PDF响应头
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'attachment; filename="{user.Title}.pdf"'

    # 创建PDF画布
    pdf = canvas.Canvas(response, pagesize=(8.5*inch, 11*inch))

    # 处理并添加图片到PDF
    try:
        # 将图片读取到字节流
        img_stream = BytesIO()
        with Image.open(user.report_image) as img:
            # 根据图片实际格式调整format参数,比如'PNG'
            img.save(img_stream, format='JPEG')
        img_stream.seek(0)  # 重置字节流指针到起始位置
        
        # 使用字节流绘制图片
        pdf.drawImage(img_stream, 2*inch, 9.5*inch, width=3*inch, height=3*inch)
    except Exception as e:
        print(f"图片处理错误: {e}")
        return HttpResponseServerError("生成PDF出错")

    # 添加用户内容
    pdf.setFont("Helvetica", 12)
    pdf.drawString(2*inch, 8*inch, user.Content)

    # 保存PDF并返回响应
    pdf.save()
    return response

方法2:直接传入图片本地路径(仅本地存储场景)

如果你的图片存储在服务器本地,可以直接使用Django FileField的path属性获取本地路径,传给drawImage():

# 替换原图片处理部分
try:
    # 直接传入图片本地路径
    pdf.drawImage(user.report_image.path, 2*inch, 9.5*inch, width=3*inch, height=3*inch)
except Exception as e:
    print(f"图片处理错误: {e}")
    return HttpResponseServerError("生成PDF出错")

注意事项

  • 如果你的项目使用云存储服务(如AWS S3、阿里云OSS),user.report_image.path会失效,必须使用方法1的字节流方式。
  • 注意图片格式匹配:如果用户上传的是PNG图片,要把format='JPEG'改成format='PNG',避免格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:34