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

如何用Matplotlib的pdfpages为PDF添加页眉、页脚及页码?

为Matplotlib pdfpages生成的PDF添加页眉页脚及页码

方案1:生成PDF时直接添加(推荐,无需额外处理已生成文件)

利用Matplotlib的绘图API,在每个图表页面绘制页眉、页脚和页码,再通过pdfpages保存,全程一次完成。

代码示例:

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

# 初始化PDF对象
pdf = PdfPages("带页眉页脚的图表.pdf")

# 假设有3个图表需要保存,循环处理每页
for page_num in range(1, 4):
    # 创建画布,设置标准打印尺寸
    fig = plt.figure(figsize=(8.5, 11))
    
    # -------------------------- 绘制页眉 --------------------------
    # 绘制顶部分隔线(用画布坐标系统,0-1范围,左下角为原点)
    plt.plot([0.1, 0.9], [0.95, 0.95], color='black', linewidth=1, transform=fig.transFigure)
    # 添加页眉文本
    plt.text(0.1, 0.96, "业务数据报表", fontsize=10, transform=fig.transFigure)
    
    # -------------------------- 绘制图表内容 --------------------------
    # 替换成你自己的图表代码
    ax = fig.add_subplot(111)
    ax.plot([1,2,3], [page_num, page_num*2, page_num*3])
    ax.set_title(f"区域{page_num}数据趋势")
    
    # -------------------------- 绘制页脚 --------------------------
    # 绘制底部分隔线
    plt.plot([0.1, 0.9], [0.05, 0.05], color='black', linewidth=1, transform=fig.transFigure)
    # 添加页脚文本
    plt.text(0.1, 0.03, "© 2024 数据分析部", fontsize=10, transform=fig.transFigure)
    # 添加页码
    plt.text(0.9, 0.03, f"第 {page_num} 页", fontsize=10, ha='right', transform=fig.transFigure)
    
    # 保存当前页面到PDF
    pdf.savefig(fig)
    plt.close(fig)

# 关闭PDF对象,完成保存
pdf.close()

说明:transform=fig.transFigure用画布全局坐标定位,避免页眉页脚位置随图表坐标轴变动,可自行调整坐标值改变元素位置和线条长度。

方案2:对已生成的PDF进行后处理

如果已经有生成好的PDF文件,可以用PyPDF2和ReportLab为每页追加页眉页脚。

首先安装依赖:

pip install PyPDF2 reportlab

代码示例:

from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io

# 读取已有的PDF文件
input_pdf = PdfReader("已生成的图表.pdf")
output_pdf = PdfWriter()

total_pages = len(input_pdf.pages)

for page_num in range(total_pages):
    # 获取当前页面
    current_page = input_pdf.pages[page_num]
    
    # 创建临时画布,绘制页眉页脚
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    
    # -------------------------- 绘制页眉 --------------------------
    can.line(72, 750, 540, 750)  # letter页面尺寸为612x792,坐标以左下角为原点
    can.setFont("Helvetica", 10)
    can.drawString(72, 755, "业务数据报表")
    
    # -------------------------- 绘制页脚 --------------------------
    can.line(72, 50, 540, 50)
    can.drawString(72, 40, "© 2024 数据分析部")
    # 添加带总页数的页码
    can.drawRightString(540, 40, f"第 {page_num+1} 页 / 共 {total_pages} 页")
    
    can.save()
    
    # 将绘制好的页眉页脚与原页面合并
    packet.seek(0)
    header_footer_pdf = PdfReader(packet)
    current_page.merge_page(header_footer_pdf.pages[0])
    
    # 加入输出PDF
    output_pdf.add_page(current_page)

# 保存处理后的文件
with open("添加页眉页脚后的PDF.pdf", "wb") as out_file:
    output_pdf.write(out_file)

说明:ReportLab使用点坐标系统,可根据实际页面尺寸调整线条和文本的坐标位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:45:39