
本文详解fpdf生成pdf时页眉、页脚与背景色的协同实现方案,重点解决因绘制顺序不当导致页脚被背景矩形覆盖的问题,并提供可复用的类封装代码。
本文详解fpdf生成pdf时页眉、页脚与背景色的协同实现方案,重点解决因绘制顺序不当导致页脚被背景矩形覆盖的问题,并提供可复用的类封装代码。
在使用 fpdf 库生成 PDF 时,若需同时实现页眉(header)、页脚(footer)和整页背景色,关键在于绘制顺序与坐标空间管理。原始代码中,pdf.rect(...) 被调用在 add_page() 之后、内容渲染之前,但此时页脚尚未绘制——而更严重的是:该矩形以 (0, 0) 为起点、覆盖整个 w × h 区域,会无差别覆盖已存在的所有元素(包括后续由 footer() 绘制的内容),造成“页脚消失”的假象。
根本原因在于:FPDF 的绘图是顺序叠加的,后绘制的内容位于上层。因此,将背景绘制逻辑置于 header() 方法中是最稳妥的方案——因为 header() 总是在每页最开始执行(早于正文和页脚),且 FPDF 内部保证 header() → 正文 → footer() 的固定调用时序。
以下是推荐的实现方式:
from fpdf import FPDF
class PDF(FPDF):
def header(self):
# ✅ 先绘制全页背景(必须放在 header 中,确保最早执行)
self.set_fill_color(r=249, g=247, b=242)
self.rect(x=0, y=0, w=self.w, h=self.h, style="F")
# ✅ 再绘制页眉内容(自动位于背景之上)
self.set_font(family="Helvetica", size=8)
self.cell(w=0, h=10, txt="test_header", align="L")
def footer(self):
# ✅ 页脚使用标准定位(距页底15mm)
self.set_y(-15)
self.set_font(family="Helvetica", size=8)
self.cell(w=0, h=10, txt="test_footer", align="L")
# 使用示例
pdf = PDF()
pdf.add_page()
pdf.set_font("Times", size=12)
pdf.cell(0, 10, "This is page content.", ln=True)
pdf.output("output.pdf")
⚠️ 注意事项:
- 不要手动在
add_page()后调用rect()设置背景——这会破坏 FPDF 的页面生命周期管理; -
self.w和self.h返回的是当前页面的宽高(单位:mm),无需额外转换; - 若需不同页面使用不同背景色,可在
header()中根据self.page或自定义标志动态设置set_fill_color(); -
style="F"表示填充(Fill),"D"为描边+填充,""(空)仅描边;此处必须用"F"。
该方案简洁、可靠,符合 FPDF 设计哲学,适用于生成报表、合同、文档等需要统一视觉风格的场景。










