想象一下,你是一名忙碌的办公室职员,每天需要处理大量的PDF文件。有一天,你需要将几十个小的PDF文档合并成一个大的报告,并且还要在报告的每一页上添加公司的标志作为水印。手动操作将是一个漫长而繁琐的过程,但是幸运的是,有一种更智能的方式可以解决这个问题。
准备工作
在开始之前,确保你已经安装了以下Python库:
- PyPDF2
- Pillow
你可以使用以下命令来安装这些库:
pip install PyPDF2 Pillow
步骤1:创建水印图像
首先,我们需要创建一个自定义水印图像,它将被添加到合并后的PDF文件的每一页上。以下是创建水印图像的步骤:
from PIL import Image, ImageFont, ImageDraw
def create_watermark(text, size=30):
width = len(text) * size
watermark = Image.new(mode='RGB', size=(width, size + 20), color=(255, 255, 255))
ImageDraw.Draw(im=watermark).text(xy=(0, 0), text=text, fill="black", font=ImageFont.truetype('msyhbd.ttc', size=size))
watermark.save("watermark.pdf", "PDF", resolution=100.0, save_all=True)
# 使用示例
create_watermark("我的水印")
这个函数将根据传入的文本创建一个水印图像,并保存为名为"watermark.pdf"的PDF文件。
步骤2:合并PDF文件
接下来,我们将创建一个Python类来合并PDF文件。这个类将递归地遍历指定目录中的所有PDF文件和子目录,并将它们合并成一个单一的PDF文件。同时,它还会在每个子目录的第一页添加自定义水印。
from PyPDF2 import PdfReader, PdfWriter
import os
import re
class PDFMerger:
def __init__(self):
self.page_num_total = 0
self.pdf_writer = PdfWriter()
@staticmethod
def sort_files(files):
files.sort(key=lambda s: [(s, int(n)) for s, n in re.findall('(\D+)(\d+)', f'a{s}0')])
def merge_pdf(self, path, output_name):
self.page_num_total = 0
self.pdf_writer = PdfWriter()
self.__merge_pdf_recursive(path)
print("总页数:", self.page_num_total)
print("开始写出到文件")
with open(output_name, "wb") as output_file:
self.pdf_writer.write(output_file)
print("PDF文件合并完成")
def __merge_pdf_recursive(self, path, parent=None):
files = []
dirs = []
for file in os.listdir(path):
file = os.path.join(path, file)
if os.path.isfile(file):
if file.endswith(".pdf"):
files.append(file)
elif os.path.isdir(file):
if os.path.basename(file) != "__MACOSX":
dirs.append(file)
PDFMerger.sort_files(files)
PDFMerger.sort_files(dirs)
for pdf_file in files:
pdf_reader = PdfReader(pdf_file)
pdf_file = os.path.basename(pdf_file)
page_count = len(pdf_reader.pages)
print(pdf_file, page_count, self.page_num_total)
for page in pdf_reader.pages:
page.compress_content_streams()
self.pdf_writer.add_page(page)
self.pdf_writer.add_outline_item(pdf_file[:pdf_file.rfind(".")], self.page_num_total, parent=parent)
self.page_num_total += page_count
for sub_dir in dirs:
title = os.path.basename(sub_dir)
print(title, self.page_num_total)
create_watermark(title) # 添加水印
watermark = PdfReader('watermark.pdf').pages[0]
self.pdf_writer.add_page(watermark)
os.remove('watermark.pdf')
parent_id = self.pdf_writer.add_outline_item(title, self.page_num_total, parent=parent)
self.page_num_total += 1
self.__merge_pdf_recursive(sub_dir, parent=parent_id)
# 使用示例
pdf_merger = PDFMerger()
pdf_merger.merge_pdf(r"你的PDF文件目录", "合并后的文件名.pdf")
这个类会递归地遍历指定目录中的所有PDF文件和子目录,并将它们合并成一个单一的PDF文件。在每个子目录的第一页上,它还会添加自定义水印。
结束语
通过这个简单的Python脚本,你可以轻松地合并多个PDF文件并添加自定义水印。这个过程将帮助你提高工作效率,特别是当你需要处理大量PDF文件时。
希望这个教程对你有所帮助!如果你有任何问题或反馈,请随时与我们联系。