不知道大家有没有遇到过这么一种情况,就比如一个pdf格式的电子书,我们经常浏览的是其中的一部分,而这电子书的页数很大,每当需要浏览时,就需要翻到对应的页码,就有点儿繁琐。

还有一些情况,比如,我们想分享pdf文件里的部分内容给别人,我们也需要用到pdf分页,不仅可以分析指定内容,而且也可以减少发送文件的大小O(∩_∩)O哈哈~

总之,pdf的分页,我们在现实生活中,是难免会遇到的事。当你遇到时,你是怎么解决的呢?

在Python中,实现pdf分页,是及其简单的,只需要运行几行代码,即可实现,不管你的pdf文件有多大,下面让我们一起看看吧~

注:每部分代码的作用,我都注释再来代码后面,注意查看喔~

from PyPDF2 import PdfFileReader, PdfFileWriter
import os def split(path, page_num):
try: # 捕获值异常错误,就是只输入了一个页数的时候
page_start, page_end = page_num.split()
except ValueError:
page_start = page_num
page_end = page_num
output_name = os.path.splitext(path)[0] + f'({page_start}-{page_end}).pdf' # 输出分割后的pdf文件
page_start, page_end = int(page_start), int(page_end) # 将页码转为整数类型
if os.path.splitext(path)[1] == '': # 判断文件格式是否以.pdf结尾
path = path + ".pdf"
try:
pdf = PdfFileReader(path) # 读取pdf
except FileNotFoundError:
print("Error:请确认您输入的pdf文件是否存在!")
return
pdf_writer = PdfFileWriter() # pdf写入对象 if page_start < 1 or page_end > pdf.getNumPages(): # 判断页码是否在合理范围内,即有没有小于或大于pdf文件的页数
print("Error:页码超出合理范围,请确定您输入的页数区间在合理范围之内!")
return
for page in range(page_start-1, page_end): # 需要分割的pdf页数区间,因为读取的页数是从0开始计数的,所以减1
pdf_writer.addPage(pdf.getPage(page)) # pdf页数读取,存于内存,并未开始写入
with open(output_name, 'wb') as output_pdf:
pdf_writer.write(output_pdf) # 开始写入指定页数区间的pdf
print("分页完成,注意查收:" + output_name) if __name__ == '__main__':
source_path = input("请输入需要分割的pdf的文件:") # 需要分割的pdf文件
pages = input("请输入分割的起始页和终止页,以空格分开:")
split(source_path, pages)

其实最主要的代码就下面的几行:

pdf = PdfFileReader(path)  # 读取pdf
pdf_writer = PdfFileWriter() # pdf写入对象
for page in range(page_start, page_end): # 需要分割的pdf页数区间
pdf_writer.addPage(pdf.getPage(page)) # pdf页数读取,存于内存,并未开始写入
with open(output_name, 'wb') as output_pdf:
pdf_writer.write(output_pdf) # 开始写入指定页数区间的pdf

我只是在其基础上增加了一些异常错误捕获并解决的代码,并实现代码的循环利用,而不是只针对于一个pdf文件。

代码使用展示:

1.源文件



书的页数还是挺大的

2.目标页数区间

注意,虽然这里的页码是271,但并不代表就是271,因为读取的pdf文件页码是整个文件的页码,就比如书的封面,目录的页数也得包含进去。

所以,我们可以简单算一下,书的页码第一页与到封面差了几页,我这里差的是13页,所以就是271+13=284作为分割起始页,需要截取的页数对应书上的页码是276,276+13=289,所以终止页就是289

3.代码运行

4.异常捕获的代码展示:

输入的起始页小于1:

pdf页码一共才600页,然后输入了终止页为700:

5.其它

要求的是区间,但你可以输入1 1,1:

代码还可以继续完善,感兴趣的小伙伴可以开动开动一下自己聪明的脑袋瓜子haha

Python | 实现pdf文件分页的更多相关文章

  1. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

  2. 使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  3. 记一次为解决Python读取PDF文件的Shell操作

    目录 一.背景 二.问题 三.解决 四.一顿分析及 Shell 操作 五.后续 一.背景 本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件.有的是免费的.收费,咱也不 ...

  4. Python实现PDF文件截取

    python3截取PDF文件中的一部分. from PyPDF2 import PdfFileWriter, PdfFileReader # 开始页 start_page = 0 # 截止页 end_ ...

  5. windows下用Python把pdf文件转化为图片

    依赖:PyMuPDF(pip install pymupdf) # -*- coding: utf-8 -*- """ 1.安装库 pip install pymupdf ...

  6. python读取pdf文件

    pdfplumber简介 Pdfplumber是一个可以处理pdf格式信息的库.可以查找关于每个文本字符.矩阵.和行的详细信息,也可以对表格进行提取并进行可视化调试. 文档参考https://gith ...

  7. 使用python进行pdf文件分割

    Python代码 import os from pyPdf import PdfFileWriter, PdfFileReader def split(pdf_file, delta, output_ ...

  8. 【python】用python生成pdf文件

    转自:https://www.davidfischer.name/2015/08/generating-pdfs-with-and-without-python/ from reportlab.pla ...

  9. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

随机推荐

  1. 运行FreeSWITCH的命令行参数

    一般来说,FreeSWITCH 不需要任何命令行参数就可以启动,但在某些情况下,你需要以一些特殊的参数启动.在此,仅作简单介绍.如果你知道是什么意思,那么你就可以使用,如果不知道,多半你用不到. 使用 ...

  2. 集合Collection ----List集合

    Collection集合体系的特点: set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ----LinkedHashSet: 有序,不重复,无索引 ...

  3. 机器学习——K-Means算法

    1 基础知识 相似度或距离 假设有 $m$ 个样本,每个样本由 $n$ 个属性的特征向量组成,样本合集 可以用矩阵 $X$ 表示 $X=[x_{ij}]_{mn}=\begin{bmatrix}x_{ ...

  4. linux停止nginx服务 未成功

    在上线新功能的时候,需要将服务器停掉,防止在更新过程中有用户进行操作额外的数据. 1:查看nginx主进程: ps -ef | grep nginx 这里root 后面的数字表示:主进程号nginx后 ...

  5. Docker系列(3)- 配置阿里云镜像加速

    step-1 登录阿里云找到容器服务 step-2 找到镜像加速地址 step-3 配置使用 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon ...

  6. jmeter压测学习12-设置持续压测时间(调度器的使用)

    前言 使用jmeter 做压测的时候,希望对一个接口持续压测 10 分钟或者半小时,可以使用调度器设置持续压测时间. 设置样本总数 压测方式有2种,一种是设置线程组和循环次数,这样可以设置一个样本总数 ...

  7. hadoop 学习笔记二

    NameNode的持久化(persistent)(day4,1) 类似于:Redis redis中的持久化文件是相互独立的当两个持久化文件同时存在时默认使用的是aof ,但是namenode 的持久化 ...

  8. [转载]SELinux 环境下网络服务设置,配置 Apache 、Samba、NFS

    原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-selinux-services1/index.html?ca=drs- 引言 SELinux ...

  9. 高中最后一刻&大学第一课&为人师的责任

    文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...

  10. Dapr 虚拟机集群部署 (非K8S)

    从2021-10-08号发布4小时Dapr + .NET 5 + K8S实战到今天刚刚一周时间,报名人数到了230人,QQ群人数从80人增加到了260人左右,大家对Dapr的关注度再一次得到了验证,并 ...