Python PDF Magic:合并和拆分随心所欲

news2024/9/17 7:22:09

大家好!小编今天要为大家带来一篇关于Python操作PDF的秘籍——无论是要将PDF合并成一份整体,还是将一个庞大的PDF文件拆分成多个小伙伴,都轻松hold住!你准备好了吗?让我们开始这场奇妙的PDF操作之旅吧!

准备工作

 因为操作PDF,需要用到Python的一个重要的库:PyPDF2。所以还没安装PyPDF2库的,我们先通过pip安装一下吧:

pip install PyPDF2

1、合并PDF - 让PDF们手牵手

from PyPDF2 import PdfWriter
from pathlib import Path


def merge_pdfs(src_folder_path, merged_file_path):
    src_folder = Path(src_folder_path)
    merged_file = Path(merged_file_path)
    merger = PdfWriter()
    for pdf in src_folder.glob("*.pdf"):
        merger.append(pdf)
    merger.write(merged_file)
    merger.close()


# 示例用法
merge_pdfs("C:/Users/olive/Desktop/待合并的PDF",
           "C:/Users/olive/Desktop/待合并的PDF/merged.pdf")

代码解析:

1.from PyPDF2 import PdfWriter:导入PyPDF2库中的PdfWriter,它提供了用于创建新PDF文件的功能。

2.from pathlib import Path:导入Python中的pathlib库中的Path,用于处理文件路径。

3.def merge_pdfs(src_folder_path,merged_file_path)::定义了一个函数merge_pdfs,该函数接受两个参数:src_folder_path(指定的文件夹路径,包含待合并的PDF文件)和merged_file_path(合并后的PDF文件的保存路径)。

4.src_folder = Path(src_folder_path):将src_folder_path转换为Path对象,以便后续处理文件夹。

5.merged_file = Path(merged_file_path):将merged_file_path转换为Path对象,以便后续保存合并后的PDF文件路径。

6.merger = PdfWriter():创建一个PdfWriter对象,用于写入PDF文件。

7.for pdf in src_folder.glob("*.pdf")::遍历src_folder文件夹中所有的PDF文件(以".pdf"结尾的文件)。

8.merger.append(pdf):将遍历到的每个PDF文件添加到合并器(merger)中。

9.merger.write(merged_file):将合并后的PDF文件保存到指定的路径(merged_file)。

10.merger.close():关闭合并器,完成文件合并操作。

11.# 示例用法...:提供了一个示例用法,调用了merge_pdfs函数,并传入了文件夹路径和合并后的PDF文件保存路径。

2、拆分PDF - 让每页都成主角

from PyPDF2 import PdfReader, PdfWriter
from pathlib import Path


def split_pdf(input_file_path, output_folder, step=1):
    input_file = Path(input_file_path)
    output_folder = Path(output_folder)
    pdf_reader = PdfReader(input_file)
    for page_num in range(0, len(pdf_reader.pages), step):
        pdf_writer = PdfWriter()
        for page in pdf_reader.pages[page_num:page_num + step]:
            pdf_writer.add_page(page)
        output_filename = f"第{int(page_num / step) + 1}章.pdf"
        pdf_writer.write(output_folder / output_filename)


# 示例用法
split_pdf('C:/Users/olive/Desktop/待拆分的PDF/large_file.pdf',
          'C:/Users/olive/Desktop/待拆分的PDF', 2)

代码解析:

1.from PyPDF2 import PdfReader,PdfWriter:导入PyPDF2库中的PdfReader和PdfWriter,分别用于读取PDF文件和创建新的PDF文件。

2.from pathlib import Path:导入Python中的pathlib库中的Path,用于处理文件路径。

3.def split_pdf(input_file_path,output_folder,step=1)::定义了一个函数split_pdf,该函数接受三个参数:input_file_path(要拆分的PDF文件路径)、output_folder(拆分后的PDF文件保存的文件夹路径)、step(可选参数,默认值为1,指定每个拆分后的文件包含的页面数量)。

4.input_file = Path(input_file_path):将input_file_path转换为Path对象,以便后续处理PDF文件。

5.output_folder = Path(output_folder):将output_folder转换为Path对象,以便后续保存拆分后的PDF文件路径。

6.pdf_reader = PdfReader(input_file):创建一个PdfReader对象,用于读取输入的PDF文件。

7.for page_num in range(0,len(pdf_reader.pages),step)::循环遍历PDF文件中的每一个页面,步长为step

8.pdf_writer = PdfWriter():创建一个PdfWriter对象,用于创建新的PDF文件。

9.for page in pdf_reader.pages[page_num:page_num + step]::遍历PDF文件的每个页面,并依次添加到pdf_writer中。

10.output_filename = f"第{int(page_num / step) + 1}章.pdf":根据拆分后的序号生成输出文件名。

11.pdf_writer.write(output_folder / output_filename):将拆分后的页面保存到指定的输出文件夹中,并使用生成的文件名。

12.# 示例用法...:提供了一个示例用法,调用了split_pdf函数,并传入了大型PDF文件的路径、输出文件夹的路径以及步长参数。

激动人心的测试

1、合并PDF文件

我们先准备几个PDF文档,记得给文档先编个号哦,不然合并的时候,顺序可能会乱掉:

然后,待最后一行的测试代码改一下,改成你自己的文件夹路径:

# 示例用法
merge_pdfs("C:/Users/olive/Desktop/待合并的PDF",
           "C:/Users/olive/Desktop/待合并的PDF/merged.pdf")

最后,运行代码,我们来检验一下成果吧:

OK,我们看到merged.pdf文件出来了,大家可以打开该文件自行检验一下合并的效果。

2、拆分PDF文件

我们可以把刚才合并好的PDF再做一下拆分,顺便重新命个名吧:

然后,记得改一下测试代码哦,改成你自己的路径,这次我们想两页两页地拆分:

# 示例用法
split_pdf('C:/Users/olive/Desktop/待拆分的PDF/large_file.pdf',
          'C:/Users/olive/Desktop/待拆分的PDF', 2)

运行代码,检验一下成果吧:

嘿嘿,是不是感觉有了点魔法般的妙手回春?让Python为你打开了PDF操作的新世界!快来试试吧,相信你一定也能成为这场奇妙冒险故事中的主角!

希望这些代码能带给你一些灵感和乐趣!如果你对PDF操作还有其他想法,或者是“突如其来”的妙点子,也欢迎分享给我哦!让我们一起为PDF的奇妙世界续写更多美妙篇章吧!💫📄✨

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

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

相关文章

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中,我们讨论了什么是 CRI 和 OCI,Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近,我们得知 Docker 即将从 kubernetes 中弃用!(查看 kubernetes 官方的这篇文章)那么让我…

springboot实现接口请求日志自动生成(日志自动埋点)

文章目录 1.作用:2.原理:3.代码:一.config层二. mq层 :三.service层: 4.效果图5.声明 1.作用: springboot接口请求日志自动生成,实现接口日志自动埋点生成 1.统一日志生成格式;—方便查看 2.汇…

day2 数组

977.有序数组的平方 有负数。暴力快排:先对每个元素平方 o(n),再快排o(nlogn)(先分区 o(n),再递归排序 递归深度 logn) class Solution:def sortedSquares(self, nums: List[int]) -> List…

控制欲过强的Linux小进程

控制欲强?视奸?普通人那才叫视奸,您是皇帝,天下大事无一逃过您的耳目,您想看什么就看什么,臣怀疑他在朋友圈私养兵士,囤积枪甲,蓄意谋反,图谋皇位啊! 哈哈哈哈开个玩笑&…

C++ 类和对象 构造函数(下)

一 初始化列表: 1.1 构造函数体赋值: 在C中,构造函数用于创建对象并赋予其初始值。通常,我们可以在构造函数体内对成员变量进行赋值: class Date { public:Date(int year, int month, int day) {_year year;_mont…

常见的数据分析用例 —— 信用卡交易欺诈检测

文章目录 引言数据集分析1. 读入数据并快速浏览2.计算欺诈交易占数据集中交易总数的百分比3. 类别不平衡对模型的影响3.1 总体思路(1)数据的划分(2)训练模型(3)测试模型(4)解决不平衡…

知迪科技发布了全新软件产品

近日,知迪科技发布了全新软件产品——Vehicle Bus Tool-Trace Version免费版。该软件产品能高效的离线分析汽车总线数据,并拥有一大亮点功能:Ethernet通信离线文件基于ARXML文件的信号级解析,具体操作如下: 1、新建一…

git修改提交姓名

git config --global user.name “新用户名” git config --global user.email “新邮箱地址” 修改提交的用户名 git config --global user.name “yu***”

java转义文本中的HTML字符为安全的字

java转义文本中的HTML字符为安全的字 &#xff0c;以下字符被转义&#xff1a;替换为 (&apos; doesnt work in HTML4) " 替换为 &quot; & 替换为 &amp; < 替换为 < > 替换为 >1.先添加hutool依赖到pom <dependency><groupId>cn…

Docker安装笔记

1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后&#xff0c;左侧菜单选中镜像加速器就可以看到你的专属地…

阿尔泰科技利用485模块搭建自动灌溉系统实现远程控制

自动灌溉系统又叫土壤墒情监控系统&#xff0c;土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输&#xff0c;数据在监控中心自动接收入库&#xff1b;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…

怎样在 PostgreSQL 中实现数据的异地备份?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中实现数据的异地备份&#xff1f;一、异地备份的重要性二、PostgreSQL 中的备份方…

Docker的安装【虚拟机】

Docker的安装【虚拟机】 准备环节【可跳过】 # 进入yum.repos.d目录&#xff0c;保留base.repo 和 CentOs-Base.repo&#xff0c;其余删除 cd /etc/yum.repos.d/ ----------------------------------------------------- # 现将base.repo 和 CentOs-Base.repo 存放至bak包中 …

SQL执行流程、SQL执行计划、SQL优化

select查询语句 select查询语句中join连接是如何工作的&#xff1f; 1、INNER JOIN 返回两个表中的匹配行。 2、LEFT JOIN 返回左表中的所有记录以及右表中的匹配记录。 3、RIGHT JOIN 返回右表中的所有记录以及左表中的匹配记录。 4、FULL OUTER JOIN 返回左侧或右侧表中有匹…

深度洞察市场需求,Vatee万腾平台定制化解决方案引领潮流

在当今这个日新月异的商业环境中&#xff0c;深刻理解并精准把握市场需求&#xff0c;已成为企业生存与发展的核心要义。Vatee万腾平台&#xff0c;作为行业内的佼佼者&#xff0c;凭借其卓越的定制化解决方案能力&#xff0c;正引领着市场潮流&#xff0c;为企业客户量身打造数…

【BUG】已解决:AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 目录 已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https:/…

Linux—KVM虚拟化中(虚拟机克隆,快照,还原,删除)等应用实例

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

【数据结构初阶】顺序表三道经典算法题(详解+图例)

Hello&#xff01;很高兴又见到你了~~~ 看看今天要学点什么来充实大脑吧—— 目录 1、移除元素 【思路图解】 【总结】 2、删除有序数组中的重复项 【思路图解】 【总结】 3、合并两个有序数组 【思路图解】 【总结】 至此结束&#xff0c;Show Time&#xff01; 1、…

加拿大上市药品查询-加拿大药品数据库

在加拿大&#xff0c;药品的安全性、有效性和质量是受到严格监管的。根据《食品药品法案》的规定&#xff0c;所有药品制造商必须提供充分的科学证据&#xff0c;证明其产品的安全性和有效性。为此&#xff0c;加拿大卫生部建立了一个全面的药品数据库 &#xff08;DPD) &#…

Websocket自动消息回复服务端工具

点击下载《Websocket自动消息回复服务端工具》 1. 前言 在进行Websocket开发时&#xff0c;前端小伙伴通常是和后端开发人员同步进行项目开发&#xff0c;经常会遇到后端开发人员接口还没开发完&#xff0c;也没有可以调试的环境&#xff0c;只能按照接口文档进行“脑回路开发…