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

文章目录

  • 一、本章前言
  • 二、使用PyMuPDF创建PDF文档
    • 1、实例代码
    • 2、过程详解
      • ①. 安装PyMuPDF
      • ②. 导入PyMuPDF模块
      • ③. 创建一个新的PDF文档
      • ④. 添加页面和内容
      • ⑤. 保存文档
  • 三、使用PyMuPDF拆分PDF文档
    • 1、实例代码
    • 2、过程解析
      • ①. 导入模块
      • ②. 定义函数
      • ③. 打开源PDF文件
      • ④. 遍历页面并分割PDF
      • ⑤. 保存和关闭文件
      • ⑥. 调用函数并执行分割操作

一、本章前言

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

  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函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333719.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型笔记【2】 LLM in Flash

Apple最近发表了一篇文章,可以在iphone, MAC 上运行大模型:【LLM in a flash: Efficient Large Language Model Inference with Limited Memory】。 主要解决的问题是在DRAM中无法存放完整的模型和计算,但是Flash Memory可以存放完整的模型。…

大模型训练算力利用率达60%,蚂蚁开源分布式训练扩展库ATorch

近日,蚂蚁集团宣布开源大模型分布式训练加速扩展库ATorch。ATorch可针对不同模型和硬件资源,实现深度学习自动资源动态优化和分布式训练稳定性提升,帮助提升深度学习的智能性。据了解,在大模型训练中,ATorch千亿模型千…

第7章 DOM(下)

学习目标 熟悉节点的概念,能够说出节点的属性和层级 掌握节点操作,能够完成节点的获取、创建、添加、移除和复制操作 掌握事件的进阶操作,能够实现事件的监听和移除 熟悉DOM事件流,能够说出事件捕获和事件冒泡两种方式的区别 …

JavaScript版数据结构与算法(一)栈、队列、链表、集合、树

一、前言 为什么要学习数据结构与算法?最重要的就是面试要考算法,另外就是如果在实际工作当中,能够使用算法优化代码,会提升代码质量和运行效率,作为一名前端人员可能在实际中用的并不是特别多。数据结构与算法是分不…

4.6 BOUNDARY CHECKS

我们现在扩展了tile矩阵乘法内核,以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵,图4.18创建了矩阵的宽度为3,不是tile宽度(2)的倍数。图4.…

AI红娘开启约会新时代;网易云音乐Agent实践探索;微软生成式AI课程要点笔记;ComfyUI新手教程;图解RAG进阶技术 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 👀 Perplexity 官宣 7360 万美元B轮融资,打造世界上最快最准确的答案平台 https://blog.perplexity.ai/blog/perplexity-rais…

用js做点击切换携程旅游

样式&#xff1a; <style>.domestic {width: 1200px;margin: 50px auto;}.domestic span {padding: 2px 10px;margin: 10px 10px;border-radius: 12px;cursor: pointer;float: left;border: 1px solid transparent;}.domestic > div span:hover {border-color: #f66;b…

Gartner发布2024年SASE融合战略路线图

向云计算和远程工作的转变增加了 SASE 需求&#xff0c;以实现从任何设备的安全访问。安全和风险管理领导者必须将网络和安全融合到一两个明确合作的 SASE 供应商产品中&#xff0c;并淘汰遗留的边界系统。 主要发现 安全访问服务边缘 (SASE) 框架为混合劳动力以及设备、分支机…

QML —— 示例 - Component自定义组件及加载(附完整源码)

示例效果 介绍 Component 组件是可重用的、封装的QML类型&#xff0c;具有定义良好的接口。组件通常由组件文件定义&#xff0c;即.qml文件。组件类型本质上允许在QML文档中内联定义QML组件&#xff0c;而不是作为单独的QML文件。这可能有助于重用QML文件中的小组件&#xff0c…

Spring MVC(day1)

什么是MVC MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为数据承载Bean&#xff1a;专门存储业务数据…

Vue-4、单向数据绑定与双向数据绑定

1、单向数据绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数据绑定</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…