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

ReportLab生成PDF仅首页显示页眉页脚问题求助

解决ReportLab仅第一页显示页眉页脚的问题

问题描述

使用ReportLab生成PDF文档时,需要所有页面都显示页眉和页脚,但当前仅第一页正常显示,其余页面均无页眉页脚。

原代码

from reportlab.platypus import SimpleDocTemplate, PageTemplate, Frame, Paragraph, PageBreak
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet

def header(canvas, doc):
    canvas.saveState()
    canvas.setFont('Helvetica', 12)
    canvas.drawString(36, letter[1] - 36, "CABEÇA")
    canvas.restoreState()

def footer(canvas, doc):
    canvas.saveState()
    canvas.setFont('Helvetica', 12)
    canvas.drawString(36, 36, "PÉZÃO")
    canvas.restoreState()

pdf_filename = "exemplo.pdf"

doc = SimpleDocTemplate(pdf_filename, pagesize=letter)

styles = getSampleStyleSheet()
normal_style = styles["Normal"]

frame = Frame(36, 36, letter[0] - 72, letter[1] - 72)
template = PageTemplate(id='page_with_header_footer', frames=frame, onPage=header, onPageEnd=footer)

doc.addPageTemplates([template])

story = []

for i in range(10):
    story.append(Paragraph(f"Conteúdo da Página {i + 1}", normal_style))
    story.append(PageBreak())

story.pop()

doc.build(story)

问题原因

PageTemplate的onPage和onPageEnd参数仅在模板首次被调用时执行,后续复用该模板的页面不会重复触发这两个函数,导致只有第一页生成页眉页脚。

修复方案

将页眉和页脚的绘制逻辑合并到一个函数中,在doc.build()方法里通过onFirstPage和onLaterPages参数指定该函数,确保所有页面都执行页眉页脚的绘制操作。

修复后的代码

from reportlab.platypus import SimpleDocTemplate, PageTemplate, Frame, Paragraph, PageBreak
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet

def draw_header_footer(canvas, doc):
    canvas.saveState()
    canvas.setFont('Helvetica', 12)
    # 绘制页眉
    canvas.drawString(36, letter[1] - 36, "CABEÇA")
    # 绘制页脚
    canvas.drawString(36, 36, "PÉZÃO")
    canvas.restoreState()

pdf_filename = "exemplo.pdf"

doc = SimpleDocTemplate(pdf_filename, pagesize=letter)

styles = getSampleStyleSheet()
normal_style = styles["Normal"]

frame = Frame(36, 36, letter[0] - 72, letter[1] - 72)
template = PageTemplate(id='page_with_header_footer', frames=frame)

doc.addPageTemplates([template])

story = []

for i in range(10):
    story.append(Paragraph(f"Conteúdo da Página {i + 1}", normal_style))
    story.append(PageBreak())

story.pop()

# 指定所有页面使用同一页眉页脚绘制函数
doc.build(story, onFirstPage=draw_header_footer, onLaterPages=draw_header_footer)

说明

  • 合并页眉页脚函数,减少重复代码,保证绘制逻辑一致。
  • onFirstPage负责第一页的页眉页脚绘制,onLaterPages负责后续所有页面,两者指定同一个函数即可实现全页面的页眉页脚效果。

内容的提问来源于stack exchange,提问作者thiago tavares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:16:34