术语表#

coordinate#

这是理解本文件的重要一般数学/几何术语。有关更详细的讨论,请参见本节:坐标

matrix_like#

一个包含6个数字的Python序列。

rect_like#

一个包含4个数字的Python序列。

irect_like#

一个包含4个整数的Python序列。

point_like#

一个包含2个数字的Python序列。

quad_like#

一个包含4个 point_like 项的Python序列。

inheritable#

在PDF中的多个值可以被父子关系中更下方的对象继承。例如,页面的mediabox(物理大小)可以只在pagetree的某个节点中指定一次,然后被所有未指定自己值的子项作为值使用。

MediaBox#

一个包含4个浮点数的PDF数组,指定一个物理页面大小 – (inheritable, 强制性的)。这个矩形应该包含所有其他PDF – 可选 – 页面矩形,这些矩形可以额外指定:CropBox、TrimBox、ArtBox和BleedBox。有关详细信息,请参见Adobe PDF References。MediaBox是唯一一个MuPDF和PDF坐标系统之间没有区别的矩形:Page.mediabox将始终显示与页面对象定义中的/MediaBox键相同的坐标。对于所有其他矩形,MuPDF转换y坐标,使得顶部边框是参考点。这有时可能会造成困惑 – 例如,你可能会遇到这样的情况:

  • 页面定义包含以下相同的值: /MediaBox [ 36 45 607.5 765 ], /CropBox [ 36 45 607.5 765 ].

  • PyMuPDF 因此显示 page.mediabox = Rect(36.0, 45.0, 607.5, 765.0).

  • 但是: page.cropbox = Rect(36.0, 0.0, 607.5, 720.0),因为这两个y坐标已经被转换(都减去了45)。

CropBox#

一个包含4个浮点数的PDF数组,用于指定页面的可见区域 – (可继承, 可选)。这是TrimBox、ArtBox和BleedBox的默认值。如果不存在,则默认为MediaBox。此值不受影响如果页面旋转 – 与Page.rect相反。此外,与页面矩形不同,裁切框的左上角可能是或不是(0, 0)

catalog#

一个中央 PDF dictionary - 也称为“根” - 包含文档范围的参数和指向许多其他信息的指针。它的 xref 是通过 Document.pdf_catalog() 返回的。

trailer#

更准确地说,PDF 段尾 包含以 字典 格式的信息。它通常位于文件的末尾。在这个字典中,你会找到像目录的 xrefs 和元数据、xref 数字的数量等信息。以下是 PDF 规范的定义:

“PDF 文件的尾部使得读取该文件的应用程序能够快速找到交叉引用表和某些特殊对象。应用程序应该从 PDF 文件的末尾开始读取。”

要在PyMuPDF中访问尾部,使用常规方法 Document.xref_object()Document.xref_get_key()Document.xref_get_keys(),用 -1 代替正的xref编号。

contents#

A 内容流是一个 PDF 对象,附带一个,其数据由一系列指令组成,这些指令描述了要绘制在页面上的图形元素,请参见Adobe PDF 参考文献第19页的“流对象”。有关这些流中使用的迷你语言的概述,请参见Adobe PDF 参考文献第643页的“操作符摘要”章节。一个 PDF 页面可以没有或有多个内容对象。如果没有内容对象,页面是空的(但仍可能显示注释)。如果有多个内容对象,则它们将按顺序解释,就好像它们的指令在一个这样的对象中出现一样(即像在一个连接的字符串中)。应注意,还有更多使用相同语法的流对象类型:例如与注释相关的外观字典和表单 XObjects。

PyMuPDF 提供了多种方法来处理 PDF 页面内容:

  • Page.read_contents() – 读取并将所有页面内容连接成一个 bytes 对象。

  • Page.clean_contents() – 一个MuPDF函数的包装器,用于读取、连接和语法清理所有页面内容。之后,只会存在一个 /Contents 对象。此外,页面 resources 将与其同步,以便它将恰好包含页面实际引用的那些图像、字体和其他对象。

  • Page.get_contents() – 返回一个页面的 xref 对象的编号列表。 可能为空。 使用 Document.xref_stream() 与这些 xref 中的一个来读取相应的内容部分。

  • Page.set_contents() – 将页面的 /Contents 键设置为提供的 xref 数字。

resources#

一个dictionary,包含PDFpage所需的任何资源(如图像或字体)的引用(必需的,可继承的,Adobe PDF References 第81页)和某些其他对象(表单X对象)。这个字典作为一个子字典出现在对象定义中的键/Resources下。作为一种可继承的对象类型,可能存在所有页面或某些页面子集的“父”资源。

dictionary#

A PDF object 类型,与同名的 Python 概念有一定的可比性:“一个字典对象是一个包含对象对的 associative table,称为字典的条目。每个条目的第一个元素是键,第二个元素是值。键必须是一个名称(…)。值可以是任何类型的对象,包括另一个字典。一个值为 null(…)的字典条目等同于一个缺失的条目。” (Adobe PDF References p. 18).

字典是PDF中最重要的 object 类型。这里是一个示例(描述一个 page):

<<
/Contents 40 0 R                  % value: an indirect object
/Type/Page                        % value: a name object
/MediaBox[0 0 595.32 841.92]      % value: an array object
/Rotate 0                         % value: a number object
/Parent 12 0 R                    % value: an indirect object
/Resources<<                      % value: a dictionary object
    /ExtGState<</R7 26 0 R>>
    /Font<<
         /R8 27 0 R/R10 21 0 R/R12 24 0 R/R14 15 0 R
         /R17 4 0 R/R20 30 0 R/R23 7 0 R /R27 20 0 R
         >>
    /ProcSet[/PDF/Text]           % value: array of two name objects
    >>
/Annots[55 0 R]                   % value: array, one entry (indirect object)
>>

内容, 类型, 媒体框, 等等是 , 40 0 R, 页面, [0 0 595.32 841.92], 等等是各自的 . 字符串 “<<”“>>” 用于封闭对象定义.

此示例还展示了嵌套字典值的语法:Resources的值是一个对象,而这个对象又是一个字典,包含像ExtGState这样的键(其值为<>,这是另一个字典),等等。

page#

PDF页面是一个 dictionary 对象,它定义了PDF中的一页,参见 Adobe PDF References 第71页。

pagetree#

文档的页面通过一种称为页面树的结构进行访问,该结构定义了文档中页面的顺序。树结构允许PDF消费应用程序在仅使用有限内存的情况下,快速打开包含数千页的文档。该树包含两种类型的节点:中间节点,称为页面树节点,以及叶节点,称为页面对象。(Adobe PDF References p. 75)。

虽然可以将所有页面引用列在一个数组中,但包含许多页面的PDF通常使用平衡树结构(“页面树”)来加快对任何单个页面的访问。相对于页面的总数,这可以将平均页面访问时间按页面编号从线性减少到某个对数级别。

为了快速访问页面,MuPDF可以在内存中使用自己的数组 - 与文档文件中可能存在或不存在的内容无关。这个数组按页面编号索引,因此比通过完美平衡的页面树访问还要快得多。

object#

与 Python 类似,PDF 支持 对象 的概念,它可以有八种基本类型:布尔值(“true” 或 “false”)、整数和实数、字符串(始终 用括号括起来 - 要么是 “()”,要么是 “<>” 来表示十六进制)、名称(必须始终以 “/” 开头,例如 /Contents)、数组(用括号 “[]” 括起来)、字典(用括号 “<<>>” 括起来)、流(用关键字 “stream” / “endstream” 括起来)以及空对象(“null”)(Adobe PDF References 第 13 页)。对象可以通过分配标签来使其可识别。这个标签被称为 间接 对象。PyMuPDF 支持通过它们的交叉引用编号来检索间接对象的定义,方法是通过 Document.xref_object()

stream#

一个 PDF dictionary object 类型,其后是一个字节序列,类似于 Python bytes。“然而,PDF 应用程序可以增量读取流,而字符串必须整体读取。此外,流的长度可以是无限的,而字符串则受到实现限制。因此,潜在大数据量的对象,如图像和页面描述,被表示为流。” “一个流由一个 dictionary 组成,其后跟随零个或多个字节,这些字节被关键字 streamendstream 包围。”:

nnn 0 obj
<<
   dictionary definition
>>
stream
(zero or more bytes)
endstream
endobj

请参见 Adobe PDF 参考文献 第 19 页。PyMuPDF 支持通过 Document.xref_stream() 检索流内容。使用 Document.is_stream() 来确定对象是否为流类型。

unitvector#

一个数学概念,表示范数(“长度”)为1的向量—通常隐含的是欧几里得范数。在PyMuPDF中,这个术语限制为 Point 对象,参见Point.unit

xref#

交叉引用号的缩写:这是一个唯一标识PDF中对象的整数。每个PDF中都有一个交叉引用表(可能物理上由几个独立段落组成),该表存储每个对象的相对位置以便于快速查找。交叉引用表比现有对象的数量多一个条目:第零项是保留的,必须以任何方式不使用。许多PyMuPDF类都有一个xref属性(对于非PDF文档,该属性为零),可以通过Document.xref_length() - 1来找出PDF中对象的总数。

fontsize#

在提到字体大小时,该指标以点为单位测量,其中1英寸=72点。

resolution#

图像和 Pixmap 对象可能包含以“每英寸点数”提供的分辨率信息,dpi,分别用于每个方向(水平和垂直)。当 MuPDF 从文件或 PDF 对象中读取图像时,它会解析这些信息并将其放入 Pixmap.xresPixmap.yres 中。如果它在输入中找不到有意义的信息(如非正值或超过 4800 的值),它将使用“合理”的默认值。通常的默认值是 96,但在某些情况下(例如,对于 JPX 图像),它也可能是 72。

OCPD#

可选内容属性字典 - PDF 目录 的一个子 字典。储存可选内容信息的中心位置,通过键 /OCProperties 进行识别。该字典有两个必需项和一个可选项:(1) /OCGs,必需,一个列出所有可选内容组的数组,(2) /D,必需,默认的可选内容配置字典(OCCD),(3) /Configs,可选,一个替代OCCD的数组。

OCCD#

可选内容配置字典 - 一个PDF dictionary 在PDF OCPD 内部。它存储OCGs的开/关状态设置以及如何呈现给PDF查看程序。选择一个配置是快速实现临时大规模可见状态变化的方法。打开PDF后,/D 配置的 OCPD 始终被激活。查看器应该提供在 /D 或数组 /Configs 中包含的一个可选配置之间切换的方式。

OCG#

可选内容组 – 一个 dictionary 对象,用于控制其他 PDF 对象的可见性,如图像或注释。无论它们定义在第几页,具有相同 OCG 的对象可以通过将其 OCG 设置为打开或关闭同时显示或隐藏。这可以通过许多 PDF 查看器(如 Adobe Acrobat)提供的用户界面实现,或通过编程实现。

OCMD#

可选内容会员字典 – 一个 dictionary 对象,可以像一个 OCG 一样使用:它具有可见性状态。OCMD 的可见性是 计算得出的: 这是一个逻辑表达式,使用一个或多个 OCG 的状态来生成一个布尔值。表达式的结果被解释为开启 (true) 或关闭 (false)。

ligature#

一些常见的字符组合在更高级的字体中用它们自己的特殊字符表示。典型的例子有“fi”、“fl”、“ffi”和“ffl”。这些复合字符被称为 连字。在 PyMuPDF 文本提取中,可以选择返回相应的 unicode 不变,或将连字拆分为其组成部分:“fi” ==> “f” + “i”等等。


本软件按原样提供,不作任何明示或暗示的担保。该软件根据许可证分发,除非按照该许可证的条款明确授权,否则不得复制、修改或分发。有关许可信息,请参阅artifex.com或联系Artifex Software Inc.,地址:39 Mesa Street, Suite 108A, San Francisco CA 94129, United States以获取更多信息。