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()

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

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

相关文章

开源诊断工具Arthas

说明: 1、需要先要安装配置好jdk。 2、你的虚拟机得有网,没有网就按照压缩包上传解压。然后直接看三 一、官网 https://arthas.aliyun.com/doc/quick-start.html#_1-%E5%90%AF%E5%8A%A8-math-game 二、下载和卸载 # 下载 curl -O https://arthas.al…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统,使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个(通常是可交互的)并将其指向我们要监视其交互状态的可交互对象开始。…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上,欢迎参考使用,Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明:对手动拍照的问卷图片进行统计分数(对应分数…

yarn list --pattern vuex-module-decorators

dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的,这段代码是一个典型的 Vuex 模块定义,使用了 vuex-module-decorators 库。这个库为 Vuex 提…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **打印结果** 完整代码 以下游戏规则: 那么我们要实现的功能,就是…

day19-Linux软件包

科普,什么是代码文件。 电脑程序Program,就是某一个编程语言编写的一个代码文件,里面包含了该语言特有的指令,以及各种字符、符号。 linux自带的network管理脚本,shell脚本 什么是软件程序。 软件程序,就…

图像处理-Ch4-频率域处理

Ch4 频率域处理(Image Enhancement in Frequency Domain) FT :将信号表示成各种频率的正弦信号的线性组合。 频谱: ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…

Vue BPMN Modeler流程图

1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

5、栈应用-表达式求值

本章内容使用上述栈结构函数&#xff0c;来完成表达式求值操作。 表达式例如&#xff1a;3*(7-2) 或者 (0-12)*((5-3)*32)/(22) 。 1、实现思路 a、建立OPTR&#xff08;运算符&#xff09;和OPND&#xff08;数字&#xff09;两个栈&#xff0c;后输入字符串以结束 b、自左向…

【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode

文章目录 有效的数独解数独单词搜索黄金矿工不同的路径||| 有效的数独 递归解法思路 将每个数独的格子视为一个任务&#xff0c;依次检查每个格子是否合法。 如果当前格子中的数字违反了数独规则&#xff08;在行、列或 33 小方块中重复&#xff09;&#xff0c;直接返回 Fals…

Llama 3 预训练(二)

目录 3. 预训练 3.1 预训练数据 3.1.1 网络数据筛选 PII 和安全过滤 文本提取与清理 去重&#xff08;De-duplication&#xff09; 启发式过滤&#xff08;Heuristic Filtering&#xff09; 基于模型的质量过滤 代码和数学推理数据处理 多语言数据处理 3.1.2 确定数…

双指针——查找总价格为目标值的两个商品

一.题目描述 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 这个题目非常简单&#xff0c;其实就是判断有没有两个数加起来等于target。 三.算法解析 1.暴力解法 暴力解法的话我们可以枚举出所有的情况&#xff0c;然后判…

sqlserver镜像设置

本案例是双机热备&#xff0c;只设置主体服务器&#xff08;主&#xff09;和镜像服务器&#xff08;从&#xff09;&#xff0c;不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC &#xff08;1&#xff09;打开SQL Server配置管理器…

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语&#xff1a; 添加到倒排索引中&#xff0c;以便文档可搜索。级查询&#xff08;如 生成搜索词的 match查询&#xff09;使用。 分析器分为内置分析器和自定义的分析器&#xff0c;它们都是由若干个字符过滤器&#xff08;chara…

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…

低代码开发平台排名2024

低代码开发平台在过去几年中迅速崛起&#xff0c;成为企业数字化转型的重要工具。这些平台通过可视化界面和拖放组件&#xff0c;使业务人员和技术人员都能快速构建应用程序&#xff0c;大大缩短了开发周期。以下是一些在2024年值得关注和使用的低代码开发平台。 一、Zoho Cre…

计算机网络——期末复习(4)协议或技术汇总、思维导图

思维导图 协议与技术 物理层通信协议&#xff1a;曼彻斯特编码链路层通信协议&#xff1a;CSMA/CD &#xff08;1&#xff09;停止-等待协议&#xff08;属于自动请求重传ARQ协议&#xff09;&#xff1a;确认、否认、重传、超时重传、 &#xff08;2&#xff09;回退N帧协…