使用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
相关产品推荐
相关产品推荐

