Python对PDF文件的合并操作

在处理 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.rhkb.cn/news/443615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密,只需把公钥发送到server就可,会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…

全闪 SDS 一体机提供 FC 能力承载医院核心业务

邹平市人民医院使用 X3000 SDS 一体机组建分布式存储集群,通过 FC 接口 与 VMware 集群连接,以全闪池承载核心业务,对象存储承载 PACS 数据,实现存储架构的升级改造。 “新医改”的不断推进,对医院的运营管理、服务质…

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面:https://illusionno.github.io/ 源码也在这里:https://github.com/illusionno/my-blog (如果觉得有帮助,可以点颗star✨) 使用的主题是vuepress-theme-reco2.x,并在上面进行了一些调…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集,标注为json格式,总共有5类 避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张)&#xff0…

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)

前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

设备多久(60/50/40min)未上报,类似场景发送通知实现方案

场景描述 设备比较多,几十万甚至上百万,设备在时不时会上报消息。 用户可以设置设备60分钟、50分钟、40分钟、30分钟未上报数据,发送通知给用户,消息要及时可靠。 基本思路 思路: 由于设备在一直上报,如果…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里,编写高效且易于维护的测试脚本是一项挑战,尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具,它提供了丰富的API和灵活的脚本编写方式,帮助测试人员高效地开展UI自动化测试。然而&#xf…

Linux的环境与历史

目录 引言 1. Linux 背景介绍 2. 开源 3. 官网 4. 企业应用现状 5. 发行版本 6.见见猪跑 引言 在这个信息化时代,掌握一门操作系统技能显得尤为重要。Linux作为一款开源、稳定且功能强大的操作系统,不仅在服务器领域占据主导地位,也逐渐…

哈希表结构

哈希表结构:数组链表 案例一:HashSet集合的常见使用方法 package com.collection;import java.util.HashSet; import java.util.Iterator;/*** HashSet集合的使用* 存储结构:哈希表(数组链表红黑树)*/ public class Demo07 {public static v…

性能测试学习6:jmeter安装与基本配置/元件/线程组介绍

一.JDK安装 官网:https://www.oracle.com/ 二.Jmeter安装 官网:http://jmeter.apache.org/download_jmeter.cgi 下载zip包,zip后缀那个才是Windows系统的jmeter 三.Jmeter工作目录介绍 四.Jmeter功能 1)修改默认配置-汉化 2&am…

SapGUI For Windows捕获技术

一、SapGUI For Windows捕获技术 文章目录 一、SapGUI For Windows捕获技术SAP GUI:SAP NetWeaver Business Client:SAP Fiori:二.Sap的自动化配置SAP客户端配置三.Sap GUI自动化脚本四.Sap GUI自动化开发SAP GUI: SAP图形用户界面,是最常用的SAP前端界面。它是一个桌面应…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

leetcode58:最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1: 输入:s "Hello World" 输出&#xff…

Linux SSH服务

Linux SSH(Secure Shell)服务是一种安全的远程登录协议,用于在Linux操作系统上远程登录和执行命令。它提供了加密的通信通道,可以在不安全的网络环境中安全地进行远程访问。 SSH服务在Linux系统中通常使用OpenSSH软件包来实现。它…

【Java SE 题库】输出一个数的二进制的奇数位和偶数位

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 分析 3. 代码实现 3.1 运行结果 4. 小结 1. 题目 输入一个数,请分别打印这个数二进制的奇数位和偶数位 例:15 …

Element-快速入门

什么是 Element 在现代前端开发中,组件化的思想日益盛行,Element组件库作为一款流行的UI组件库,特别适用于基于Vue.js的项目,它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库,我们需要完成下面…

yolov8-pose的TensorRT动态库部署(C++)

文章目录 参考代码概要硬件动态库代码文件结构头文件yolov8-pose.hyolov8-pose.cppCMakeLists.txt调用例子main.cppCMakeLists.txt获取engine模型测试结果参考代码 https://github.com/triple-Mu/YOLOv8-TensorRT 概要 为了方便使用,基于上述开源代码,将其封装成动态库,方…

GAMES104:16 游戏引擎的玩法系统:基础AI-学习笔记

文章目录 一,寻路/导航系统Navigation1.1 Walkable Area1.1.1 Waypoint Network1.1.2 Grid1.1.3 Navigation Mesh1.1.4 Sparse Voxel Octree 1.2 Path Finding1.2.1 Dijkstra Algorithm迪杰斯特拉算法1.2.2 A Star(A*算法) 1.3 Path Smoothin…

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法

如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…

Python 工具库每日推荐【Pillow】

文章目录 引言Python图像处理库的重要性今日推荐:Pillow工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:创建图像拼贴案例分析高级特性图像增强图像水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏,感兴…