「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

2024-01-09 06:57:09

一、本章前言

在本章中将对以下内容进行详细讲解:

  1. 使用PyMuPDF创建PDF文档
    复制功能代码,看第一部分;
    学习每步逻辑,看第二部分。
  2. 使用PyMuPDF拆分PDF文档
    复制功能代码,看第一部分;
    学习每步逻辑,看第二部分。

需要注意一下版本信息哈,不然后面的代码可能会出错,尤其是PyMuPDF,需要python的版本在3.8以上。

软件版本
Spyder5.4.3
Python3.10.13
PyMuPDF1.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函数。

文章来源:https://blog.csdn.net/m0_64359306/article/details/135358508
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。