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

如何编写Python脚本为文件夹内PDF文档批量添加首页序号水印

可用的Python库及实现方案

以下几个Python库可以实现给文件夹内多个PDF的第一页添加递增大号数字序号的需求,附实用代码示例:

1. PyMuPDF(fitz)

这是处理PDF最便捷的库之一,可直接在PDF页面上绘制文本,无需额外生成水印文件,操作高效灵活。

import fitz
import os

# 按文件名排序获取文件夹内所有PDF文件
pdf_files = sorted(f for f in os.listdir(".") if f.lower().endswith(".pdf"))

for seq_num, pdf_path in enumerate(pdf_files, start=1):
    # 打开PDF文档
    doc = fitz.open(pdf_path)
    first_page = doc[0]
    
    # 自定义序号样式:字号、颜色、位置
    font_size = 100
    text = str(seq_num)
    page_rect = first_page.rect
    
    # 计算居中位置
    text_width = fitz.get_text_length(text, fontsize=font_size)
    x_pos = (page_rect.width - text_width) / 2
    y_pos = page_rect.height / 2
    
    # 在第一页绘制序号
    first_page.insert_text(
        (x_pos, y_pos),
        text,
        fontsize=font_size,
        color=(1, 0, 0)  # 红色,可改为(0,0,0)黑色等
    )
    
    # 保存修改后的PDF(可选择覆盖原文件或命名新文件)
    doc.save(f"numbered_{pdf_path}")
    doc.close()

2. PyPDF2 + ReportLab

通过PyPDF2处理PDF的读取与合并,ReportLab生成带序号的水印页,适合需要更复杂排版的场景。

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

pdf_files = sorted(f for f in os.listdir(".") if f.lower().endswith(".pdf"))

for seq_num, pdf_path in enumerate(pdf_files, start=1):
    # 生成带序号的水印页
    buffer = io.BytesIO()
    pdf_canvas = canvas.Canvas(buffer, pagesize=letter)
    pdf_canvas.setFont("Helvetica-Bold", 100)
    pdf_canvas.setFillColorRGB(1, 0, 0)
    # 居中绘制序号
    pdf_canvas.drawCentredString(letter[0]/2, letter[1]/2, str(seq_num))
    pdf_canvas.save()
    
    buffer.seek(0)
    watermark_reader = PdfReader(buffer)
    
    # 读取原PDF并合并水印到第一页
    source_reader = PdfReader(pdf_path)
    output_writer = PdfWriter()
    
    # 合并第一页与水印
    first_page = source_reader.pages[0]
    first_page.merge_page(watermark_reader.pages[0])
    output_writer.add_page(first_page)
    
    # 添加剩余页面
    for page in source_reader.pages[1:]:
        output_writer.add_page(page)
    
    # 保存结果
    with open(f"numbered_{pdf_path}", "wb") as out_file:
        output_writer.write(out_file)

3. pdfrw + ReportLab

pdfrw是轻量型PDF处理库,语法简洁,配合ReportLab生成水印,批量处理效率较高。

import pdfrw
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io
import os

pdf_files = sorted(f for f in os.listdir(".") if f.lower().endswith(".pdf"))

for seq_num, pdf_path in enumerate(pdf_files, start=1):
    # 生成水印页
    buffer = io.BytesIO()
    pdf_canvas = canvas.Canvas(buffer, pagesize=letter)
    pdf_canvas.setFont("Helvetica-Bold", 100)
    pdf_canvas.setFillColorRGB(1, 0, 0)
    pdf_canvas.drawCentredString(letter[0]/2, letter[1]/2, str(seq_num))
    pdf_canvas.save()
    
    buffer.seek(0)
    watermark_pdf = pdfrw.PdfReader(buffer)
    watermark_page = watermark_pdf.pages[0]
    
    # 读取原PDF并合并水印
    source_pdf = pdfrw.PdfReader(pdf_path)
    output_pdf = pdfrw.PdfWriter()
    
    # 合并第一页与水印
    first_page = source_pdf.pages[0]
    pdfrw.merge_pages(first_page, watermark_page)
    output_pdf.addpage(first_page)
    
    # 添加其他页面
    for page in source_pdf.pages[1:]:
        output_pdf.addpage(page)
    
    # 保存结果
    output_pdf.write(f"numbered_{pdf_path}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:25:09