「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.mzph.cn/news/607535.shtml

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

相关文章

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

基于Java SSM框架实现班级同学录管理系统项目【项目源码】

基于java的SSM框架实现高校校园点餐系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写,受到很多的追捧,“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架,通常更简单的数据源。Spring…

洁净室气流流型可视化验证试验 气流流型检测仪

了解和掌握洁净室气流流型的特点和规律是确保洁净室的性能和产品质量的重要基础。在选择气流流型时需要综合考虑各种因素,以达到最佳的空气净化效果。同时,需要定期进行气流流型的检测和验证,以及洁净室的清洁和维护工作,以确保其…

php 常量与变量

目录 1.php 基础语法 2.常量 3.变量 4.变量命名规则 5.单引号双引号的区别 1.php 基础语法 <?php header("Content-Type: text/html; charsetutf-8"); //utf-8编码&#xff0c;支持中文 //代码处 ?> 如果没配utf-8 ,中文就会乱码&#xff0c;如下 2.常量…

自动驾驶轨迹预测

目录 神经网络轨迹预测综述&#xff1a; 比较新的轨迹预测网络 Uber&#xff1a;LaneRCNN[5] Google&#xff1a;VectorNet[6] Huawei&#xff1a;HOME[7] Waymo&#xff1a;TNT[8] Aptive&#xff1a;Covernet[9] NEC&#xff1a;R2P2[10] 商汤&#xff1a;TPNet[11]…

浅谈安科瑞直流表在孟加拉某能源公司的应用

摘要&#xff1a;本文介绍了安科瑞直流电表在孟加拉某能源公司的应用。主要用于光伏直流柜内&#xff0c;配合分流器对汇流箱的输出电流电压等进行测量&#xff0c;并采集配电现场的开关信号&#xff0c;装置带有RS485接口可以把测量和采集的数据和设备状态上传。 Abstract: T…

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 两组由4块磁盘组建的raid5磁盘阵列&#xff0c;两组raid5阵列划分为lun并组成了lvm结构&#xff0c;ext3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线&#xff0c;热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…

精进单元测试技能——Pytest断言的艺术

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中&#xff0c;断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等&#xff0c;例如&#xf…

Python从入门到网络爬虫(读写Excel详解)

前言 Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。最常用的Excel处理库有xlrd、xlwt、xlutils、xlwings、openpyxl、pandas&#xff0c;下面是各个模块的支持情况&#xff1a; 工具名称.xls.xlsx获取文件内容写入…

java常用应用程序编程接口(API)——String概述及使用案例

前言&#xff1a; 开始学到api的String&#xff0c;整理下心得。打好基础&#xff0c;daydayup! API&#xff1a; API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;又名应用程序编程接口。是别人编好的程序的合集。 为什么要使用API&…

5分钟搭建开源运维监控工具Uptime Kuma并实现无公网IP远程访问

文章目录 **主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址访问…

数组中元素的插入和查找算法探究

数组的查找 线性查找 概念 线性查找也叫顺序查找&#xff0c;这是最基本的一种查找方法&#xff0c;从给定的值中进行搜索&#xff0c;从一端开始逐一检查每个元素&#xff0c;直到找到所需元素的过程。 元素序列的排列可以有序&#xff0c;也可以无序。 代码实现 public cl…

JVM,Java堆区、新生代、老年代,创建对象的内存分配,分代垃圾收集思想、堆区产生的错误

JVM堆区 堆&#xff08;Heap&#xff09;堆区的组成&#xff1a;新生代老年代堆空间的大小设置创建对象的内存分配堆区的分代垃圾收集思想堆区产生的错误 堆&#xff08;Heap&#xff09; ​ Heap堆区&#xff0c;用于存放对象实例和数组的内存区域 ​ Heap堆区&#xff0c;是…

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时&#xff0c;常常会复用Vue组件&#xff0c;那么&#xff0c;问题来了&#xff0c;复用的时候&#xff0c;业务数据不相同&#xff0c;怎么办了&#xff1f; 这里我们就需要学习新的属性&#xff1a;props来实现这个功能。 这样&#xff0c;组…

探寻未来卫生新境界:互联网公厕是什么意思

近年来&#xff0c;科技的飞速发展深刻改变了我们生活的方方面面&#xff0c;而公共卫生领域也在这场变革中迎来了一场前所未有的革命。在这个新时代&#xff0c;一个备受瞩目的概念逐渐崭露头角——那就是“互联网公厕”。这究竟意味着什么&#xff1f;是一场卫生革新的崛起&a…

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用&#xff0c;试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具&#xff0c;它的轻量风格个人觉得还是不错的&#xff0c;但是它…

【漏洞复现】Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895

漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版…

vulhub中的Apache SSI 远程命令执行漏洞

Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了&#xff0c;注意这里需要加入/upload.php 5.写入一句话木马 &…

微信预约小程序制作指南:从小白到专家

在当今的数字时代&#xff0c;微信小程序已经成为了一种非常流行的应用方式。预约功能更是成为了许多小程序的核心功能之一。如果你也想为你的小程序添加预约功能&#xff0c;以下步骤将会对你有所帮助。 一、进入乔拓云网后台 乔拓云网是一个在线小程序开发平台&#xff0c;你…

如何使用Docker部署开源CMF Drupal并结合cpolar内网穿透远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…