图像处理【免费下载链接】PyMuPDFPyMuPDF is a high performance Python library for data extraction, analysis, conversion manipulation of PDF (and other) documents.项目地址https://gitcode.com/gh_mirrors/py/PyMuPDF点击查看免费下载PyMuPDF 是 MuPDF 渲染引擎的高性能 Python 绑定库支持 PDF、XPS、OpenXPS、CBZ、CBR、FB2 与 EPUB 等多种文档格式的读取、数据提取、转换与操作。本篇教程基于本仓库 docs/tutorial.rst 整理扩充从导入绑定、打开文档、访问元数据、遍历页面、渲染页面、提取文本与图片、检索文本、HTML 转 PDFStory到 PDF 的增删改、合并拆分、嵌入数据与增量保存完整走通 PyMuPDF 的核心使用链路。读完本篇你将能够直接用几行 Python 代码完成 PDF 渲染为图片、批量提取文本、按需重组页面等典型实战任务并理解底层实现对应源码位于 src/init.py。一、导入绑定与版本检查PyMuPDF 的 Python 绑定通过一条 import 语句即可引入同时可以查看当前库的版本信息 import pymupdf print(pymupdf.__doc__) PyMuPDF 1.16.0: Python bindings for the MuPDF 1.16.0 library. Version date: 2019-07-28 07:30:14. Built for Python 3.7 on win32 (64-bit).关于旧名称 fitz 的说明早期版本的 PyMuPDF 在 Python 中的导入名是fitz新版改名为pymupdf同时保留fitz作为兼容回退保证旧代码仍能运行。这一命名的来历属于历史遗留MuPDF 最初的渲染库名为LibartArtifex 收购 MuPDF 后开发重点转向编写名为 Fitz 的新图形库——Fitz 最初是作为取代老旧的 Ghostscript 图形库的研发项目最终成为驱动 MuPDF 的渲染引擎。注意事项若本机同时安装了 PyPI 上已废弃的fitz同名包使用旧名称fitz导入可能失败详见 docs/faq/index.rst 中安装后问题一节。本仓库当前实现位于 src/init.py其顶部注释表明 PyMuPDF 构建在 MuPDF 的 Python 绑定之上。二、打开文档要访问受支持的文档支持类型见 docs/supported-files-table.rst只需一条语句doc pymupdf.open(filename) # 等价写法pymupdf.Document(filename)filename必须是 Python 字符串或pathlib.Path指向一个已存在的文件也支持从内存字节流打开文档或创建一个全新的空 PDFDocument对象还实现了上下文管理器协议。从 src/init.py 的源码可以看到Document.__init__即open的同义词支持多种调用形态open()创建新 PDFopen(filename)按扩展名识别格式open(type, buffer)从字节流打开open(streambuffer, filetypetype)为关键字写法扩展名无法识别时可用open(filename, filetypetype)显式指定类型。对可重排文档如 EPUB还支持传入rect、width、height、fontsize等布局参数。__enter__/__exit__的实现src/init.py证实了它可作为上下文管理器使用配合with语句可自动关闭文档。文档对象包含大量属性与方法其中既有元信息如作者、主题、总页数、目录outline也有加密信息。常用成员如下方法 / 属性说明Document.page_count页数intDocument.metadata元数据dictDocument.get_toc()获取目录listDocument.load_page(pno)读取一页返回Page三、访问元数据PyMuPDF 完整支持标准元数据。Document.metadata是一个 Python 字典对所有文档类型均可用但并非所有键都一定有值各字段为字符串或None键含义producer生产者生成文档的软件format格式如 PDF-1.4、EPUB 等encryption使用的加密方法若有author作者modDate最后修改日期keywords关键词title标题creationDate创建日期creator创建应用程序subject主题两点补充说明元数据流从 PDF 1.4 起PDF 文档可能包含以 XML 编码的元数据流。PyMuPDF 刻意不内置 XML 处理组件Xml 类 是辅助类用于访问 Story 对象的 DOM 内容因此不直接支持读取其中的信息。但你可以把整个流提取出来用lxml等第三方包检查或修改后再写回 PDF也可以直接删除这部分数据。实用脚本仓库的 PyMuPDF-Utilities 工具集中提供了元数据导入仅 PDF与元数据导出的 CSV 脚本便于批量管理。更多细节可参考 docs/document.rst。四、处理目录Outlines / 书签获取文档全部目录书签最简便的方式是加载其目录表toc doc.get_toc()返回值是形如[[lvl, title, page, ...], ...]的 Python 列表与纸质书的目录结构类似lvl目录项的层级从 1 开始title目录项标题page页码从 1 开始计数即 1-based其余参数描述书签目标的细节。从 src/init.py 的实现可见get_toc()通过递归遍历文档 outline 链生成列表simpleTrue时每项为[lvl, title, page]simpleFalse时还会附加完整的链接目标字典调用 src/utils.py 的getLinkDict并针对 PDF 调用_extend_toc_items扩展内部目录项。工具集中同样提供了目录导入仅 PDF与导出的 CSV 脚本。五、处理页面Page处理是 MuPDF 功能的核心。页面支持渲染为栅格raster或矢量SVG图像可选缩放、旋转、平移、错切等变换以多种格式提取页面文本与图片并支持文本字符串检索对 PDF 文档还有大量方法可向页面添加文本或图片。5.1 获取页面对象page doc.load_page(pno) # 加载第 pno 页0 起始 page doc[pno] # 简写形式pno可以是任意满足-∞ pno page_count的整数负数从末尾向前数因此doc[-1]是最后一页与 Python 序列语义一致。从 src/init.py 看Document.__getitem__支持整数、切片返回 Page 列表以及(chapter, pno)元组形式最终都落到load_page()。更高级的用法是把文档当作迭代器使用for page in doc: # 对 page 做点什么 # ... 或反向读取 for page in reversed(doc): # 对 page 做点什么 # ... 甚至使用切片 for page in doc.pages(start, stop, step): # 对 page 做点什么5.2 检查页面的链接、注释与表单域链接在查看器中显示为热区鼠标悬停呈手形时点击即可跳转到编码目标。获取页面全部链接links page.get_links()links是字典组成的 Python 列表详情见 docs/page.rst。也可以使用一次产生一个链接的迭代器for link in page.links(): # 对 link 做点什么若页面属于 PDF 文档还可能存在注释Annot见 docs/annot.rst或表单域Widget见 docs/widget.rst它们各有自己的迭代器for annot in page.annots(): # 对 annot 做点什么 for field in page.widgets(): # 对 field 做点什么对应的迭代器实现可在 src/init.pyannots、src/init.pylinks、src/init.pywidgets中找到三者均支持按类型过滤参数。5.3 渲染页面下面示例创建页面内容的栅格图像pix page.get_pixmap()pix是一个Pixmap对象此处包含页面的RGB图像可直接用于多种用途。Page.get_pixmap()提供了大量控制参数分辨率/DPI、色彩空间如生成灰度图或减色方案图像、透明度、旋转、镜像、平移、错切等。例如创建带 alpha 通道的RGBA图像pix page.get_pixmap(alphaTrue)从 src/init.py 和 src/init.py 的get_pixmap定义可以看出其底层通过JM_pixmap_from_pagesrc/init.py结合变换矩阵matrix、色彩空间、透明度与裁剪区域clip完成渲染。Pixmap包含若干方法属性其中整数width、height像素与stride一行水平图像数据的字节数值得关注属性samples是表示图像数据的矩形字节区Pythonbytes对象。提示还可以用Page.get_svg_image()生成页面的矢量图像详见工具集 Wiki 的 Vector Image Support 页面。5.4 将页面图像保存为文件直接保存为 PNGpix.save(fpage-{page.number}.png)5.5 在 GUI 中显示图像Pixmap.samples是全部像素的字节区Pythonbytes对象可接入各种 GUI 框架。以下给出主流 GUI 的接入示例。wxPythonRGB(A) 像素的细节请查阅 wxPython 文档if pix.alpha: bitmap wx.Bitmap.FromBufferRGBA(pix.width, pix.height, pix.samples) else: bitmap wx.Bitmap.FromBuffer(pix.width, pix.height, pix.samples)Tkinter借助 Pillow参考 Pillow 文档 3.19 节from PIL import Image, ImageTk # 根据是否含 alpha 设置模式 mode RGBA if pix.alpha else RGB img Image.frombytes(mode, [pix.width, pix.height], pix.samples) tkimg ImageTk.PhotoImage(img)以下写法完全不依赖 PillowPPM 格式不支持透明通道故先移除 alpha# 如有 alpha 则移除 pix1 pymupdf.Pixmap(pix, 0) if pix.alpha else pix # PPM 不支持透明度 imgdata pix1.tobytes(ppm) # 速度极快 tkimg tkinter.PhotoImage(dataimgdata)若需要一个可翻页浏览任意受支持文档的完整 Tkinter 脚本支持缩放兼容 Python 2/3依赖纯 Python 的 PySimpleGUI 包工具集的browse-document/browse.py即为现成示例。PyQt4 / PyQt5 / PySide借助 Pillow参考 Pillow 文档 3.16 节from PIL import Image, ImageQt # 根据是否含 alpha 设置模式 mode RGBA if pix.alpha else RGB img Image.frombytes(mode, [pix.width, pix.height], pix.samples) qtimg ImageQt.ImageQt(img)同样可以不用 PillowQt 的QImage支持原生 Python 指针以下为推荐的 Qt 图像创建方式from PyQt5.QtGui import QImage # 根据是否含 alpha 选择正确的 QImage 格式 fmt QImage.Format_RGBA8888 if pix.alpha else QImage.Format_RGB888 qtimg QImage(pix.samples_ptr, pix.width, pix.height, fmt)注意这里使用了pix.samples_ptr内存指针因此完全不产生像素数据的 Python 拷贝。5.6 提取文本与图片页面上的文本、图片及其他信息可以按多种格式、多种粒度提取text page.get_text(opt)opt取下列字符串之一即得到不同格式text默认带换行的纯文本无格式、无位置信息、无图片blocks生成文本块段落列表words生成单词列表不含空格的字符串html生成包含图片在内的页面完整可视化版本可直接用浏览器打开dict/json信息层级与 HTML 相同但以 Python 字典 / JSON 字符串提供结构细节见 docs/textpage.rst 中TextPage.extractDICTrawdict/rawjsondict/json的超集额外提供类似 XML 的逐字符细节信息见TextPage.extractRAWDICTxhtml文本信息层级与 TEXT 版本相同但包含图片也可用浏览器显示xml不含图片但包含直至每个字符的完整位置与字体信息需用 XML 模块解析。说明Page.get_text是另一 PyMuPDF 类TextPage若干方法的便捷封装——Page.get_text(dict)等价于TextPage.extractDICT()。这些方法的实现位于 src/init.pyPage.get_text与 src/utils.py工具函数get_text。各格式的样例输出可参考文档附录。5.7 搜索文本可以精确定位文本串在页面上的出现位置areas page.search_for(mupdf)返回一个矩形Rect见 docs/rect.rst列表每个矩形框住字符串 mupdf 的一次出现大小写不敏感。可据此高亮这些区域仅 PDF或生成文档交叉引用。search_for的实现位于 src/init.py。当有性能考量、需要更直接的控制时可深入研究 docs/coop_low.rst 章节以及TextPage、Device、DisplayList三个类见 docs/textpage.rst、docs/device.rst、docs/displaylist.rst的低层用法。六、Story从 HTML 生成 PDFStory类是 PyMuPDF 1.21.0 起新增的特性对应 MuPDF 的story接口。设计理念Story 提供了一种轻松布局带样式内容的方式供 DocumentWriter 等设备使用。故事story的概念来自桌面出版进而源自报纸排版——传统报纸版面由多篇新闻文章故事排布到多栏、甚至跨页。相应地MuPDF 用 story 表示带样式信息的文本流使用者向 story 提供一系列矩形story 将内容排布进去定位好的文本再绘制到输出设备。这使文本本身story与文本流入的区域layout相互分离。一个直观类比Story 的工作方式类似互联网浏览器——忠实解析并渲染 HTML 超文本与可选的样式表CSS但它的输出是 PDF而非网页。创建Story时输入来自最多三个信息源均可选HTML 源码可以是 Python 字符串也可以由脚本借助Xml类的方法动态创建CSS 源码以 Python 字符串提供用于给出样式信息字号、颜色等类似网页该字符串自然也可以从文件读取Archive只要 DOM 引用了图片或使用了除标准 Base-14 字体、CJK 字体以及内置进 PyMuPDF 二进制的 NOTO 字体之外的文本字体就必须提供 Archive见 docs/archive-class.rst。XmlAPI见 docs/xml-class.rst支持完全从零创建 DOM含所需样式信息也可修改或扩展已有 HTML删除/替换文本、改变样式、把数据库提取的文本填入模板式 HTML 文档。不要求提供语法完整的 HTML 文档像bHello iWorld!/i/b这样的片段完全可接受多数语法错误会被自动纠正。HTML 完备后即可用于生成 PDF通过DocumentWriter类见 docs/document-writer-class.rst实现于 src/init.py编程者调用其方法创建新空白页并把矩形交给 Story 填充。Story 会返回完成码指示是否还有内容待写入内容落入哪个矩形、哪一页由 Story 自动决定——除了提供矩形之外无法干预。典型用例可参考 docs/recipes-stories.rst。七、PDF 维护PDF 是唯一可用 PyMuPDF修改的文档类型其他格式只读。不过你可以先把任何文档含图片转换为 PDF再对转换结果应用全部 PyMuPDF 特性详见Document.convert_to_pdf()工具集提供convert-document/convert.py演示脚本。Document.save()总是把文档的当前可能已修改状态保存到磁盘既可以存为新文件也可以增量保存——把改动直接追加到原文件通常快得多。以下介绍操纵 PDF 的方式远非全部更多内容见后续各章。7.1 修改、创建、重排与删除页面PDF 的页面树描述全部页面的结构可通过多种方式操纵Document.delete_page/Document.delete_pages删除页面Document.copy_page/Document.fullcopy_page/Document.move_page在同一文档内复制或移动页面Document.select把 PDF 缩减为所选页面。参数是一个序列sequence见脚注元素为要保留的页码均须满足0 i page_count执行后列表中缺失的页面全部被删除保留的页面按指定顺序、指定次数出现。于是可以轻松创建新 PDF例如取前 10 页或后 10 页只取奇数页或只取偶数页用于双面打印取包含 / 不包含某文本的页面反转页面顺序……凡所能想。保存的新文档中仍然有效的链接、注释与书签会保留即要么指向被选中的页面要么指向某个外部资源。此外Document.insert_page与Document.new_page用于插入新页面页面本身还可被众多方法修改如页面旋转、注释与链接维护、文本与图片插入。7.2 合并与拆分 PDFDocument.insert_pdf在不同 PDF 文档之间复制页面。简单的合并示例doc1、doc2均为已打开的 PDF# 把完整的 doc2 追加到 doc1 末尾 doc1.insert_pdf(doc2)拆分doc1的示例——新建一个仅含其前 10 页与后 10 页的文档doc2 pymupdf.open() # 新建空 PDF doc2.insert_pdf(doc1, to_page9) # 前 10 页 doc2.insert_pdf(doc1, from_pagelen(doc1) - 10) # 后 10 页 doc2.save(first-and-last-10.pdf)更多用法见 docs/document.rst工具集还有现成的join-documents/join.py示例。7.3 嵌入数据PDF 可以像 ZIP 归档一样作为任意数据的容器可执行文件、其他 PDF、文本或二进制文件等。PyMuPDF 通过Document的embfile_*方法与属性完整支持该特性详见文档附录及工具集示例脚本embedded-copy.py、embedded-export.py、embedded-import.py、embedded-list.py。相关实现位于 src/init.py 的Document类中。7.4 保存如前所述Document.save总是保存文档当前状态。通过incrementalTrue可以把改动写回原 PDF——这一过程通常极快因为改动被追加到原文件而无需完整重写。Document.save的选项与 MuPDF 命令行工具mutool clean的选项一一对应Save 选项mutool效果garbage1g垃圾回收未使用的对象garbage2gg在 1 的基础上压缩 xref 表garbage3ggg在 2 的基础上合并重复对象garbage4gggg在 3 的基础上合并重复的流内容cleanTruecs清理并净化内容流deflateTruez压缩未压缩的流deflate_imagesTruei压缩图像流deflate_fontsTruef压缩字体文件流asciiTruea将二进制数据转为 ASCII 格式linearTruel生成线性化linearized版本expandTrued解压所有流例如mutool clean -ggggz file.pdf可获得极佳的压缩效果它对应doc.save(filename, garbage4, deflateTrue)object、stream、xref等术语的解释见 docs/glossary.rst。在 src/init.py 的save定义中可以看到完整的参数列表除上表外还有no_new_id、appearance、pretty、encryption、permissions、owner_pw、user_pw、preserve_metadata、use_objstms等选项分别对应加密、权限、元数据保留与对象流等高级控制。八、关闭文档程序继续运行的同时常常需要关闭文档以把底层文件控制权交还操作系统。调用Document.close()即可除了关闭底层文件还会释放与文档关联的缓冲区。在 src/init.py 中__exit__直接调用self.close()因此with pymupdf.open(...) as doc:的写法会在离开代码块时自动关闭文档。九、延伸阅读docs/faq/index.rst常见问题与各类 How-To 风格的 Recipes 章节紧密相关docs/recipes.rst按主题组织的实战配方覆盖 15 个主题各核心类与主题章节docs/document.rst、docs/page.rst、docs/pixmap.rst、docs/textpage.rst、docs/annot.rst、docs/widget.rst、docs/colorspace.rst完整参考docs/classes.rst、docs/functions.rst、docs/tools.rst测试用例可作为最佳实践参考例如 tests/test_textextract.py、tests/test_pixmap.py、tests/test_toc.py、tests/test_pagedelete.py、tests/test_story.py。脚注PyMuPDF 还允许像打开普通文档一样打开多种图片文件类型见 docs/pixmap.rst 中图片文件一节。序列指符合 Python 序列协议的对象的统称即实现了__getitem__()方法的对象典型如 tuple 与 listarray.array、numpy.array以及 PyMuPDF 的几何对象docs/algebra.rst也都是序列详见序列类型章节。赞分享图像处理【免费下载链接】PyMuPDFPyMuPDF is a high performance Python library for data extraction, analysis, conversion manipulation of PDF (and other) documents.项目地址https://gitcode.com/gh_mirrors/py/PyMuPDF点击查看免费下载相关推荐基于 MuPDF.js 的 PDF 处理入门加载、创建、批注、文本提取与渲染成图基于 MuPDF.js 的 PDF 处理入门加载、创建、批注、文本提取与渲染成图 MuPDF 是 Artifex 出品的轻量级 PDF 与文档渲染引擎在 S桌面应用文档TDengine 建流语法全解CREATE STREAM 触发方式、窗口机制、控制选项与通知体系TDengine 建流语法全解CREATE STREAM 触发方式、窗口机制、控制选项与通知体系 本文系统讲解 TDengine 流式计算的建流语法CREA图像处理adk-python 并行函数调用实战从 parallel_functions 示例到 ADK 批量工具执行器的原理剖析adk python 并行函数调用实战从 parallel_functions 示例到 ADK 批量工具执行器的原理剖析 本篇指南围绕 adk python图像处理上一篇如何训练自己的无审查模型基于mlabonne数据集的Abliteration完整指南下一篇【免费下载】 探索高效精准的运动控制plcopen_motion_control 最新版创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
