在本章中将对以下内容进行详细讲解:
需要注意一下版本信息哈,不然后面的代码可能会出错,尤其是PyMuPDF,需要python的版本在3.8以上。
软件 | 版本 |
---|---|
Spyder | 5.4.3 |
Python | 3.10.13 |
PyMuPDF | 1.23.8 |
使用PyMuPDF创建PDF文档是一个相对简单的过程。下面是一个详细的步骤指南,帮助你了解如何使用PyMuPDF库来创建PDF文档:
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文件
代码执行效果截图
首先,在确保你的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模块:
import fitz # PyMuPDF
注意:PyMuPDF通常被称为fitz
,这是对其底层库MuPDF的致敬。
我们可以使用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文件
# -*- 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)
分割效果图
当然可以。以下是对您提供的代码的深度解析,分章分节进行详细讲解:
import fitz # 导入PyMuPDF库
def split_pdf(source_filepath, output_folder):
# ...(函数体)
解析:
split_pdf
的函数,该函数接受两个参数。source_filepath
(我们要处理的PDF文件的路径)output_folder
(输出文件夹的路径)。source_pdf = fitz.open(source_filepath) # 使用fitz.open方法打开源PDF文件
解析:
source_pdf = fitz.open(source_filepath)
:这行代码使用fitz.open
方法打开了指定路径下的源PDF文件,并将返回的文件对象赋值给变量source_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
函数。