python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
目录
文档操作
打开文档
获取文档信息
删除页
复制页
移动页
选择重构合并
保存关闭
页对象操作
内容读取
获取页对象的字体样式
插入文本标签
插入文本内容
字体设置
insert_text添加文本
insert_textbox添加文本
插入图片
获取页面注释、链接、表单字段
获取页面RGB图像数据并将页面保存为图片
获取页面的矢量图(转svg)
创建新页面
安装:pip install PyMuPDF -i https://pypi.mirrors.ustc.edu.cn/simple/
PyMuPDF库支持多种文档格式的内容读取,如PDF、XPS、CBZ等,支持将文档转换为其他格式,如HTML、SVG、PDF和CBZ等。
PyMuPDF可以修改pdf文件的内容。其他文件类型用PyMuPDF是只读的。但可以将任何文档(包括图像)转换为PDF(Document.convert_to_pdf()),然后将再使用PyMuPDF的功能进行操作。
参考文档:https://pymupdf.readthedocs.io/en/latest/page.html
文档操作
打开文档
open()没有参数时是打开新的文档,有参数时是加载指定文档
fitz和pymupdf 是同一个库,操作相同
import fitz # fitz就是PyMuPDF的别名
# import pymupdf # 同fitz# new_pdf = pymupdf.open()
# pdf_document = pymupdf.open(pdf_path) # 打开文档,获取文档对象new_pdf = fitz.open()
pdf_document = fitz.open(pdf_path) # 打开文档,获取文档对象
获取文档信息
print(pdf_document.metadata) # 获取文档信息print(pdf_document.get_toc()) # 获取目录大纲print(pdf_document.page_count) # 获取页数
文档信息如下:
{'format': 'PDF 1.7', 'title': '', 'author': '', 'subject': '', 'keywords': '7e1d6144af9e0ffb0HJ_0924E1RQy4S3U_uCQ-ernv_VMhNm', 'creator': 'Microsoft® Word 2021', 'producer': 'Microsoft® Word 2021; modified using iText® 5.5.13 ©2000-2018 iText Group NV (AGPL-version)', 'creationDate': "D:20240322202301+08'00'", 'modDate': "D:20240423092659+08'00'", 'trapped': '', 'encryption': None}
删除页
delete_page 删除指定页,一次只删除一页,参数为对应页的索引
pdf_document.delete_page(-1)
delete_pages 删除多页,传入参数如果为列表/元组/范围,可删除对应页,如果是两个整数则删除从第n页到第m页(关键字'from_page'/'to_page')
pdf_document.delete_pages((2,4,7))pdf_document.delete_pages(3,5)
复制页
pdf_document.copy_page(2) # copy_page(n,m)将第n+1页复制到第m+1页,m默认为-1(最后一页),复制PDF文档中的页面。这只会创建同一个页面对象的另一个引用pdf_document.fullcopy_page(2) # fullcopy_page(n,m)将第n+1页复制到第m+1页,m默认为-1(最后一页),复制一整页
移动页
pdf_document.move_page(0,2) # move_page(n,m)将第n+1页移动到第m+1页,m默认为-1(最后一页)
选择重构合并
在列表中建立带有页码的子pdf。参数为需要重新创建指定页的页码列表,页码必须是在范围内,会根据列表中的顺序选择整合文档,这里演示只合并奇数页。
pdf_document.select([i for i in range(0,pdf_document.page_count,2)])
保存关闭
def save(self,filename,garbage=0,clean=0,deflate=0,deflate_images=0,deflate_fonts=0,incremental=0,ascii=0,expand=0,linear=0,no_new_id=0,appearance=0,pretty=0,encryption=1,permissions=4095,owner_pw=None,user_pw=None,preserve_metadata=1,use_objstms=0,compression_effort=0,):
pdf_document.save(rf'{save_img_path}\{pdf_file_name}-副本{int(time())}.pdf')pdf_document.close()
页对象操作
内容读取
PyMuPDF支持将读取到的内容转为多种格式的数据,默认为text纯文本内容
"text":(默认)带换行符的纯文本(不包含格式、文字位置详细信息和图像)。
pdf_document = fitz.open(pdf_path) # 打开文档,获取文档对象for page_num in range(len(pdf_document)):page = pdf_document.load_page(page_num) # 获取页对象text = page.get_text() # 获取页面文本内容print(text)
"blocks":生成文本块(段落)的列表。
"words":生成不包含空格的字符串单词列表。
"html":创建包括任何图像的html数据。
def fitz_pdf(pdf_path):pdf_document = fitz.open(pdf_path) # 打开文档,获取文档对象for page_num in range(len(pdf_document)):page = pdf_document.load_page(page_num) # 获取页对象html = page.get_text("html") # 获取页面内容with open(f'test-{page_num}.html', 'w') as f:f.write(html)pdf_document.close()
"dict" 或 "json":
"rawdict"或 "rawjson":包含XML之类字符详细信息的"dict"及"json"的超级集合。
"xhtml":包含图像及文本信息级别的html数据。
"xml":不包含图像,只有每个文本字符的完整位置和字体信息。
获取页对象的字体样式
page = pdf_document.load_page(page_num) # 获取页对象print(page.get_fonts()) # 获取字体样式
[(14, 'ttf', 'TrueType', 'BCDEEE+Cambria', 'F1', 'WinAnsiEncoding'), (15, 'ttf', 'Type0', 'BCDFEE+MS-Gothic', 'F2', 'Identity-H'), (16, 'ttf', 'Type0', 'BCDGEE+MicrosoftYaHei', 'F3', 'Identity-H'), (17, 'n/a', 'TrueType', 'ArialMT', 'F4', 'WinAnsiEncoding'), (18, 'ttf', 'Type0', 'BCDHEE+SimHei', 'F5', 'Identity-H'), (19, 'ttf', 'Type0', 'BCDIEE+MicrosoftYaHei-Bold', 'F6', 'Identity-H'), (20, 'ttf', 'TrueType', 'BCDJEE+SimHei', 'F7', 'WinAnsiEncoding'), (21, 'ttf', 'TrueType', 'BCDKEE+MicrosoftYaHei', 'F8', 'WinAnsiEncoding'), (22, 'ttf', 'TrueType', 'BCDLEE+Cambria-Bold', 'F9', 'WinAnsiEncoding'), (23, 'n/a', 'TrueType', 'Arial-BoldMT', 'F10', 'WinAnsiEncoding'), (24, 'ttf', 'Type0', 'BCDMEE+Wingdings-Regular', 'F11', 'Identity-H'), (25, 'ttf', 'TrueType', 'BCDNEE+ArialUnicodeMS', 'F12', 'WinAnsiEncoding'), (26, 'ttf', 'Type0', 'BCDOEE+ArialUnicodeMS', 'F13', 'Identity-H'), (1, 'n/a', 'Type1', 'Helvetica', 'Xi0', 'WinAnsiEncoding')]
插入文本标签
page.add_text_annot((50, 150), f'文本便利贴测试,这是{page_num + 1}页')
插入文本内容
字体设置
如果写入内容时不指定字体时,中文内容会乱码。
内置字体:china-s 黑体 china-ss 宋体 china-t 繁体黑体 china-ts 繁体宋体。
自定义字体添加如下,很多网上分享者都用 fitz.Font() 添加,根本没有用。
page.insert_font(fontname="三极妙漫体",fontfile=r"C:\Users\DELL\AppData\Local\JianyingPro\三极妙漫体.ttf",fontbuffer=None, set_simple=False) # 自定义字体添加
insert_text添加文本
def insert_text(self,point: point_like,buffer_: typing.Union[str, list],fontsize: float = 11,lineheight: OptFloat = None,fontname: str = "helv",fontfile: OptStr = None,set_simple: bool = 0,encoding: int = 0,color: OptSeq = None,fill: OptSeq = None,render_mode: int = 0,border_width: float = 1,rotate: int = 0,morph: OptSeq = None,stroke_opacity: float = 1,fill_opacity: float = 1,oc: int = 0,) -> int:
page.insert_text((50, 50), "这是中文测试", fontsize=15, fontname='china-s')
insert_textbox添加文本
def insert_textbox(self,rect: rect_like,buffer: typing.Union[str, list],fontname: OptStr = "helv",fontfile: OptStr = None,fontsize: float = 11,lineheight: OptFloat = None,set_simple: bool = 0,encoding: int = 0,color: OptSeq = None,fill: OptSeq = None,expandtabs: int = 1,border_width: float = 0.05,align: int = 0,render_mode: int = 0,rotate: int = 0,morph: OptSeq = None,stroke_opacity: float = 1,fill_opacity: float = 1,oc: int = 0,) -> float:
text_rect = fitz.Rect(80, 80, 500, 100) # 定义文本框位置page.insert_textbox(text_rect, "测试文本框添加操作", fontsize=12,align=fitz.TEXT_ALIGN_LEFT, fontname='三极妙漫体',fill=(200 / 255, 250 / 255, 100 / 255), rotate=90, fill_opacity=.2)
插入图片
insert_image(rect, *, alpha=-1, filename=None, height=0, keep_proportion=True, mask=None, oc=0, overlay=True, pixmap=None, rotate=0, stream=None, width=0, xref=0)
img_rect = fitz.Rect((50, 50, 150, 100))page.insert_image(img_rect, filename=r'E:\桌面\99\测试图片\1.jpg') # 可设置位置和图片大小
获取页面注释、链接、表单字段
for ant in page.annots(): # 获取注释print(ant)for link in page.links(): # 获取链接print(link)for widget in page.widgets(): # 获取表单字段print(widget)
获取页面RGB图像数据并将页面保存为图片
get_pixmap(*, matrix=pymupdf.Identity, dpi=None, colorspace=pymupdf.csRGB, clip=None, alpha=False, annots=True)
获取页面RGB图像,参数包含分辨率、颜色空间(可生成灰度图像或具有减色方案的图像)、透明度、旋转、镜像、移位、剪切等。可设置宽度、高度等。
pix = page.get_pixmap()pix.save('test.png')
获取页面的矢量图(转svg)
svg_img = page.get_svg_image()with open('test.svg', 'w') as f:f.write(svg_img)
创建新页面
pdf_document.new_page()
相关文章:

python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
目录 文档操作 打开文档 获取文档信息 删除页 复制页 移动页 选择重构合并 保存关闭 页对象操作 内容读取 获取页对象的字体样式 插入文本标签 插入文本内容 字体设置 insert_text添加文本 insert_textbox添加文本 插入图片 获取页面注释、链接、表单字段 …...
vue3配置测试环境、开发环境、生产环境
第一步:在src同级新建 .env.production 、.env.test 、.env.development文件 第二步:在文件中配置开发环境、生产环境、测试环境 // 开发环境 .env.developmentNODE_ENV developmentVUE_APP_MODE development outputDir dist_dev // 打出包的名称VUE_…...

Jsonlizer,一个把C++各类数据转成 Json 结构体的玩意儿
这段时间突发奇想,觉得可以弄一个Json和C各种数据类型互转的工具,因为Json在进行数据储存的时候,有一些先天的优势,传统的C的序列化方式是将数据序列化到流数据里面,而流数据是典型的串行结构(或则说是一维…...
Qt仿音乐播放器:设置窗口、部件属性
// 设置窗口标志 this->setWindowFlag(Qt::FramelessWindowHint); //此设置将窗口设置成无边框模式//设置窗口背景透明 this->setAttribute(Qt::WA_TranslucentBackground,true); attribute:属性 Translucent:半透明 Qt::WA_TranslucentBackgro…...

使用 .NET 6 或 .NET 8 上传大文件
如果您正在使用 .NET 6,并且它拒绝上传大文件,那么本文适合您。 我分享了一些处理大文件时需要牢记的建议,以及如何根据我们的需求配置我们的服务,并提供无限制的服务。 本文与 https://blog.csdn.net/hefeng_aspnet/arti…...

基于特征工程(pca分析)、小波去噪以及数据增强,同时采用基于注意力机制的BiLSTM、随机森林、ARIMA模型进行序列数据预测
本文采用特征工程(pca分析)、小波去噪以及数据增强,同时采用基于注意力机制的BiLSTM、随机森林、ARIMA模型进行序列数据预测 基于BILSTM(双向长短期记忆网络)、随机森林回归和ARIMA(自回归积分滑动平均&am…...

攻防世界 PHP2
开启场景 访问 /index.php,页面无变化 访问 /index.phps index.php 和 index.phps 文件之间的主要区别在于它们的文件扩展名。 index.php:这是一个标准的 PHP 文件,通常用于编写 PHP 代码。当用户访问 index.php 文件时,Web 服务器…...
主板idyy
import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MachineCodeGenerator { // 获取主板ID(这需要根据操作系统具体实现) private static String getMotherboardID() {…...
轻松实现向量搜索:探索 Elastic-Embedding-Searcher 项目
随着人工智能和机器学习技术的飞速发展,向量搜索已成为数据检索的重要方式。尤其是在处理大规模文本数据时,传统的基于关键词的检索方式已经难以满足需求。为了优化检索性能并提升搜索精度,向量搜索成为了更加高效的解决方案。而在这一领域&a…...

flask后端开发(3):html模板渲染
目录 渲染模板html模板获取路由参数 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 渲染模板 这样就能够通过html文件来渲染前端,而不是通过return了 html模板获取路由参数...
逻辑控制语句
一、逻辑控制语句 条件判断 if循环 for、while 二、条件判断 if 1、语法 if 条件:条件为真的操作条件为真的操作 else:条件为假的操作条件为假的操作 data_01 int(input("数字: "))if data_01 > 10:print("ok!!!")print("正确!!!")prin…...
[OpenGL]使用 Compute Shader 实现矩阵点乘
一、简介 本文介绍了如何使用 OpenGL 中的 compute shader 进行矩阵相乘的并行运算。代码目标是,输入两个大小为 10*10 的矩阵 A 和 B,计算 A*B 的结果并存储到矩阵 C 中。 二、代码 0. 代码逻辑 1. 初始化 glfw, glad, 窗口 2. 初始化 compute shad…...

jangow-01-1.0.1靶机
靶机 ip:192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式,我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个,按回车。 继续选择第二个,这次按 e 进入编辑页面 接下来,…...

MySQL 查询大偏移量(LIMIT)问题分析
大偏移量查询缓慢?LIMIT: 会进行两步操作 性能消耗在哪里了?OFFSET操作问题 2 LIMIT 操作 如何优化? 大偏移量查询缓慢? 示例:(假设age字段有索引) SELECT * FROM test WHERE age>18 LIMIT 10000000 ,10;分析MySQL的 LIMIT 10000000 , 10 LIMIT: 会进行两步操作 OFF…...
Docker、containerd、安全沙箱、社区Kata Containers运行对比
大家看了解决有意义、有帮助记得点赞加关注!!! containerd、安全沙箱和Docker三种运行对比。 本文通过对比三种运行时的实现和使用限制、部署结构,帮助您根据需求场景了解并选择合适的容器运行。 一、容器运行时实现和使用限制…...

使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包
作者:刘大 前言 在使用iClient for MapboxGL/MapLibreGL项目开发中,往往会对接非EPSG:3857坐标系的地图,由于默认不支持,因此需引入mapboxgl-enhance/maplibre-gl-enhance扩展包。 在使用Vue等其他框架,通过npm包下载…...

【NIFI】实现ORACLE->ORACLE数据同步
【NIFI】实现ORACLE->ORACLE数据同步 需求 使用nifi实现 oracle->oracle 不同数据库之间的数据同步, 如果想实现 oracle->oracle技术有很多,例如使用oracle golden gate或者是kettle等,或者是使用oralce的dblink技术也能实现。当让…...
单例模式的写法
单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。常用于管理共享资源(如数据库连接、配置文件、线程池等)。在实际编码中,有多种实现单例模式的方法&…...
Selenium实践总结
1.使用显示等待而不是隐式等待 隐式等待可能会导致不可预测的测试行为,尤其是在动态 Web 应用程序中。显式等待,它允许您 等待特定条件发生后再继续测试,这种方法提供了更多的控制和可靠性。 WebDriverWait wait new WebDriverWait(drive…...

Python数据可视化小项目
英雄联盟S14世界赛选手数据可视化 由于本学期有一门数据可视化课程,课程结课作业要求完成一个数据可视化的小Demo,于是便有了这个小项目,课程老师要求比较简单,只要求熟练运用可视化工具展示数据,并不要求数据来源&am…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...