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

如何使用Python在PDF最后一页添加文本并保留全部原有页面

问题根因

你当前代码的核心错误是循环缩进逻辑错误:

  • mergePage(合并自定义文本)和addPage(写入输出PDF)的代码都写在了for循环外部,循环执行完后page变量只会留存原PDF的最后一页对象,最终输出文件自然只会保留这一页,其他页面全部丢失。
  • 如果直接把合并逻辑放进循环,又会出现所有页面都被加上自定义文本的问题,不符合只加在最后一页的需求。
修复方案

调整循环内的判断逻辑:遍历所有原页面时,非最后一页直接写入输出;仅当遍历到最后一页时,先合并自定义文本层,再写入输出。
修复后的完整可运行代码如下:

import PyPDF2
from PyPDF2 import PdfFileReader, PdfFileWriter
from tkinter import Tk
from tkinter.filedialog import askopenfilename
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import os
from datetime import datetime


root = Tk()
root.withdraw()

currentMonth = datetime.now().month
currentYear = datetime.now().year

# 生成自定义文本的PDF层
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
can.setFont('Helvetica-Bold', 7)
can.drawString(10, 170, "TEST")
can.drawString(45, 160, "TEST")
can.drawString(25, 150, "TEST")
can.drawString(50, 140, "___________ MONTH     __________ YEAR")
can.drawString(80, 140, str(currentMonth))
can.drawString(150, 140, str(currentYear))
can.save()
packet.seek(0)
text_pdf = PdfFileReader(packet)
text_layer = text_pdf.getPage(0)

# 读取选中的目标PDF
username = os.getenv('username')
filename = askopenfilename()
existing_pdf = PdfFileReader(open(filename, "rb"))
output = PdfFileWriter()

total_pages = existing_pdf.numPages
for page_num in range(total_pages):
    current_page = existing_pdf.getPage(page_num)
    # 仅最后一页合并自定义文本
    if page_num == total_pages - 1:
        current_page.mergePage(text_layer)
    output.addPage(current_page)

# 保存输出文件
name = os.path.basename(filename)[:-4]
output_path = f"C:\\Users\\{username}\\Desktop\\{name}-test.pdf"
with open(output_path, "wb") as outputStream:
    output.write(outputStream)

root.destroy()
关键调整点说明
  • 修正了for循环的缩进逻辑,保证所有原页面都会被遍历添加到输出文件中,不会丢失原有页面
  • 增加页码判断:PDF页码从0开始计数,仅当页码为总页数-1(即实际最后一页)时,才合并自定义文本层
  • 修复了原代码末尾root.destroy()缺失右括号的语法错误
  • 优化了文件写入逻辑,避免文件句柄泄漏
  • 清理了重复导入的冗余模块

注意:如果你的原PDF最后一页尺寸不是letter大小,文本位置可能出现偏移,可根据实际页面尺寸调整pagesize参数和drawString的坐标值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:03:03