Python中的MuPDF的使用
因为MuPDF不仅支持 PDF,还支持 XPS、OpenXPS、CBZ、CBR、FB2 和 EPUB 格式,因此 PyMuPDF 也支持。尽管如此,为了简洁起见,我们将只讨论 PDF 文件。在确实只支持 PDF 文件的地方,将明确提及这一点。
查看mupdf版本
该库的顶级 Python 导入名称是“fitz”。这是有历史原因的:
MuPDF 的原始渲染库称为Libart。
“在 Artifex Software 收购 MuPDF 项目后,开发重点转移到编写一个名为“Fitz”的新现代图形库上。Fitz 最初是作为一个研发项目来取代老化的 Ghostscript 图形库,但现在却成为了支持 MuPDF 的渲染引擎。”
打开文档
方法/属性 描述
Document.page_count
页数 ( int )
Document.metadata
元数据(字典)
Document.get_toc()
获取目录(列表)
Document.load_page()
阅读一页
访问元数据
PyMuPDF 完全支持标准元数据,Document.metadata
是具有以下键的 Python 字典。它适用于所有文档类型,但并非所有条目都可能始终包含数据。
Key Value
producer producer (producing software)
format format: ‘PDF-1.4’, ‘EPUB’, etc.
encryption encryption method used if any
author author
modDate date of last modification
keywords keywords
title title
creationDate date of creation
creator creating application
subject subject
使用大纲
获取文档所有大纲(也称为“书签”)的最简单方法是加载其目录:
这将返回一个列表[[lvl, title, page, …], …]的 Python 列表,它看起来很像书籍中的常规目录。
lvl是条目的层级(从 1 开始),title是条目的标题,page 是页码(从 1 开始!)。其他参数描述书签目标的详细信息。
使用页面
页面处理是 MuPDF 功能的核心。
您可以将页面呈现为光栅或矢量 (SVG) 图像,可选择对其进行缩放、旋转、移动或剪切。
您可以提取多种格式的页面文本和图像并搜索文本字符串。
对于 PDF 文档,可以使用更多方法向页面添加文本或图像。
首先,必须创建一个页面。这是Document的一种方法:
这里可以是任何整数。负数从末尾倒数,所以doc[-1]是最后一页,就像 Python 序列一样。-∞ < pno < page_count
一些更高级的方法是将文档用作其页面上的迭代器:
检查页面的链接、注释或表单字段
使用某些查看器软件显示文档时,链接显示为“热点区域”。如果您在光标显示手形符号时单击,您通常会被带到该热点区域中编码的目标。以下是获取所有链接的方法:
links是一个 Python 字典列表。有关详细信息,请参阅Page.get_links()
。
您还可以使用一次发出一个链接的迭代器:
如果处理 PDF 文档页面,可能还存在注释 ( Annot ) 或表单字段 ( Widget ),每个都有自己的迭代器:
呈现页面
此示例创建页面内容的光栅图像:
pix是一个Pixmap对象,它(在本例中)包含页面的RGB图像,可用于多种用途。方法Page.get_pixmap()
提供了许多用于控制图像的变体:分辨率/DPI、色彩空间(例如生成灰度图像或具有减色方案的图像)、透明度、旋转、镜像、移动、剪切等。例如:创建一个RGBA图像(即包含 alpha 通道),指定pix = page.get_pixmap(alpha=True)。
Pixmap包含下面引用的许多方法和属性。其中包括整数width、height(每个以像素为单位)和stride(一个水平图像行的字节数)。属性样本代表代表图像数据(Python字节对象)的矩形字节区域。
将页面图像保存在文件中
可以简单地将图像存储在 PNG 文件中:
在 GUI 中显示图像
QtQImage
幸运地支持原生 Python 指针,因此以下是创建 Qt 图像的推荐方法:
提取文本和图像
我们还可以以多种不同的形式和详细程度提取页面的所有文本、图像和其他信息:
搜索文本
您可以找出特定文本字符串在页面上的确切位置:
这提供了一个矩形列表(请参阅Rect),每个矩形都围绕着一次出现的字符串“mupdf”(不区分大小写)。您可以使用此信息来突出显示这些区域(仅限 PDF)或创建文档的交叉引用。
从HTML源代码生成PDF
Stories 提供了一种方法,可以轻松地布局用于设备的风格化内容,例如Document Writers(......)所提供的内容。最多会考虑来自三个不同信息源的输入。所有这些项目都是可选的。
HTML 源代码,可以是 Python 字符串,也可以是脚本使用Xml的方法创建的。
CSS(级联样式表)源代码,以 Python 字符串形式提供。CSS 可用于提供样式信息(文本字体大小、颜色等),就像网页一样。显然,这个字符串也可能是从文件中读取的。
每当 DOM 引用图像或使用除标准PDF Base 14 字体、CJK 字体和生成到 PyMuPDF 二进制文件中的 NOTO 字体之外的文本字体时,都必须使用资源文件。
不需要提供语法完整的 HTML 文档:完全接受html片段,并且许多/大多数语法错误会自动更正。在 HTML 被认为完成后,它可以用于创建 PDF 文档。这是通过新的DocumentWriter类发生的。程序员调用它的方法来创建一个新的空白页面,并将矩形传递给 Story 以填充它们。
PDF维护
PDF 是唯一可以使用 PyMuPDF修改的文档类型。其他文件类型是只读的。
但是,您可以将任何文档(包括图像)转换为 PDF,然后将所有 PyMuPDF 功能应用于转换结果。
Document.save()
始终将 PDF 以其当前(可能已修改)状态存储在磁盘上。
您通常可以选择是保存到新文件,还是仅将修改附加到现有文件(“增量保存”),这通常要快得多。
合并和拆分 PDF 文档
保存
Document.save()
将始终以当前状态保存文档。可以通过指定选项incremental=True将更改写回原始 PDF。这个过程(通常)非常快,因为更改是附加到原始文件而不是完全重写它。
Document.save()
options 对应于 MuPDF 的命令行工具mutool clean的选项,见下表。
Save Option mutool Effect
garbage=1 g 垃圾收集未使用的对象
garbage=2 gg 在1 的基础上,紧凑型xref
表
garbage=3 ggg 在2 的基础上, 合并重复对象
garbage=4 gggg 在3 的基础上, 合并重复的流内容
clean=True cs 清洁和消毒内容流
deflate=True z 缩小未压缩的流
deflate_images=True i 缩小图像流
deflate_fonts=True f 缩小字体文件流
ascii=True a 将二进制数据转换为 ASCII 格式
linear=True l 创建一个线性化版本
expand=True d 解压缩所有流
例如,mutool clean -ggggz file.pdf会产生出色的压缩结果。它对应于doc.save(filename, garbage=4, deflate=True)。
关闭
在程序继续运行的同时,通常需要“关闭”文档以将对底层文件的控制权交给操作系统。
这可以通过该方法来实现Document.close()
。除了关闭底层文件外,与文档关联的缓冲区也将被释放。