如何为合并后的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)
关键说明
- 修正了原代码的语法错误:将错误的
import from PyPDF2改为正确的导入方式,并用PdfWriter替代PdfMerger,更适合逐页添加页眉的需求。 - 用
reportlab生成仅包含页眉的临时PDF,再与原页面合并,完全保留原PDF的内容格式。 - 页眉默认居中显示在页面顶部(letter尺寸页面的顶部位置为770点,可根据实际PDF页面尺寸调整该数值)。
- 逐页递增编号,确保编号与页码完全对应。
依赖安装
需要先安装缺失的库:
pip install reportlab xlwings PyPDF2 openpyxl
内容的提问来源于stack exchange,提问作者Jon Percival
相关产品推荐
相关产品推荐

