文章目录
- 一、本章前言
- 二、使用PyMuPDF创建PDF文档
- 1、实例代码
- 2、过程详解
- ①. 安装PyMuPDF
- ②. 导入PyMuPDF模块
- ③. 创建一个新的PDF文档
- ④. 添加页面和内容
- ⑤. 保存文档
 
 
- 三、使用PyMuPDF拆分PDF文档
- 1、实例代码
- 2、过程解析
- ①. 导入模块
- ②. 定义函数
- ③. 打开源PDF文件
- ④. 遍历页面并分割PDF
- ⑤. 保存和关闭文件
- ⑥. 调用函数并执行分割操作
 
 
一、本章前言
在本章中将对以下内容进行详细讲解:
- 使用PyMuPDF创建PDF文档
 复制功能代码,看第一部分;
 学习每步逻辑,看第二部分。
- 使用PyMuPDF拆分PDF文档
 复制功能代码,看第一部分;
 学习每步逻辑,看第二部分。
需要注意一下版本信息哈,不然后面的代码可能会出错,尤其是PyMuPDF,需要python的版本在3.8以上。
| 软件 | 版本 | 
|---|---|
| Spyder | 5.4.3 | 
| Python | 3.10.13 | 
| PyMuPDF | 1.23.8 | 
二、使用PyMuPDF创建PDF文档
使用PyMuPDF创建PDF文档是一个相对简单的过程。下面是一个详细的步骤指南,帮助你了解如何使用PyMuPDF库来创建PDF文档:
1、实例代码
import fitz  # PyMuPDF# 创建一个新的PDF文档对象
doc = fitz.Document()# 如果文档中没有页面的话,添加一个新页面并获取它
if doc.page_count == 0:doc.new_page()
page = doc[0]  # 获取第一页(也是唯一的一页)# 在页面上插入一个包含文本的文本框
rect = fitz.Rect(50, 50, 200, 100)  # 定义文本框的位置和大小(x1, y1, x2, y2)
text_instances = page.insert_textbox(rect, "这是我创建的第一个PDF文档!", fontname="helv", fontsize=12)# 保存文档到文件系统中
doc.save("E:\\UserData\\Desktop\\new.pdf")  # 将文档保存为new.pdf文件
代码执行效果截图
 
2、过程详解
①. 安装PyMuPDF
首先,在确保你的Python版本在3.8以上的基础上,通过下面的命令,可以对PyMuPDF进行安装:
pip install PyMuPDF
安装过程注意事项
如果通过默认源进行安装,可能会出现速度较慢的情况,我们可以通过下面的方法解决:
pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple/
在上面的命令中,-i 参数指定了使用清华大学的PyPI镜像源(https://pypi.tuna.tsinghua.edu.cn/simple/)来下载并安装PyMuPDF包。没有深究过,我猜i大概就是 interface的首字母吧。
除了清华源,pip还有其他的国内源可供选择,例如:
阿里源:http://mirrors.aliyun.com/pypi/simple/
豆瓣源:http://pypi.douban.com/simple/
中国科学技术大学源:https://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学源:http://pypi.hustunique.com/
②. 导入PyMuPDF模块
通过下面的方式导入PyMuPDF模块:
import fitz  # PyMuPDF
注意:PyMuPDF通常被称为fitz,这是对其底层库MuPDF的致敬。
 
③. 创建一个新的PDF文档
我们可以使用fitz.open()函数创建一个新的PDF文档。这个函数通常用于打开现有的PDF文件,但如果当你传递一个不存在的文件路径或一个文件对象时,它会创建一个新的PDF文档。
但更常见并且更为推荐的一种做法是直接使用fitz.Document()来显式地创建一个新文档。
doc = fitz.Document()  # 创建一个空的PDF文档
④. 添加页面和内容
接下来我们向文档中添加页面和内容。我们可以使用Document.new_page()方法来添加一个新页面,然后使用Page.insert_textbox()或其他绘图方法来添加文本、图像或者其他的内容。不过,new_page方法通常不需要直接调用,因为当我们首次向文档添加内容时,它会自动创建一个新页面。
举一个简单的,向第一页添加文本:
# 如果文档中没有页面的话,就添加一个新页面
if doc.page_count == 0:doc.new_page()# 通过doc[0]获取第一页
page = doc[0]# 创建一个文本框并添加文本
rect = fitz.Rect(50, 50, 200, 100)  # 定义文本框的位置和大小(x1, y1, x2, y2)
text_instances = page.insert_textbox(rect, "这是我创建的第一个PDF文档!", fontname="helv", fontsize=12)
⑤. 保存文档
最后,使用Document.save()方法将你的更改保存到文件中:
doc.save("E:\\UserData\\Desktop\\new.pdf")  # 将文档保存为new.pdf文件
三、使用PyMuPDF拆分PDF文档
1、实例代码
# -*- coding: utf-8 -*-
"""
Created on Wed Jan  3 11:04:40 2024@author: 85401
"""# 导入PyMuPDF库
import fitz    # 定义一个名为split_pdf的函数,设置两个参数:
# source_filepath(我们要处理的PDF文件的路径)和 output_folder(分割以后输出文件夹的路径)
def split_pdf(source_filepath, output_folder):# 使用fitz.open方法打开源PDF文件,并将其对象赋值给source_pdf变量source_pdf = fitz.open(source_filepath)# 遍历source_pdf中的每一页,page_number从0开始计数  for page_number in range(source_pdf.page_count):# 创建一个新的PDF文档对象output_pdf  output_pdf = fitz.open()    # 使用insert_pdf方法将源PDF文件的指定页面插入到新PDF文档中 # from_page=page_number, to_page=page_number 的意思是:# 我只要 source_pdf 的 第 page_number 页。output_pdf.insert_pdf(source_pdf, from_page=page_number, to_page=page_number)    # 构建输出文件的路径和名称,格式为"输出文件夹路径/page_{页码号}.pdf"  output_filename = f"{output_folder}/page_{page_number + 1}.pdf"    # 保存新PDF文档到指定的输出文件路径  output_pdf.save(output_filename)    # 关闭新创建的PDF文档,释放资源 output_pdf.close()    # 关闭源PDF文件,释放资源  source_pdf.close()    # 指定输入文件的路径为桌面上的一个PDF文件  
input_file = "E:\\UserData\\Desktop\\三级笔译考试大纲.pdf"  
# 指定输出文件夹的路径为桌面上的一个文件夹  
output_folder = "E:\\UserData\\Desktop\\PDF"  
# 调用split_pdf函数,传入输入文件和输出文件夹的路径,开始执行PDF分割操作  
split_pdf(input_file, output_folder)
分割效果图
 
2、过程解析
当然可以。以下是对您提供的代码的深度解析,分章分节进行详细讲解:
①. 导入模块
import fitz  # 导入PyMuPDF库
②. 定义函数
def split_pdf(source_filepath, output_folder):# ...(函数体)
解析:
- 定义了一个名为split_pdf的函数,该函数接受两个参数。
- source_filepath(我们要处理的PDF文件的路径)
- output_folder(输出文件夹的路径)。
- 这个函数目的在于将源PDF文件的每一页分割成单独的PDF文件,并保存到指定的输出文件夹中。
③. 打开源PDF文件
source_pdf = fitz.open(source_filepath)  # 使用fitz.open方法打开源PDF文件
解析:
- source_pdf = fitz.open(source_filepath):这行代码使用- fitz.open方法打开了指定路径下的源PDF文件,并将返回的文件对象赋值给变量- source_pdf。
④. 遍历页面并分割PDF
for page_number in range(source_pdf.page_count):  # 遍历每一页output_pdf = fitz.open()  # 创建一个新的PDF文档对象output_pdf.insert_pdf(source_pdf, from_page=page_number, to_page=page_number)  # # ...(其他代码)
解析:
-  for page_number in range(source_pdf.page_count)::使用for循环遍历源PDF文件中的每一页。range(source_pdf.page_count)生成一个从0到source_pdf.page_count - 1的整数序列,代表PDF文件中的每一页的页码。
-  output_pdf = fitz.open():在每次循环中,都创建一个新的空白PDF文档对象,并赋值给变量output_pdf。这个新文档将用于保存从源PDF文件中提取的单个页面。
-  output_pdf.insert_pdf(source_pdf, from_page=page_number, to_page=page_number):这行代码是将源PDF文件中的指定页面插入到新创建的PDF文档中。
⑤. 保存和关闭文件
output_filename = f"{output_folder}/page_{page_number + 1}.pdf"  # 构建输出文件名
output_pdf.save(output_filename)  # 保存新PDF文件到指定位置
output_pdf.close()  # 关闭新PDF文件
source_pdf.close()  # 关闭源PDF文件(这行代码位置有误)
解析:
-  output_filename = f"{output_folder}/page_{page_number + 1}.pdf":使用格式化字符串构建输出文件的路径和名称。文件名以“page_{页码号}.pdf”的格式命名,其中页码号从1开始计数。
-  output_pdf.save(output_filename):将新创建的包含单个页面的PDF文档保存到指定的输出文件路径中。这样,每个页面都会被保存为一个单独的PDF文件。
-  output_pdf.close():关闭新创建的PDF文档对象,释放与之关联的资源。
-  source_pdf.close():关闭源PDF文件对象,释放与之关联的资源。
⑥. 调用函数并执行分割操作
input_file = "E:\\UserData\\Desktop\\三级笔译考试大纲.pdf"  # 指定输入文件的路径为桌面上的一个PDF文件
output_folder = "E:\\UserData\\Desktop\\PDF"  # 指定输出文件夹的路径为桌面上的一个文件夹
split_pdf(input_file, output_folder)  # 调用split_pdf函数,传入输入文件和输出文件夹的路径,开始执行PDF分割操作
解析:
-  input_file = "E:\\UserData\\Desktop\\三级笔译考试大纲.pdf"和output_folder = "E:\\UserData\\Desktop\\PDF":分别指定了输入文件的路径和输出文件夹的路径。
-  split_pdf(input_file, output_folder):传入参数并调用之前定义的split_pdf函数。