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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:55:17