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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字后端设计实现之自动化useful skew技术(Concurrent Clock Data)

在数字IC后端设计实现过程中,我们一直强调做时钟树综合要把clock skew做到最小。原因是clock skew的存在对整体设计的timing是不利的。 但是具体到某些timing path,可能它的local clock skew对timing是有帮助的,比如如下图所示。 第一级FF到第…

C++面试宝典第16题:盛最多水的容器

题目 给定n个非负整数a1、a2、…、an,每个数代表坐标中的一个点(i, ai)。画n条垂直线,使得第i条垂直线的两个端点分别为(i, ai)和(i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:不能倾斜容器,且n的取值至少为2。 在下图中,垂直线代表的输…

C++——冒泡排序

作用:最常用的排序算法,对数组内元素进行排序 1,比较相邻的元素,如果第一个比第二个大,就交换他们两个。 2,对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。 3&…

RHCE9学习指南 第16章 访问NFS存储及自动挂载

16.1 访问NFS存储 前面介绍了使用本地存储,本章介绍使用网络上的存储设备。NFS全称是网络文件系统,所实现的是Linux和Linux之间的共享。 下面的练习我们将会在server上创建一个文件夹/share,然后通过NFS把它共享,然后在server2上…

LUT预设.cube格式PR/达芬奇/FCP/剪映等视频电影调色预设LUTs

对于将标准镜头转换为让人想起高端电影的视觉冲击场景至关重要。这些LUT经过专业设计,以模仿电影行业中的电影质量、深度和情感,使其成为电影制作人、摄像师和内容创作者的理想选择,希望为你的作品带来专业的电影色彩。 电影LUT的类别&#…

鸿蒙系统应用开发之开发准备

今天我们来聊一聊鸿蒙系统应用开发之前,要做什么准备工作,如下图所示,我们要做的就是安装DevEco Studio,然后配置开发环境。 老规矩,拍拍手👏,上菜。 安装DevEco Studio 首先我们打开链接HUAWEI…

学习笔记 | Activiti7

什么是工作流? 业务流程。 举个例子: 假设有一个在线博客平台,我们要让一篇新的文章从作者的头脑里发表出来。整个过程可以分为以下几个步骤: 创建文章草稿 :作者登录博客平台,点击“写新文章”的按钮&#xff0c…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpResponse的定义和初始化 以及组织 HttpResponse 响应消息

一、HttpResponse的定义 1.定义状态码枚举 // 定义状态码枚举 enum HttpStatusCode {Unknown 0,OK 200,MovedPermanently 301,MovedTemporarily 302,BadRequest 400,NotFound 404 }; 2.HTTP 响应报文格式 这个数据块主要是分为四部分 第一部分是状态行第二部分是响应…

docker swarm 常用命令简介以及使用案例

docker swarm Docker Swarm 是Docker官⽅的跨节点的容器编排⼯具。⽤户只需要在单⼀的管理节点上操作,即可管理集群下的所有节点和容器 解决的问题 解决docker server的集群化管理和部署Swarm通过对Docker宿主机上添加的标签信息来将宿主机资源进⾏细粒度分区&am…

vue-cli项目优化gzip实践

背景:某天测试小妹气冲冲跑过来说你的网站首次打开平均16秒,慢得不行啊,空白时间太久,这样客户是不收货的,必须优化。谁叫我们是以测试驱动开发的,测试妹子的话等同与老板的命令。 空白是吧,我…

[Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目

前面讲解了通过命令行方式来部署k8s项目,下面来讲讲通过腾讯云TKE来快速创建Pod、Deployment、Service部署k8s项目,云平台搭建Kubernetes可参考[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群 一.通过腾讯云TKE创建集群 1.创建集群 参考上…

群辉安装gitea

群辉安装gitea 安装giteagitea容器配置 安装gitea gitea容器配置

【Internal Server Error】pycharm解决关闭flask端口依然占用问题

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 起因: 我们在运行flask后,断开服务依然保持运行&#xff0…

Meta的Fairy:快速并行化指令引导的视频到视频合成

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

vue3 封装一个Tooltip 文字提示组件

效果图 默认展示icon图标&#xff0c;悬浮展示文字 如果slot有内容则展示对应内容 实现 用的是El-Tooltip组件 Element - The worlds most popular Vue UI framework 组件代码 <script setup lang"ts"> import { Icon } from /components/Icon import { ElTo…

python统计分析——直方图(sns.histplot)

使用seanborn.histplot()函数绘制直方图 from matplotlib.pyplot as plt import seaborn as snsdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) &#xff08;1&#xff09;dataNone, 表示数据源。 &#xff08;2&#xff09;xNone, 表示直方图的分布垂直与x轴…

Java开发+Intellij-idea+Maven+工程构建

Java开发Intellij-ideaMaven工程构建 Intellij-idea是一款流行的Java集成开发环境&#xff0c;它支持Maven作为项目管理和构建工具。Maven可以帮助开发者自动下载项目依赖的jar包&#xff0c;执行编译、测试、打包等生命周期任务。本资源将介绍如何在Intellij-idea中创建、导入…

web提示框属性的运用

效果展示&#xff1a; 注意事项&#xff1a; 引用JQuery文件地址和图片地址要更换一下。提示框属性的宽应该和图片的宽保持一致。 html/css/javascript页面代码&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <tit…

【Python学习】Python学习8-Number

目录 【Python学习】Python学习8-Number 前言在变量赋值时被创建Python支持四种不同的数据类型整型(Int)长整型(long integers&#xff09;浮点型(loating point real values)复数(complex numbers) Python Number 类型转换Python math 模块、cmath 模块Python数学函数Python随…

【现代密码学】笔记2 -- 完善保密性《introduction to modern cryphtography》现代密码学原理与协议

【现代密码学】笔记2--完善保密性《introduction to modern cryphtography》 写在最前面2 完善保密性的介绍2.1 定义和基本属性加密方案的组成密钥产生算法 (Gen)加密算法 (Enc)解密算法 (Dec)概率分布独立性 完美保密加密3. 回顾加密词法4. 完美保密&#xff08;**Perfect Sec…