如何使用Python合并PDF文件并添加水印

想象一下,你是一名忙碌的办公室职员,每天需要处理大量的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文件时。

希望这个教程对你有所帮助!如果你有任何问题或反馈,请随时与我们联系。

声明:本站所有文章,如无特殊说明或标注,均为本站(王大神)原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
指数词

如何添加、更改或删除ChatGPT Enterprise成员?

2023-9-27 11:56:25

指数词

如何使用Python自动裁剪学籍照片

2023-9-27 12:04:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索