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

使用Django与ReportLab生成PDF时表格单字母显示问题如何解决

问题修复方案

问题根源

  • Reportlab的Table组件要求传入二维列表格式的数据源:外层列表的每一个元素对应表格的一行,内层列表的每一个元素对应当前行的一个单元格数据。你现在传入的是一维字符串列表,Reportlab会自动迭代每个字符串,把单个字符作为列数据,所以出现每行只显示单个字母的问题。
  • 你设置的列宽10*mm过窄,不足以容纳用户名、邮箱这类长文本内容,也会导致内容截断显示异常。

修复后的完整代码

def pdf_view(request):
    enc = pdfencrypt.StandardEncryption("pass", canPrint=0)
    buf = io.BytesIO()
    c = canvas.Canvas(buf, encrypt=enc)
    width, height = A4
    # 构造二维表格数据,可根据需要添加表头
    table_data = [
        ["用户名", "邮箱", "姓名"]
    ]
    users = User.objects.filter(is_staff=False)
    for user in users:
        # 每个用户对应一行,三个字段为三个单元格
        table_data.append([user.username, user.email, user.first_name])
    # 调整列宽适配内容,三个列分别设置宽度,可根据实际需求调整
    table = Table(table_data, colWidths=[30 * mm, 70 * mm, 30 * mm])
    table.setStyle([("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
                    ("ALIGN", (0, 0), (-1, -1), "CENTER"),
                    ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
                    # 可选添加外边框
                    ('BOX', (0,0), (-1,-1), 0.25, colors.black)])

    # 调整表格绘制位置,预留边距避免内容被截断
    table.wrapOn(c, width, height)
    table.drawOn(c, 20 * mm, 20 * mm)

    styles = getSampleStyleSheet()
    ptext = "This is an example."
    p = Paragraph(ptext, style=styles["Normal"])
    # 调整段落位置避免和表格重叠
    p.wrapOn(c, 50 * mm, 50 * mm)
    p.drawOn(c, 20 * mm, 10 * mm)
    c.save()
    buf.seek(0)
    return FileResponse(buf, as_attachment=True, filename='users.pdf')

额外调整说明

可根据实际展示需要调整列宽数值和表格绘制的坐标,避免内容超出PDF页面范围;如果用户数据过多超过单页容量,可以使用PageTemplate和Frame组件实现自动分页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:39:03