如何用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
相关产品推荐
相关产品推荐

