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

想象一下,你是一名忙碌的办公室职员,每天需要处理大量的PDF文件。有一天,你需要将几十个小的PDF文档合并成一个大的报告,并且还要在报告的每一页上添加公司的标志作为水印。手动操作将是一个漫长而繁琐的过程,但是幸运的是,有一种更智能的方式可以解决这个问题。

准备工作

在开始之前,确保你已经安装了以下Python库:

你可以使用以下命令来安装这些库:

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文件时。

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

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:如何使用Python合并PDF文件并添加水印

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年9月27日
下一篇 2023年9月27日

相关推荐

  • 用Python实现二维码识别应用

    想象一下,你正坐在电脑前,突然收到了一个包裹。你迫不及待地打开它,里面有一张装有神秘图案的纸片。这个图案是一个二维码,但你不知道它隐藏了什么秘密。是一份神秘的情书?还是一个链接,将你带入未知的冒险?…

    2023年9月26日
    00
  • 适应国内网络环境:Python 项目的网络配置技巧

    当小明第一次尝试在自己的新项目中使用 pip 安装 Python 依赖时,他遭遇了让人沮丧的网络问题。下载速度缓慢、连接经常中断,让他对 Python 的开发产生了丝丝疑惑。但很快,他发现了一系列在国内网络环境下针对 Pyt…

    2023年10月9日
    00
  • 如何使用Python优化爬虫和数据可视化

    你是否曾经想过如何从Bilibili网站上获取有关UP主的信息,并将其可视化呈现出来?本教程将向你展示如何使用Python、Selenium、Pandas和Matplotlib优化你的爬虫和数据可视化流程,以更轻松地收集和分析数据。 前言 …

    2023年9月13日
    00
  • 2023年8月编程语言排行榜揭晓:Python领跑,C++、Java紧随其后!

    当今时代,编程语言的发展如火如荼,不断涌现出新的技术和工具,推动着科技的进步和创新。每个月,TIOBE编程社区指数都会发布最新的编程语言排行榜,展示了各个编程语言在全球范围内的流行度和趋势。让我们一起来看…

    2023年8月29日
    00
  • 在排序数组中查找元素的首尾位置:详细教程与实用技巧

    在程序设计的世界里,数据结构和算法是构建高效、优雅解决方案的基石。想象一下,你有一个已排序的数字数组和一个目标值,你的任务是在这个数组中找到该目标值的起始和结束位置。这看起来简单,但实际上,它蕴含了…

    2023年11月25日
    00
  • Python 自定义 Tkinter 应用打包为 Mac APP 完整教程

    在本教程中,我将介绍如何将使用 Python 编写的自定义 Tkinter 应用打包成 Mac 应用程序(APP)。这样,你就可以在 Mac 上方便地分享和运行你的应用了。 安装所需工具 首先,确保你已经安装了以下工具: Python:确…

    2024年3月17日
    00
  • 如何使用Python提取PPT中的文本并保存为文本和Word文件

    你是否曾经遇到过需要从PPT文件中提取文本的情况?或许你正在准备一个报告,但需要将PPT中的文本导出到文本或Word文件中。本教程将教你如何使用Python来实现这个任务。 开头小故事 在一个忙碌的工作日,你收到了一…

    2023年10月19日
    00
  • 创建自动化试卷生成工具:使用Python和OpenPyXL

    你是否曾经需要为学生创建大量的试卷,但又不想手动编写每一份试卷?在这个教程中,我们将使用Python编写一个自动化试卷生成工具,可以根据题库随机生成试卷,并保存为Word文档。无需编程经验,我们将一步步引导你…

    2023年9月13日
    00
  • 如何使用Selenium自动化浏览器操作获取网页数据

    在当今互联网时代,网页上的数据是我们获取信息和进行各种任务的关键。有时候,我们需要自动化地进行浏览器操作,以获取网页上的数据,而这正是Selenium库的用武之地。在这篇教程中,我们将学习如何使用Selenium来…

    2023年10月16日
    00
  • 从VCF到CSV:将联系人数据格式转换的Python教程

    在数字化时代,我们经常需要在不同的应用程序和设备之间共享联系人信息。然而,不同的应用程序和设备可能使用不同的联系人数据格式,这可能会导致数据转换的问题。在这篇文章中,我将向你介绍如何使用Python来将.vc…

    2023年9月27日
    00