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

