Python对PDF文件的合并操作

news2024/10/10 6:05:39

在处理 PDF 文件时,合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能,其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口,包括 merge() 方法,可以将多个 PDF 文件合并成一个文件。

基本概念

  • PDF 合并: 将两个或更多的 PDF 文件组合成一个新的 PDF 文件,保留所有原始文件的页面和内容。
  • PDF插入:将某个PDF文件插入到PDF文件的指定位置,最终形成一个新的文件。
  • merge() 方法: 在 PyPDF2 中,此方法用于将一个 PDF 文件的内容追加到另一个 PDF 文件中。

环境准备

首先,确保已经安装了 PyPDF2 库。如果尚未安装,可以通过以下命令安装:

pip install PyPDF2

使用示例(1)

下面是使用 PyPDF2merge() 方法合并 PDF 文件的基本示例:

例如某文件夹(本例是practice_files)中有merge1.pdf、merge2.pdf、merge3.pdf这样3个PDF。如下所示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

利用PdfMerger实例通过.append()方法将merge1.pdf和merge2.pdf拼接到一起。将拼接后的PDF保存为home目录中的concatenated.pdf文件。

from pathlib import Path
from PyPDF2 import PdfMerger

# 定义 PDF 文件所在的目录路径,使用当前工作目录下的 'practice_files' 文件夹
pdf_dirs = Path.cwd() / 'practice_files'

# 使用 glob 方法查找以 'mer' 开头并以 '.pdf' 结尾的所有 PDF 文件
pdf_files = list(pdf_dirs.glob('mer*.pdf'))  

# 将文件列表按数字顺序排列
pdf_files.sort() 

# 创建一个 PdfMerger 对象,用于合并 PDF 文件
pdf_merger = PdfMerger()

# 遍历排序后的 PDF 文件列表,最多合并前两个文件
for pdf_file in pdf_files[:2]:  # 只处理前两个文件
    pdf_merger.append(pdf_file)  # 将每个 PDF 文件添加到合并器中

# 在用户主目录下创建一个新的 PDF 文件 'concatenated.pdf',以写入模式打开
with Path.home().joinpath('concatenated.pdf').open('wb') as f:
    pdf_merger.write(f)  # 将合并后的内容写入新文件

运行结果如下:

在这里插入图片描述

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,用于处理文件路径。
    • from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
  2. 定义 PDF 文件目录:
    • pdf_dirs = Path.cwd() / 'practice_files': 使用 Path.cwd() 获取当前工作目录,并与 'practice_files' 连接,构建包含待合并 PDF 文件的目录路径。
  3. 查找 PDF 文件:
    • pdf_files = list(pdf_dirs.glob('mer*.pdf')): 使用 glob 方法查找该目录下所有以 'mer' 开头且以 .pdf 结尾的文件。返回的是一个生成器,所以需要将其转换为列表。
  4. 排序文件:
    • pdf_files.sort(): 对找到的 PDF 文件进行排序。这会按字母顺序排列,但如果文件名中包含数字(如 mer1.pdf, mer10.pdf),则可能不符合预期的数值顺序。如果需要按数值顺序进行更复杂的排序,可以使用自定义排序函数。
  5. 创建 PDF 合并器:
    • pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,以便在后续步骤中合并 PDF 文件。
  6. 合并文件:
    • for pdf_file in pdf_files[:2]: 迭代排序后的 PDF 文件列表,但仅限于前两个文件。
    • pdf_merger.append(pdf_file): 将当前 PDF 文件添加到 PdfMerger 对象中供合并。
  7. 写入合并结果:
    • with Path.home().joinpath('concatenated.pdf').open('wb') as f: 创建一个新的文件路径,位于用户的主目录中,文件名为 concatenated.pdf,以二进制写入模式打开。
    • pdf_merger.write(f): 将合并后的 PDF 内容写入到打开的文件对象 f 中。

小结

这段代码的整体功能是从当前工作目录下的 practice_files 文件夹中查找以 'mer' 开头的 PDF 文件,按顺序排序,然后合并前两个文件,并将合并后的结果保存为 concatenated.pdf 到用户的主目录下。

使用示例(2)

创建一个新的PdfMerger实例,使用.merge()方法将merge3.pdf插入到示例(1)中的concatenated.pdf文件的两页之间。将新的文件保存为home目录中的merged.pdf,最终应该得到一个有3页的PDF。第1页数字1,第2页数字2,第3页数字3。

代码如下:

from pathlib import Path
from PyPDF2 import PdfMerger

# 创建 PdfMerger 对象,用于合并 PDF 文件
pdf_merger = PdfMerger()

# 定义合并后的 PDF 文件路径,位置在用户的主目录下,文件名为 'concatenated.pdf'
pdf_path = Path.home().joinpath('concatenated.pdf')

# 获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表
pdf_lst = list(Path.cwd().glob('mer*.pdf'))
# 对列表进行排序
pdf_lst.sort()

# 将已存在的 'concatenated.pdf' 文件添加到合并器中
pdf_merger.append(str(pdf_path))

# 在现有的合并结果后,将 pdf_lst 列表中的第三个 PDF 文件(索引为 2)合并进来
pdf_merger.merge(1, pdf_lst[2])

# 在当前工作目录下创建一个新的 PDF 文件 'mer1.pdf',以写入模式打开
with Path.cwd().joinpath('mer1.pdf').open('wb') as f:
    # 将合并后的内容写入到新创建的文件中
    pdf_merger.write(f)

运行结果如下:
在这里插入图片描述

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,以便处理路径。
    • from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
  2. 创建合并器:
    • pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,准备对 PDF 文件进行合并操作。
  3. 定义输出路径:
    • pdf_path = Path.home().joinpath('concatenated.pdf'): 创建一个包含合并后 PDF 文件路径的对象,指向用户主目录下的 concatenated.pdf
  4. 查找 PDF 文件:
    • pdf_lst = list(Path.cwd().glob('mer*.pdf')): 使用 glob 方法获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表。
    • pdf_lst.sort(): 对找到的 PDF 文件按字母顺序进行排序。
  5. 添加文件到合并器:
    • pdf_merger.append(str(pdf_path)): 将之前定义的 concatenated.pdf 文件路径添加到 PDF 合并器中。由于该文件可能已经存在,这一行的作用可能是将其作为已有的合并基础。
  6. 合并另一个 PDF 文件:
    • pdf_merger.merge(1, pdf_lst[2]): 将 pdf_lst 列表中的第三个 PDF 文件(由于索引从零开始,所以是 pdf_lst[2])合并到第一个位置之后(位置索引为 1)。这意味着合并操作将在已经存在的内容之后添加新的页面。
  7. 写入新的合并文件:
    • with Path.cwd().joinpath('mer1.pdf').open('wb') as f: 在当前工作目录下创建一个名为 mer1.pdf 的新 PDF 文件,并以二进制写入模式打开它。
    • pdf_merger.write(f): 将合并后的 PDF 内容写入到新创建的 mer1.pdf 文件中。

小结

此段代码实现的功能是:

  1. 查找当前工作目录下所有以 'mer' 开头的 PDF 文件,并按字母顺序排列。
  2. 将用户主目录下的 concatenated.pdf 文件添加到 PDF 合并器中。
  3. 从先前获得的列表中合并第三个 PDF 文件(pdf_lst[2]),插入到合并的内容后面。
  4. 最后将合并的结果保存为 mer1.pdf 到当前工作目录。

需要注意的是,在执行 merge() 方法时,合并的顺序和目标插入位置 (1) 可能会影响最终生成的 PDF 文件的内容顺序。

注意事项

  • 合并的 PDF 文件必须存在,并且路径需正确。
  • 合并时可以选择合并特定的页面(如第 n 页)或者合并整个文件。
  • 合并后的文件通常会包含所有添加的页面,并按顺序排列。

使用 PyPDF2 库的 merge() 操作可以方便快捷地将多个 PDF 文件合并为一个文件。此功能在文档处理、报告生成等工作中十分实用。通过简单的代码,就可以实现复杂的 PDF 文件操作,为开发者节省大量时间与精力。

欢迎点赞、关注、转发!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRE6281B1 (宽VCC:8-45V PWM电源芯片)

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC,为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时,CRE6281B1工作在固定频率(65kHz)模式。在负载较低时,采用节能模式,实现较高的功率转换效…

关于Allegro导出Gerber时的槽孔问题

注意点一: 如果设计的板子中有 槽孔和通孔(俗称圆孔),不仅要NC Drill, 还要 NC Route allegro导出的槽孔文件后缀是 .rou 圆型孔后缀 是 .drl ,出gerber时需要看下是否有该文件。 注意点二: 导出钻孔文件时,设置参…

Hi3061M开发板——系统时钟频率

这里写目录标题 前言MCU时钟介绍PLLCRG_ConfigPLL时钟配置另附完整系统时钟结构图 前言 Hi3061M使用过程中,AD和APT输出,都需要考虑到时钟频率,特别是APT,关系到PWM的输出频率。于是就研究了下相关的时钟。 MCU时钟介绍 MCU共有…

22.1 K8S之KubeSphere实现中间件高可用集群

22.1 K8S之KubeSphere实现中间件高可用集群 一. 章节概述二. WordPress1. WordPress 简介---------------------------------------------------------------------------------------------------一. 章节概述 二. WordPress 1. WordPress 简介 创建并部署 WordPress

MySQL 数据库的性能优化方法方法有哪些?

MySQL 数据库的性能优化方法方法有哪些? 从开发角度来看,一般可以从 SQL 和库表设计两部分优化性能。 SQL 优化 根据慢sql日志,找出需要优化的一些sql语句。 常见优化方向: 避免select *,只查询必要的字段&#x…

62 加密算法

62 加密算法 三种加密算法分类: 对称加密:密钥只有一个,解密、解密都是这个密码,加解密速度快,典型的对称加密有DES、AES、RC4等非对称加密:密钥成对出现,分别为公钥和私钥,从公钥…

sass学习笔记(1.0)

1.使用变量 sass可以像声明变量那样进行使用,这样同样的样式,就可以使用相同的变量来提高复用。 语法为:$ 变量名 在界面中也可以正常的显示 当然了,变量之间也可以相互引用,比如下面 div{$_color: #d45387;$BgColo…

kibana 删除es指定数据,不是删除索引

1 查询条件查询出满足条件的数据 GET /order_header_idx_202410/_search {"from":0,"size":10,"query":{"bool":{"filter":[{"term":{"oh_tenantId":{"value":"0211000001",&…

NeuVector部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、安装方法2.1.1、部署NeuVector前的准备工作2.1.1.1 扩容系统交换空间2.1.1.2 Kubernetes单机部署2.1.1.2.1 部署Docker2.1.1.2.2 部署Kubectl2.1.1.2.3 部署Minikube 2.1.1.3 Helm部署 2.1.2、使用Helm部署NeuVector 2.2、使用方法2.2.1…

YOLOv5改进——添加SimAM注意力机制

目录 一、SimAM注意力机制核心代码 二、修改common.py 三、修改yolo.py ​三、建立yaml文件 四、验证 一、SimAM注意力机制核心代码 在models文件夹下新建modules文件夹,在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。 import…

Mysql中创建用户并设置任何主机连接

Mysql中创建用户并设置任何主机连接 文章目录 Mysql中创建用户并设置任何主机连接背景解决方式 背景 在linux上安装mysql,默认用户是root,但是用navicat连接不了,必须要用ssh隧道连接,现在想用任何主机只要输入账号密码之后就可以连接 解决方式 #创建一个指定用户和IP链接的用…

Java:数据结构-ArrayList和顺序表(2)

一 ArrayList的使用 1.ArrayList的构造方法 第一种(指定容量的构造方法) 创建一个空的ArrayList,指定容量为initialCapacity。 public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData new Object[init…

鸿蒙微内核IPC数据结构

鸿蒙内核IPC数据结构 内核为任务之间的通信提供了多种机制,包含队列、事件、互斥锁、信号量等,其中还有Futex(用户态快速锁),rwLock(读写锁),signal(信号)。 队列 队列又称为消息队列,是一种常用于任务间通信的数据…

《ASP.NET Web Forms 实现短视频点赞功能的完整示例》

在现代Web开发中,实现一个动态的点赞功能是非常常见的需求。本文将详细介绍如何在ASP.NET Web Forms中实现一个视频点赞功能,包括前端页面的展示和后端的处理逻辑。我们将确保点赞数量能够实时更新,而无需刷新整个页面。 技术栈 ASP.NET We…

Java进阶之路—单元测试Juint(完整详解Juint使用以及Juin注解,附有代码+案例)

文章目录 单元测试Juint35.1 概述35.2 用法手动导包正确的使用方式 35.3 Junit常用注解 单元测试Juint 35.1 概述 针对最小功能单元编写测试代码,Java中最小功能单元是方法,因此单元测试就是针对Java方法的测试。 对部分代码进行测试。 35.2 用法 &…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的新能源停车场管理系统

开题报告 随着新能源汽车的快速普及和普及,新能源车辆的停车和充电需求也越来越大。传统的停车场管理系统无法满足这些新能源车辆的特殊需求,如充电桩分配、充电桩使用情况的实时监测等。因此,开发一种基于 Java 的新能源停车场管理系统成为…

计算机视觉之YOLO算法基本原理和应用场景

YOLO算法基本原理 整体流程 YOLO 将目标检测问题转化为一个回归问题。它将输入图像划分成多个网格单元,每个网格单元负责预测中心点落在该网格内的目标。对于每个网格单元,YOLO 预测多个边界框以及这些边界框中包含目标的类别概率。边界框通常由中心点坐…

Spring Cloud Stream 3.x+kafka 3.8整合

Spring Cloud Stream 3.xkafka 3.8整合,文末有完整项目链接 前言一、如何看官方文档(有深入了解需求的人)二、kafka的安装tar包安装docker安装 三、代码中集成创建一个测试topic:testproducer代码producer配置(配置的格式,上篇文章…

PHP中的HTTP请求:简化你的网络通信

在当今的网络应用开发中,PHP作为一种流行的服务器端脚本语言,经常需要与外部服务进行通信。这通常涉及到发送HTTP请求来获取或提交数据。幸运的是,PHP提供了多种方式来简化HTTP请求的过程,使得网络通信变得轻而易举。 PHP中的HTTP…

stm32h743 threadx + filex(SD卡读写) + CubeMX + CubeIDE

今天整了一下正点原子阿波罗h743的filex,按部就班的使用CubeMX去搭建环境,再用CubeIDE去编写程序,里面也有几个小坑,问题不大。 Step1. 创建CubeMX 首先设置RCC晶振,SYS为tim6 然后勾选sdmmc1 选择4bits,分频系数为4。这个分频系数选4对应一般的sd卡都可以用了,如果好…