Python FPDF中auto_page_break使用及递归错误解决求助
FPDF发票生成问题解决方案
1. auto_page_break功能不生效的修复
auto_page_break不生效通常是两个核心原因:未设置底部边距,或设置时机/方式有误。
- 必须指定底部边距:启用自动分页时,必须通过
margin参数设置页面底部留白,FPDF会在当前y坐标超过页面高度 - 底部边距时触发分页。正确设置示例:pdf = FPDF() # 先开启自动分页并设置底部边距(例:15mm) pdf.set_auto_page_break(auto=True, margin=15) pdf.add_page() - 避免手动固定y坐标破坏触发逻辑:如果绘制内容时用
pdf.set_y()硬编码y值,要确保后续内容的y坐标能自然超过分页阈值。建议用pdf.ln()让y自动下移,不要手动固定位置。 - 排查是否误关自动分页:检查代码中是否有后续调用
set_auto_page_break(auto=False)的操作,这会直接关闭自动分页功能。
2. 表格行数过多导致递归错误的解决
递归错误是因为你用递归方式循环绘制表格行,Python默认递归深度上限约1000,行数超过这个值就会触发报错。改成循环迭代绘制即可彻底解决,无需修改递归上限:
错误的递归写法(触发RecursionError)
def draw_row(pdf, rows, idx): if idx >= len(rows): return # 绘制当前行 pdf.cell(30, 10, str(rows[idx]["item"]), 1) pdf.cell(40, 10, rows[idx]["desc"], 1) pdf.ln() # 递归调用绘制下一行 draw_row(pdf, rows, idx+1)
改成循环写法(无递归深度限制)
def draw_table(pdf, rows): # 先绘制表头(按需添加) draw_table_header(pdf) for row in rows: # 检查当前位置能否放下一行,不够则手动分页(也可依赖已生效的auto_page_break) if pdf.get_y() + 10 > pdf.h - pdf.b_margin: # 10为行高 pdf.add_page() draw_table_header(pdf) # 新页面重新绘制表头 # 绘制当前行 pdf.cell(30, 10, str(row["item"]), 1) pdf.cell(40, 10, row["desc"], 1) pdf.ln() # 自动下移到下一行起始位置 def draw_table_header(pdf): # 表头绘制逻辑 pdf.set_font("Arial", "B", 12) pdf.cell(30, 10, "商品编号", 1) pdf.cell(40, 10, "商品描述", 1) pdf.ln() pdf.set_font("Arial", "", 12)
循环写法是逐行迭代绘制,不会产生递归调用,无论表格有多少行都能正常处理,完全规避递归深度限制问题。
内容的提问来源于stack exchange,提问作者B _J
相关产品推荐
相关产品推荐

