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

如何为合并后的PDF每页顶部添加对应页码的‘Question [编号]’

问题描述

我用Python写了一段代码,能从Excel里读取PDF路径并合并多个PDF,每个PDF对应一道习题,合并后作为学生习题册。现在需要给每个PDF页面顶部加上“Question [编号]”,编号和页码一致(比如第10页就是Question 10)。现有代码如下:

import xlwings as xw
# 注:原代码存在语法错误,已修正为正确导入方式
from PyPDF2 import PdfMerger, PdfReader
import openpyxl as op

wbxl = xw.Book('demo.xlsm')
get_links = wbxl.sheets['Sheet1'].range('C2:C5').value
filenames = []

for file in get_links:
    if file is not None:
        filenames.append(file)

merged_pdf = PdfMerger()
for i in range(len(filenames)):
    merged_pdf.append(filenames[i], 'rb')

output_name = wbxl.sheets['Sheet1'].range('C7').value
merged_pdf.write(output_name + ".pdf")

因为这些PDF里包含图片、表格,转成Word处理不现实,能不能加少量代码实现这个功能?


解决方案

可以用PyPDF2结合reportlab直接操作PDF添加页眉,无需转换格式,不会破坏原文档的图片、表格内容。以下是修改后的完整代码:

import xlwings as xw
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from io import BytesIO

# 读取Excel中的PDF路径
wbxl = xw.Book('demo.xlsm')
get_links = wbxl.sheets['Sheet1'].range('C2:C5').value
filenames = [file for file in get_links if file is not None]

# 初始化PDF写入器
output_writer = PdfWriter()
current_page_num = 1

# 逐个处理每个PDF文件
for pdf_path in filenames:
    reader = PdfReader(pdf_path)
    # 遍历当前PDF的每一页
    for page in reader.pages:
        # 创建临时PDF绘制页眉
        packet = BytesIO()
        can = canvas.Canvas(packet, pagesize=letter)
        
        # 设置字体样式,绘制居中的"Question X"页眉
        can.setFont("Helvetica", 12)
        header_text = f"Question {current_page_num}"
        # 计算文本居中位置(letter页面宽度为612点)
        text_width = can.stringWidth(header_text, "Helvetica", 12)
        can.drawString((612 - text_width)/2, 770, header_text)
        
        can.save()
        packet.seek(0)
        header_pdf = PdfReader(packet)
        
        # 合并页眉与原页面
        page.merge_page(header_pdf.pages[0])
        output_writer.add_page(page)
        
        current_page_num += 1

# 保存最终PDF
output_name = wbxl.sheets['Sheet1'].range('C7').value
with open(f"{output_name}.pdf", "wb") as output_file:
    output_writer.write(output_file)

关键说明

  1. 修正了原代码的语法错误:将错误的import from PyPDF2改为正确的导入方式,并用PdfWriter替代PdfMerger,更适合逐页添加页眉的需求。
  2. 用reportlab生成仅包含页眉的临时PDF,再与原页面合并,完全保留原PDF的内容格式。
  3. 页眉默认居中显示在页面顶部(letter尺寸页面的顶部位置为770点,可根据实际PDF页面尺寸调整该数值)。
  4. 逐页递增编号,确保编号与页码完全对应。

依赖安装

需要先安装缺失的库:

pip install reportlab xlwings PyPDF2 openpyxl

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:25:26