笔者会力争将Python中所有关于PDF的操作讲的一清二楚,涵盖各种第三方库、标准库的使用说明,如果觉得还不错的话,麻烦给一个订阅哈~
在本章的讲解中,将对如何使用PyPDF2拆分/分割PDF、合并PDF,以及删除PDF中的指定页面进行讲解,希望能帮得到你。
在工作当中,有的时候确实会遇见上面的三种需求,而我们能找得到的大部分软件或工具,都会设置一个付费可用或开通VIP才可以使用,如果我们自己就能实现的话,为什么还要花这个冤枉钱呢?废话不多说,直接开始说干的。
在这一节当中,我们的需求是将一个PDF分割成为若干个PDF,便于其余的操作,在某款强大的软件当中,这个功能是必需开通会员的,但是,我们用一段代码,就可以轻松实现了。
我改一下以往的习惯,我先把代码全都贴出来,然后再解释一下可能需要解释的东西。
from PyPDF2 import PdfReader, PdfWriter # 导入需要的模块
import os # 导入操作系统模块
def split_pdf(input_pdf, start_page, end_page, output_folder): # 定义一个函数,接受输入PDF文件、起始页、结束页和输出文件夹作为参数
pdf_reader = PdfReader(input_pdf) # 使用PdfReader打开输入的PDF文件
for page_num in range(start_page - 1, end_page): # 遍历指定的页码范围
pdf_writer = PdfWriter() # 创建一个PdfWriter对象
pdf_writer.add_page(pdf_reader.pages[page_num]) # 将指定页添加到PdfWriter对象中
output_pdf = os.path.join(output_folder, f'page_{page_num+1}.pdf') # 构建输出文件的路径
with open(output_pdf, 'wb') as output_file: # 使用二进制写入模式打开输出文件
pdf_writer.write(output_file) # 将PdfWriter对象中的内容写入输出文件
input_pdf = r'E:\UserData\Desktop\123.pdf' # 输入PDF文件的路径
output_folder = r'E:\UserData\Desktop\result' # 输出文件夹的路径
start_page = 1 # 起始页码
end_page = 5 # 结束页码
split_pdf(input_pdf, start_page, end_page, output_folder) # 调用split_pdf函数,按照指定的页码范围分割PDF并保存在输出文件夹中
利用上面的代码,就可以把一份完整的 PDF 按照页码进行分割,分割成为单独的页面,并保存到指定的文件夹当中了。
我所处理的PDF文件一共包含有五个页面,我要做的是通过上面的代码,将这个PDF按照页数分成五份。第一张图为完整PDF的缩略图,第二张图为分割以后得文件列表。
其实大部分的函数/命令在代码当中都有对应的注释进行讲解,我写教程追求事无巨细的把所有东西讲给阅读文章的每个人,所以如果你觉得这一部分你想了解的话,可以看一下,如果单纯只是想copy以下代码实现你要的功能,那这第三部分可以跳过去了哈。
说到这里你是不是就明白了?分割/拆分PDF,只是把我们的目标文件当中的每个页面读入内存,然后创建新的文件,把每页写入新文件,就完成了分割PDF的目的了。
在这一小节当中,我们的需求是将多个PDF文件合并成为一个文件,这个需求我刚好最近有碰到过,比如我们领导要求的是,让我去打印100个PDF,如果我每个PDF都打开,然后点击打印,我需要重复100遍这个操作,我完全可以全部合并为一个PDF,这样我打印一遍就可以了,同样,在某款功能强大的软件里面,它是需要开通VIP权限的,不然页数也有限制,钱省下来去吃烧烤不香吗?
import os
import PyPDF2
# 创建一个PDF写入对象
pdf_writer = PyPDF2.PdfWriter()
# 指定目录
directory = 'E:\\UserData\\Desktop\\result'
# 遍历目录中的所有文件
for filename in os.listdir(directory):
if filename.endswith('.pdf'):
# 打开PDF文件并将页面添加到PDF写入对象中
pdf_file = open(os.path.join(directory, filename), 'rb') # 打开PDF文件
pdf_reader = PyPDF2.PdfReader(pdf_file) # 创建PDF读取对象
for page_num in range(len(pdf_reader.pages)): # 遍历PDF页面
page = pdf_reader.pages[page_num] # 获取页面
pdf_writer.add_page(page) # 将页面添加到写入对象中
pdf_file.close() # 关闭PDF文件
# 将合并后的PDF文件保存到目录中
output_file = open(os.path.join(directory, 'merged_file.pdf'), 'wb') # 创建合并后的PDF文件
pdf_writer.write(output_file) # 写入合并后的PDF文件
output_file.close() # 关闭文件
在上面的代码当中,首先我们给一个目录,就是所有需要合并的PDF文件所在的位置,然后其余的都不用改动了。
在下图中,红色框选文件是待合并的文件,蓝色框选文件是合并后的文件。
os.listdir(directory): Python标准库内置的函数,用于返回指定目录中的文件和子目录的列表。在上面的代码中,我们用它返回指定目录里面PDF文件的列表,然后用于合并。
os.path.join(directory, filename): os模块中的一个函数,用于将多个路径组合成一个完整的文件路径。在上面的代码中,我们用它来创建PDF文件的完整目录。
open(file, mode): Python内置的函数,用于打开文件。在上面的代码中,我们用它打开PDF文件,以便后面的处理。
PyPDF2.PdfReader(pdf_file): PyPDF2库中的函数,用于创建一个PDF读取对象,读取PDF文件的内容,在分割PDF的那一部分当中我们也用到了。
pdf_writer.add_page(page): PyPDF2库中的函数,用于将页面添加到PDF写入对象中,以便合并多个PDF文件的内容。
pdf_writer.write(output_file): PyPDF2库中的函数,用于将合并后的PDF文件内容写入到指定的输出文件中。
在上一节当中,我们合并的是每个文件只有一个页面的PDF,本节我们来说一下每个文件有多个页面的PDF合并。
import os # 导入os模块,用于文件操作
import PyPDF2 # 导入PyPDF2库,用于处理PDF文件
# 创建一个PDF写入对象
pdf_writer = PyPDF2.PdfWriter()
# 指定目录
directory = 'E:\\UserData\\Desktop\\result' # 设置要处理的目录
# 遍历目录中的所有PDF文件
for filename in os.listdir(directory): # 遍历指定目录中的文件
if filename.endswith('.pdf'): # 如果文件是以.pdf结尾的PDF文件
# 打开PDF文件并将页面添加到PDF写入对象中
pdf_file = open(os.path.join(directory, filename), 'rb') # 以只读二进制模式打开PDF文件
pdf_reader = PyPDF2.PdfReader(pdf_file) # 创建PDF读取对象
for page_num in range(len(pdf_reader.pages)): # 遍历PDF页面
page = pdf_reader.pages[page_num] # 获取页面
pdf_writer.add_page(page) # 将页面添加到写入对象中
pdf_file.close() # 关闭PDF文件
# 将合并后的PDF文件保存到目录中
output_file = open(os.path.join(directory, 'merged_file.pdf'), 'wb') # 以只写二进制模式打开合并后的PDF文件
pdf_writer.write(output_file) # 将合并后的PDF写入到文件中
output_file.close() # 关闭文件
下图中蓝色框选的文件为其余几个文件按顺序合并后的文件,其余几个文件都是包含3-5个页面的PDF。
基本上用到的函数,都在之前已经说明过了,所以这里就不在赘述相同的内容了。