python+PyMuPDF库:(一)创建pdf文件及内容读取和写入

news2024/12/31 22:32:45

目录

文档操作 

打开文档

获取文档信息

删除页

复制页

移动页

选择重构合并

保存关闭

页对象操作

内容读取

获取页对象的字体样式

插入文本标签

插入文本内容

字体设置

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.coloradmin.cn/o/2267519.html

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

相关文章

Datawhale AI冬令营 动手学AI Agent

背景——什么是Agent 在人工智能领域,agent可以指一个能够感知环境并作出决策以实现特定目标的系统。比如,一个聊天机器人(chatbot)就是一个agent,它能够理解用户的输入并给出相应的回复。 学习目标 学会使用百宝箱…

高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用

面向信号处理的特征保持平滑技术 在数据分析领域,信号处理中的噪声问题始终是一个重要议题。无论是实验数据、金融时间序列还是其他形式的信号处理,噪声都会干扰目标模式和趋势的识别。尽管存在多种降噪方法,但在处理短时信号时,…

九点标定+旋转标定

眼在手外方式 1.夹取make点位置要求 机械手夹具夹持一个款标定板或者物料露出make点让视觉定位抓取 高度:与产品识别高度一致 左右位置:在相机视野内可以拍到make点 2.机械手走9个点移动位置要求(九点标定) 保证make在视野内…

RealityCapture导入视频序列失败

问题原因:如果导入的视频文件存在多余的元数据,那么在这里会发生导入失败。 以本人华为手机拍摄的一段.mp4视频为例: 利用ffmpeg在窗口命令行中检查你的视频—— ffmpeg -i your_video_name.mp4your_video_name是你的视频文件名 如下图所示&…

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…

正则表达式(三剑客之awk)

1.awk工具的使用 1.1 截取文档中的某个段 1)打印以 : 为分隔的第一个字段 [rootlocalhost ~]# head -n3 /etc/passwd | awk -F : {print $1} 2)注意事项 -F:作用是指定分隔符。如果不加分隔符,则以空格或者tab为分隔符 print&…

【基于rust-wasm的前端页面转pdf组件和示例】

基于rust-wasm前端页面转pdf组件和示例 朔源多余的废话花哨的吹牛那点东西要不要拿来试试事到如今 做个美梦 我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服. 如同我至今看不出塞班和iOS的不同下载地址:在github的备份 朔源…

图扑可视化赋能挖掘机高效操控

数字孪生挖掘机通过图扑可视化实时数据呈现和精准环境模拟,提升操作精度与施工效率,助力施工项目可视化管理,优化资源配置,为工程机械行业带来了新的智能化革新。

【多维DP】力扣3366. 最小数组和

给你一个整数数组 nums 和三个整数 k、op1 和 op2。 你可以对 nums 执行以下操作: 操作 1:选择一个下标 i,将 nums[i] 除以 2,并 向上取整 到最接近的整数。你最多可以执行此操作 op1 次,并且每个下标最多只能执行一…

支付域——“奖、惩、贴“特殊清算

摘要 在现代的服务平台经济中,比如网约车、外卖服务等,奖惩机制是用来管理服务提供者行为和确保服务品质的一种重要工具。所谓的“奖惩贴”就是这种机制中的一种具体形式,它包括了给予服务提供者的奖金、罚款和补贴。这些措施能够激励平台商…

网易企业邮箱登陆:保障数据安全

网易企业邮箱是一款为企业提供安全可靠的电子邮件服务的工具。通过网易企业邮箱,企业可以实现员工之间的高效沟通和信息共享,同时保障数据的安全性。 企业邮箱的安全性是企业信息保护的重要组成部分。网易企业邮箱采用了多层加密技术,确保邮件…

java常用类(下)

笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:javase 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一、Math 类 1.1基本介…

计算机的错误计算(一百九十四)

摘要 用两个大模型计算 其中,一个大模型通过化简,得出正确结果 0;而另外一个在化简过程中出现错误,得出了错误结果。 例1. 计算 下面是一个大模型的推导化简过程。 以上为一个大模型的回答。 下面是另外一个大模型的回复。 点评…

电脑缺失sxs.dll文件要怎么解决?

一、文件丢失问题:以sxs.dll文件缺失为例 当你在运行某个程序时,如果系统提示“找不到sxs.dll文件”,这意味着你的系统中缺少了一个名为sxs.dll的动态链接库文件。sxs.dll文件通常与Microsoft的.NET Framework相关,是许多应用程序…

初始c语言第一个c语言项目

第一个c语言项目 //c语言中一定要有main函数 //主函数//printf是一个库函数 //专门用来打印数据//std 标准 //i-input //o-output // #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//c语言规定main函数是程序的入口 //标准的主函数的写法 int main() {printf(&qu…

进军AI大模型-环境配置

语言环境配置 合法上网工具&#xff1a; 这个T子试试&#xff0c;一直稳定。走我链接免费用5天: https://wibnm.com/s/ywtc01/pvijpzy python版本&#xff1a; python3.12 Langchain: Introduction | &#x1f99c;️&#x1f517; LangChain v0.3 9月16日升级的版本 pip3…

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…

python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形

【1】引言 前序学习进程中&#xff0c;已经掌握了使用pythonopencv绘制线段、矩形和圆形的基本操作&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十八&#xff09;使用cv2.line创造线段-CSDN博客 python学opencv|读取图像&#xff08;…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…