FPDF2 Python 长字符串场景下MultiCell高度计算及重叠问题求解
FPDF MultiCell内容溢出重叠问题解决方案
问题原因
你代码出现内容重叠的核心原因是multi_cell的ln参数配置问题:ln=3代表单元格输出完成后,光标会回到当前行的左侧,不会自动向下偏移。你后续调用的pdf.ln()默认仅向下偏移1行高度,当单元格内容溢出折为多行时,偏移高度远小于实际内容高度,就会出现后续内容和前序内容重叠的问题。
解决方案
方案一:修改ln参数自动适配(推荐,适用于绝大多数场景)
将ln参数改为1,该配置代表单元格输出完成后,光标会自动移动到下一行的开头,无需手动调用pdf.ln(),可以自动适配任意长度的内容高度:
itemname = "This is a thing this is a thing this is a thing" line_height = pdf.font_size * 2.5 # ln设为1,输出完成后自动下移到下一行开头 pdf.multi_cell(col_width * 9, line_height, itemname, border=0, align="L", ln=1, max_line_height=7) # 无需手动调用pdf.ln() pdf.multi_cell(col_width * 9, line_height, "Shipping Charges", border=0, align="L", ln=1, max_line_height=7)
方案二:手动计算实际高度(适用于需要保留当前行光标逻辑的场景)
如果你的业务逻辑需要保留ln=3的光标配置(比如需要在同一行的其他位置输出额外内容),可以提前计算内容的实际总高度,手动指定偏移量:
from math import ceil itemname = "This is a thing this is a thing this is a thing" line_height = pdf.font_size * 2.5 cell_width = col_width * 9 # 计算文本总宽度 text_width = pdf.get_string_width(itemname) # 向上取整得到实际折行行数 line_count = ceil(text_width / cell_width) # 计算单元格实际总高度 total_height = line_count * line_height pdf.multi_cell(cell_width, line_height, itemname, border=0, align="L", ln=3, max_line_height=7) # 按实际高度偏移,避免重叠 pdf.ln(total_height) pdf.multi_cell(cell_width, line_height, "Shipping Charges", border=0, align="L", ln=3, max_line_height=7)
注意事项
- 如果你使用的是目前维护的FPDF2版本,
multi_cell会直接返回单元格的实际输出高度,无需手动计算,更精准:
# 仅FPDF2版本支持 cell_height = pdf.multi_cell(cell_width, line_height, itemname, border=0, align="L", ln=3, max_line_height=7) pdf.ln(cell_height)
- 如果你设置的
max_line_height小于传入的行高参数,实际行高以max_line_height为准,计算总高度时需要替换为对应数值。
内容的提问来源于stack exchange,提问作者Derik002
相关产品推荐
相关产品推荐

