PyMuPDF-1-24-4-中文文档-十二-

PyMuPDF 1.24.4 中文文档(十二)

原文:https://pymupdf.readthedocs.io/en/latest/

设备

原文:pymupdf.readthedocs.io/en/latest/device.html

不同的格式处理程序(pdf、xps 等)将页面解释为“设备”。设备是可以对页面执行的所有操作的基础:渲染、文本提取和搜索。设备类型由所选的构造方法确定。

类 API

class Device
__init__(self, object, clip)

用于像素映射或显示列表设备的构造函数。

参数:

  • 对象(位图或显示列表)- 可以是PixmapDisplayList之一。

  • 剪裁(IRect)- 用于Pixmap设备的可选 IRect,限制页面渲染到特定区域。如果需要完整页面,请指定None。对于显示列表设备,必须省略此参数。

__init__(self, textpage, flags=0)

用于文本页设备的构造函数。

参数:

  • 文本页(TextPage)- TextPage对象

  • 标志int)- 控制文本如何解析为文本页的方式。当前可以将 3 个选项编码到此参数中,请参见文本提取标志。要设置这些选项,请使用类似flags=0 | TEXT_PRESERVE_LIGATURES | …的方式。

您对本页面有任何反馈吗?


此软件按原样提供,没有任何明示或暗示的保证。此软件在许可下分发,除非在该许可条款明确授权下,否则不得复制、修改或分发此软件。请参阅artifex.com获取许可信息或联系美国加利福尼亚州旧金山 Mesa Street 39 号 108A 套房的 Artifex Software Inc.获取更多信息。

此文档覆盖所有版本,直到 1.24.4。

Discord logo

共同工作:DisplayList 和 TextPage

原文:pymupdf.readthedocs.io/en/latest/coop_low.html

这里有一些关于如何一起使用这些类的说明。

在某些情况下,当您回到这里解释的详细级别时,可能可以实现性能改进。

创建一个 DisplayList

一个 DisplayList 代表一个解释的文档页面。方法用于创建像素图、提取文本和文本搜索都是在幕后使用页面的显示列表来执行它们的任务。如果一个页面必须被多次渲染(例如因为变化的缩放级别),或者如果同时执行文本搜索和文本提取,可以节省开销,只需创建显示列表一次,然后用于所有其他任务。

>>> dl = page.get_displaylist()              # create the display list 

您还可以在“堆栈”上(列表中)为多个页面创建显示列表,可以在文档打开时、空闲时,或者在第一次访问页面时(例如在 GUI 脚本中)存储它。

注意,对于接下来的所有内容,只需要显示列表 – 相应的 Page 对象可能已被删除。

生成 Pixmap

以下代码从一个 DisplayList 创建一个 Pixmap。参数与 Page.get_pixmap() 相同。

>>> pix = dl.get_pixmap()                    # create the page's pixmap 

这个语句的执行时间可能比 Page.get_pixmap() 短多达 50%。

执行文本搜索

使用上面的显示列表,我们也可以搜索文本。

为此,我们需要创建一个 TextPage。

>>> tp = dl.get_textpage()                    # display list from above
>>> rlist = tp.search("needle")              # look up "needle" locations
>>> for r in rlist:                          # work with the found locations, e.g.
 pix.invert_irect(r.irect)             # invert colors in the rectangles 

提取文本

使用同一个 TextPage 对象,我们现在可以立即使用任何或所有 5 种文本提取方法。

注意

在上述,我们创建了我们的文本页面而没有参数。这导致默认参数为 3(保留连字和空白),IAW 图像将不会被提取 – 见下文。

>>> txt  = tp.extractText()                  # plain text format
>>> json = tp.extractJSON()                  # json format
>>> html = tp.extractHTML()                  # HTML format
>>> xml  = tp.extractXML()                   # XML format
>>> xml  = tp.extractXHTML()                 # XHTML format 

进一步的性能改进

Pixmap

如同在 Page 章节中解释的那样:

如果您不需要透明度,请在创建像素图时设置 alpha = 0。这将节省 25% 的内存(如果是 RGB,最常见的情况),并可能节省 5% 的执行时间(取决于 GUI 软件)。

TextPage

如果您不需要提取页面文本旁边的图像,可以设置以下选项:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE
>>> tp = dl.get_textpage(flags) 

这将为 HTML、XHTML 和 JSON 文本提取节省约 25% 的总体执行时间,并极大地减少存储量(内存和磁盘空间)如果文档是面向图形的。

如果您确实需要图像,请使用标志值 7:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE | pymupdf.TEXT_PRESERVE_IMAGES 

对此页面有任何反馈吗?


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

此文档涵盖了所有版本直至 1.24.4。

Discord logo

创建一个 DisplayList

DisplayList 表示一个解释的文档页面。幕后的方法,用于创建位图、提取文本和文本搜索的页面显示列表来执行它们的任务。如果一个页面必须渲染多次(例如,由于缩放级别的更改),或者如果同时进行文本搜索和文本提取,那么如果仅创建一次显示列表然后用于所有其他任务,则可以节省开销。

>>> dl = page.get_displaylist()              # create the display list 

你也可以为许多页面“在堆栈中”创建显示列表(列表中),可能是在文档打开时,空闲时,或者当第一次访问页面时存储它(例如,在 GUI 脚本中)。

注意,对于接下来的一切,只需要显示列表——相应的 Page 对象可能已被删除。

生成 Pixmap

以下从 DisplayList 创建一个 Pixmap。参数与 Page.get_pixmap() 相同。

>>> pix = dl.get_pixmap()                    # create the page's pixmap 

该语句的执行时间可能比 Page.get_pixmap() 的执行时间短长达 50%。

执行文本搜索

使用上述显示列表,我们还可以搜索文本。

为此,我们需要创建一个 TextPage。

>>> tp = dl.get_textpage()                    # display list from above
>>> rlist = tp.search("needle")              # look up "needle" locations
>>> for r in rlist:                          # work with the found locations, e.g.
 pix.invert_irect(r.irect)             # invert colors in the rectangles 

提取文本

使用上述相同的 TextPage 对象,我们现在可以立即使用任意或所有的 5 个文本提取方法。

注意

如上所述,我们创建了我们的文本页而不带参数。这将导致默认参数为 3(保留连字和空格),IAW 图像不会被提取——请参阅下文。

>>> txt  = tp.extractText()                  # plain text format
>>> json = tp.extractJSON()                  # json format
>>> html = tp.extractHTML()                  # HTML format
>>> xml  = tp.extractXML()                   # XML format
>>> xml  = tp.extractXHTML()                 # XHTML format 

进一步的性能改进

Pixmap

如 Page 章节所述:

如果不需要透明度,请在创建位图时将 alpha = 0 设置为。这将节省 25% 的内存(如果是 RGB,则是最常见的情况),并可能节省 5% 的执行时间(取决于 GUI 软件)。

TextPage

如果您不需要在页面文本旁边提取图像,可以设置以下选项:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE
>>> tp = dl.get_textpage(flags) 

这将为 HTML、XHTML 和 JSON 文本提取节省大约 25% 的总执行时间,并且如果文档是面向图形的,则会大大减少存储量(内存和磁盘空间)。

如果您确实需要图像,请为标志使用值 7:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE | pymupdf.TEXT_PRESERVE_IMAGES 

你对这页有任何反馈吗?


此软件按原样提供,不提供任何明示或暗示的担保。此软件根据许可分发,除非在许可条款明确授权,否则不得复制、修改或分发。有关更多信息,请参阅artifex.com,或联系 Artifex Software Inc.,39 Mesa Street,Suite 108A,San Francisco CA 94129,美国。

本文档涵盖了所有版本直至 1.24.4。

Discord logo

Pixmap

如 Page 章节所述:

如果创建像素图时不需要透明度,请将alpha = 0。这将节省 25%的内存(如果是 RGB,这是最常见的情况),并可能节省 5%的执行时间(取决于 GUI 软件)。

TextPage

如果不需要在页面文本旁边提取图像,可以设置以下选项:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE
>>> tp = dl.get_textpage(flags) 

这将为 HTML、XHTML 和 JSON 文本提取节省大约 25%的总执行时间,并大幅减少存储量(内存和磁盘空间),如果文档是图形导向的话。

然而,如果需要图像,请使用 7 作为标志的值:

>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE | pymupdf.TEXT_PRESERVE_IMAGES 

你对这页有任何反馈吗?


此软件按原样提供,不提供任何明示或暗示的担保。此软件根据许可分发,除非在许可条款明确授权,否则不得复制、修改或分发。有关更多信息,请参阅artifex.com,或联系 Artifex Software Inc.,39 Mesa Street,Suite 108A,San Francisco CA 94129,美国。

本文档涵盖了所有版本直至 1.24.4。

Discord logo

术语表

原文:pymupdf.readthedocs.io/en/latest/glossary.html

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的某些节点中指定一次,然后将作为所有未指定自己值的kids的值。

MediaBox

一个包含 4 个浮点数的 PDF 数组,指定了页面的物理大小 - (可继承,必填)。此矩形应包含所有其他 PDF 页面矩形,可选 - 页边框、裁剪框、艺术框和出血框。请参阅 Adobe PDF 参考手册以获取详细信息。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 字典 - 也称为“根” - 包含文档范围的参数和指向许多其他信息的指针。其xrefDocument.pdf_catalog()返回。

trailer

更准确地说,PDF 尾部字典 格式包含信息。通常位于文件的末尾。在此字典中,您将找到诸如目录和元数据的 xrefs、xref 数量等内容。以下是 PDF 规范的定义:

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

要访问 PyMuPDF 中的尾部,请使用通常的方法 Document.xref_object()Document.xref_get_key()Document.xref_get_keys(),使用 -1 而不是正数 xref 编号。

contents

内容流 是带有附加 stream 的 PDF 对象,其数据包含一系列描述要在页面上绘制的图形元素的指令,详见 Adobe PDF 参考手册第 19 页上的“Stream Objects”。有关这些流中使用的迷你语言的概述,请参阅 Adobe PDF 参考手册第 643 页上的“操作符总结”章节。PDF 页面 可以没有到多个内容对象。如果没有内容对象,则页面为空(但仍可能显示注释)。如果有多个内容对象,则将按顺序解释它们,就好像它们的指令存在于一个这样的对象中(即像连接字符串一样)。应注意,还有更多使用相同语法的流对象类型,例如与注释相关联的外观字典和表单 XObjects。

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

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

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

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

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

resources

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

dictionary

PDF object类型,与同名的 Python 概念有些类似:“字典对象是一个关联表,包含对象对,称为字典的条目。每个条目的第一个元素是键,第二个元素是值。键必须是名称(…)。值可以是任何类型的对象,包括另一个字典。其值为 null(…)的字典条目相当于不存在的条目。”(Adobe PDF References 第 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)
>> 

Contents, Type, MediaBox等是40 0 RPage[0 0 595.32 841.92]等是相应的。字符串“<<”“>>”用于封装对象定义。

此示例还显示了嵌套字典值的语法:Resources具有对象作为其值,其本身是一个带有像ExtGState(其值为<</R7 26 0 R>>,即另一个字典)等键的字典。

page

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

pagetree

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

尽管可以在一个数组中列出所有页面引用,但是具有许多页面的 PDF 通常使用“平衡树”结构(“页面树”)创建,以便更快地访问任何单个页面。相对于页面总数,这可以将平均页面访问时间从线性降低到对数级别。

为了快速访问页面,MuPDF 可以使用内存中的自己的数组 – 与文档文件中可能有或没有的内容无关。该数组通过页面号索引,因此比甚至通过完全平衡的页面树访问还要快得多。

object

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

stream

一个 PDF 的字典 对象类型,其后跟着一系列字节,类似于 Python 的 bytes。“然而,PDF 应用程序可以逐步读取流,而字符串必须一次性读取。此外,流可以是无限长度的,而字符串则受实现限制。因此,具有大量数据的对象(例如图像和页面描述)被表示为流。” “一个流由一个字典后跟关键字 streamendstream 之间的零个或多个字节组成”:

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

参见 Adobe PDF References p. 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

当提及字体大小时,这个度量单位是以点(points)为单位,其中 1 英寸 = 72 点。

resolution

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

OCPD

可选内容属性字典 - PDF catalog的子dictionary。 存储可选内容信息的中心位置,由键/OCProperties标识。 此字典具有两个必填项和一个可选项:(1)/OCGs,必填,列出所有可选内容组的数组,(2)/D,必填,默认可选内容配置字典(OCCD),(3)/Configs,可选,备用 OCCD 的数组。

OCCD

可选内容配置字典 - PDF catalog的子dictionary。 它存储了 OCG 的 ON / OFF 状态的设置以及它们如何呈现给 PDF 查看器程序。 选择配置是实现临时大规模可见性状态更改的快速方法。 打开 PDF 后,始终激活OCPD/D配置。 查看器应该提供一种在/D和数组/Configs中包含的一个可选配置之间切换的方法。

OCG

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

OCMD

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

ligature

一些频繁的字符组合由更高级的字体中的特殊字形表示。 典型的例子是“fi”、“fl”、“ffi”和“ffl”。 这些化合物称为连字。 在 PyMuPDF 文本提取中,有选项可以将相应的 Unicode 要么保持不变,要么将连字分解为其组成部分:“fi” ==> “f” + “i”,等等。

你对这个页面有什么反馈吗?


此软件按原样提供,不提供任何明示或暗示的保证。此软件根据许可证分发,未经许可不得复制、修改或分发。请参考 artifex.com 上的许可信息,或联系美国旧金山 94129 号 Mesa 街 39 号 108A 套房的 Artifex Software Inc. 获取更多信息。

此文档涵盖所有版本,直至 1.24.4。

Discord 标志

MuPDF 实现的常量和枚举

原文:pymupdf.readthedocs.io/en/latest/vars.html

MuPDF 实现的常量和枚举。以下每个变量均可作为 pymupdf.variable 访问。

常量

Base14_Fonts

预定义的 Python 列表,包括有效的 PDF Base 14 Fonts。

返回类型:

列表

csRGB

预定义 RGB 色彩空间 pymupdf.Colorspace(pymupdf.CS_RGB)

返回类型:

Colorspace

csGRAY

预定义 GRAY 色彩空间 pymupdf.Colorspace(pymupdf.CS_GRAY)

返回类型:

Colorspace

csCMYK

预定义 CMYK 色彩空间 pymupdf.Colorspace(pymupdf.CS_CMYK)

返回类型:

Colorspace

CS_RGB

1 – Colorspace 类型为 RGBA

返回类型:

int

CS_GRAY

2 – Colorspace 类型为 GRAY

返回类型:

int

CS_CMYK

3 – Colorspace 类型为 CMYK

返回类型:

int

VersionBind

‘x.xx.x’ – PyMuPDF(这些绑定)的版本

返回类型:

字符串

VersionFitz

‘x.xxx’ – MuPDF 的版本

返回类型:

字符串

VersionDate

ISO 时间戳 YYYY-MM-DD HH:MM:SS,这些绑定的构建时间。

返回类型:

字符串

注意

fitz 的文档字符串包含上述信息,可以像这样检索:print(fitz.doc),应如下所示:PyMuPDF 1.10.0:MuPDF 1.10 库的 Python 绑定,构建于 2016-11-30 13:09:13

version

(VersionBind,VersionFitz,timestamp)– 组合版本信息,其中 timestamp 是生成时间点,格式为 “YYYYMMDDhhmmss”。

返回类型:

元组

文档权限

Code Permitted Action
PDF_PERM_PRINT 打印文档
PDF_PERM_MODIFY 修改文档内容
PDF_PERM_COPY 复制或提取文本和图形
PDF_PERM_ANNOTATE 添加或修改文本注释和交互式表单字段
PDF_PERM_FORM 填写表单和签署文档
PDF_PERM_ACCESSIBILITY 已过时,始终允许
PDF_PERM_ASSEMBLE 插入、旋转或删除页面、书签、缩略图图像

| PDF_PERM_PRINT_HQ | 高质量打印 | ## PDF 可选内容代码

Code Meaning
PDF_OC_ON 临时设置 OCG 为打开状态
PDF_OC_TOGGLE 临时切换 OCG 状态

| PDF_OC_OFF | 临时设置 OCG 为关闭状态 | ## PDF 加密方法代码

Code Meaning
PDF_ENCRYPT_KEEP 不更改
PDF_ENCRYPT_NONE 移除任何加密
PDF_ENCRYPT_RC4_40 RC4 40 位
PDF_ENCRYPT_RC4_128 RC4 128 位
PDF_ENCRYPT_AES_128 高级加密标准 128 位
PDF_ENCRYPT_AES_256 高级加密标准 256 位

| PDF_ENCRYPT_UNKNOWN | 未知 | ## 字体文件扩展名

这张表显示了从 PDF 中提取字体文件缓冲区时应使用的文件扩展名。此字符串由Document.get_page_fonts()Page.get_fonts()Document.extract_font()返回。

Ext 描述
ttf TrueType 字体
pfa ASCII 字体的 Postscript(各种子类型)
cff Type1C 字体(等效于 Type1 的压缩字体)
cid 字符标识符字体(Postscript 格式)
otf OpenType 字体

| n/a | 不可提取,例如 PDF 基础 14 字体、Type 3 字体和其他字体 |

TEXT_ALIGN_LEFT

0 – 左对齐。

TEXT_ALIGN_CENTER

1 – 中心对齐。

TEXT_ALIGN_RIGHT

2 – 右对齐。

TEXT_ALIGN_JUSTIFY

3 – 两端对齐。 ## 文本提取标志

控制将数据解析为 TextPage 的选项位 – 此类主要在 PyMuPDF 中仅内部使用。

对于 PyMuPDF 程序员,这些值的某些组合(使用 Python 的|运算符,或者简单地使用+)被聚合到flags整数中,这是所有文本搜索和文本提取方法的参数。根据各个方法的不同,默认组合的值也不同。请使用符合您情况的值。特别是请确保关闭图像提取,除非您确实需要它们。这对性能和内存的影响是显著的!

TEXT_PRESERVE_LIGATURES

1 – 如果设置,连字将以其原始形式传递到应用程序。否则,连字将展开为其组成部分,例如,连字“ffi”展开为三个单独的字符 f、f 和 i。在 PyMuPDF 中,默认为“on”。MuPDF 支持以下 7 种连字:“ff”、“fi”、“fl”、“ffi”、“ffl”、“ft”、“st”。

TEXT_PRESERVE_WHITESPACE

2 – 如果设置,空白将被传递。否则,任何类型的水平空白(包括水平制表符)将被替换为可变宽度的空格字符。在 PyMuPDF 中,默认为“on”。

TEXT_PRESERVE_IMAGES

4 – 如果设置,则图像将存储在 TextPage 中。这会导致在“blocks”、“dict”、“json”、“rawdict”、“rawjson”、“html”和“xhtml”类型的文本提取输出中存在(通常较大的!)二进制图像内容,并且这是默认行为。然而,如果与“blocks”一起使用,则仅返回图像元数据,而不是图像本身。

TEXT_INHIBIT_SPACES

8 – 如果设置,Mupdf 将不会在字符之间存在大间隙时尝试添加丢失的空格字符。在 PDF 中,创建者通常不会插入空格来指向下一个字符的位置,而是直接提供位置地址。在 PyMuPDF 中,默认为“off” – 因此将生成空格

TEXT_DEHYPHENATE

16 – 忽略行尾的连字符并与下一行连接。在文本搜索功能中内部使用。但通常可用:如果打开,文本提取将返回连接的文本行(或跨度),第一行的结束连字符将被消除。因此,不同行上的两个独立跨度 “first meth-”“od leads to wrong results” 将连接成一个跨度 “first method leads to wrong results” 并相应地更新边界框:结果跨度的字符将不再具有相同的 y 坐标。

TEXT_PRESERVE_SPANS

32 – 为每个跨度生成新行。在 PyMuPDF 中未使用(“关闭”),但可供您使用。在“dict”、“json”、“rawdict”、“rawjson”中的每一行都将包含一个跨度。

TEXT_MEDIABOX_CLIP

64 – 如果设置,将忽略页面 mediabox 之外的字符。这是 PyMuPDF 中的默认设置。

TEXT_CID_FOR_UNKNOWN_UNICODE

128 – 如果设置,使用原始字符代码而不是 U+FFFD。这是 PyMuPDF 中文本提取的默认值。如果您想要检测编码信息丢失或不确定时,切换此标志并扫描结果文本中 U+FFFD(=chr(0xfffd))码点的存在。

以下常量代表上述文本提取和搜索的默认组合:

TEXTFLAGS_TEXT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_WORDS

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_BLOCKS

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_DICT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_RAWDICT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_HTML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_XHTML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_XML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_SEARCH

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_DEHYPHENATE ## 链接目标类型

linkDest.kind(链接目标类型)的可能值。

LINK_NONE

0 – 无目标。表示一个虚拟链接。

返回类型:

int

LINK_GOTO

1 – 指向本文档中的某处。

返回类型:

int

LINK_URI

2 – 指向 URI – 通常是使用 Internet 语法指定的资源。

  • PyMuPDF 将任何包含冒号且不以 file: 开头的外部链接视为 LINK_URI

返回类型:

int

LINK_LAUNCH

3 – 打开(运行)另一个文件(任何“可执行”类型)。

  • PyMuPDF 将任何以 file: 开头或不包含冒号的外部链接视为 LINK_LAUNCH

返回类型:

int

LINK_NAMED

4 – 指向一个命名位置。

返回类型:

int

LINK_GOTOR

5 – 指向另一个 PDF 文档中的位置。

返回类型:

int ## 链接目标标志

注意

这个整数的最右边字节是一个位字段,所以用 & 运算符测试这些位的真假。

LINK_FLAG_L_VALID

1(位 0)左上角 x 值有效

返回类型:

bool

LINK_FLAG_T_VALID

2(位 1)左上角 y 值有效

返回类型:

bool

LINK_FLAG_R_VALID

4(位 2)右下角 x 值有效

返回类型:

bool

LINK_FLAG_B_VALID

8(位 3)右下角 y 值有效

返回类型:

bool

LINK_FLAG_FIT_H

16(位 4)水平适合

返回类型:

bool

LINK_FLAG_FIT_V

32(位 5)垂直适合

返回类型:

bool

LINK_FLAG_R_IS_ZOOM

64(位 6)右下角 x 是缩放数值

返回类型:

bool

注释相关常量

详见 Adobe PDF 参考手册 第 8.4.5 章,第 615 页。

注释类型

这些标识符还涵盖链接小部件:PDF 规范技术上以相同的方式处理它们,而 MuPDF(以及 PyMuPDF)则将它们视为三种基本不同类型的对象。

PDF_ANNOT_TEXT 0
PDF_ANNOT_LINK 1  # <=== Link object in PyMuPDF
PDF_ANNOT_FREE_TEXT 2
PDF_ANNOT_LINE 3
PDF_ANNOT_SQUARE 4
PDF_ANNOT_CIRCLE 5
PDF_ANNOT_POLYGON 6
PDF_ANNOT_POLY_LINE 7
PDF_ANNOT_HIGHLIGHT 8
PDF_ANNOT_UNDERLINE 9
PDF_ANNOT_SQUIGGLY 10
PDF_ANNOT_STRIKE_OUT 11
PDF_ANNOT_REDACT 12
PDF_ANNOT_STAMP 13
PDF_ANNOT_CARET 14
PDF_ANNOT_INK 15
PDF_ANNOT_POPUP 16
PDF_ANNOT_FILE_ATTACHMENT 17
PDF_ANNOT_SOUND 18
PDF_ANNOT_MOVIE 19
PDF_ANNOT_RICH_MEDIA 20
PDF_ANNOT_WIDGET 21  # <=== Widget object in PyMuPDF
PDF_ANNOT_SCREEN 22
PDF_ANNOT_PRINTER_MARK 23
PDF_ANNOT_TRAP_NET 24
PDF_ANNOT_WATERMARK 25
PDF_ANNOT_3D 26
PDF_ANNOT_PROJECTION 27
PDF_ANNOT_UNKNOWN -1 
```  ### 注释标志位

```py
PDF_ANNOT_IS_INVISIBLE 1 << (1-1)
PDF_ANNOT_IS_HIDDEN 1 << (2-1)
PDF_ANNOT_IS_PRINT 1 << (3-1)
PDF_ANNOT_IS_NO_ZOOM 1 << (4-1)
PDF_ANNOT_IS_NO_ROTATE 1 << (5-1)
PDF_ANNOT_IS_NO_VIEW 1 << (6-1)
PDF_ANNOT_IS_READ_ONLY 1 << (7-1)
PDF_ANNOT_IS_LOCKED 1 << (8-1)
PDF_ANNOT_IS_TOGGLE_NO_VIEW 1 << (9-1)
PDF_ANNOT_IS_LOCKED_CONTENTS 1 << (10-1) 
```  ### 注释线条结束样式

```py
PDF_ANNOT_LE_NONE 0
PDF_ANNOT_LE_SQUARE 1
PDF_ANNOT_LE_CIRCLE 2
PDF_ANNOT_LE_DIAMOND 3
PDF_ANNOT_LE_OPEN_ARROW 4
PDF_ANNOT_LE_CLOSED_ARROW 5
PDF_ANNOT_LE_BUTT 6
PDF_ANNOT_LE_R_OPEN_ARROW 7
PDF_ANNOT_LE_R_CLOSED_ARROW 8
PDF_ANNOT_LE_SLASH 9 

小部件常量

小部件类型(field_type

PDF_WIDGET_TYPE_UNKNOWN 0
PDF_WIDGET_TYPE_BUTTON 1
PDF_WIDGET_TYPE_CHECKBOX 2
PDF_WIDGET_TYPE_COMBOBOX 3
PDF_WIDGET_TYPE_LISTBOX 4
PDF_WIDGET_TYPE_RADIOBUTTON 5
PDF_WIDGET_TYPE_SIGNATURE 6
PDF_WIDGET_TYPE_TEXT 7 

文本小部件子类型(text_format

PDF_WIDGET_TX_FORMAT_NONE 0
PDF_WIDGET_TX_FORMAT_NUMBER 1
PDF_WIDGET_TX_FORMAT_SPECIAL 2
PDF_WIDGET_TX_FORMAT_DATE 3
PDF_WIDGET_TX_FORMAT_TIME 4 

小部件标志(field_flags

所有字段类型通用

PDF_FIELD_IS_READ_ONLY 1
PDF_FIELD_IS_REQUIRED 1 << 1
PDF_FIELD_IS_NO_EXPORT 1 << 2 

文本小部件

PDF_TX_FIELD_IS_MULTILINE  1 << 12
PDF_TX_FIELD_IS_PASSWORD  1 << 13
PDF_TX_FIELD_IS_FILE_SELECT  1 << 20
PDF_TX_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_TX_FIELD_IS_DO_NOT_SCROLL  1 << 23
PDF_TX_FIELD_IS_COMB  1 << 24
PDF_TX_FIELD_IS_RICH_TEXT  1 << 25 

按钮小部件

PDF_BTN_FIELD_IS_NO_TOGGLE_TO_OFF  1 << 14
PDF_BTN_FIELD_IS_RADIO  1 << 15
PDF_BTN_FIELD_IS_PUSHBUTTON  1 << 16
PDF_BTN_FIELD_IS_RADIOS_IN_UNISON  1 << 25 

选择小部件

PDF_CH_FIELD_IS_COMBO  1 << 17
PDF_CH_FIELD_IS_EDIT  1 << 18
PDF_CH_FIELD_IS_SORT  1 << 19
PDF_CH_FIELD_IS_MULTI_SELECT  1 << 21
PDF_CH_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_CH_FIELD_IS_COMMIT_ON_SEL_CHANGE  1 << 26 

PDF 标准混合模式

有关说明,请参阅 Adobe PDF 参考手册 第 324 页:

PDF_BM_Color "Color"
PDF_BM_ColorBurn "ColorBurn"
PDF_BM_ColorDodge "ColorDodge"
PDF_BM_Darken "Darken"
PDF_BM_Difference "Difference"
PDF_BM_Exclusion "Exclusion"
PDF_BM_HardLight "HardLight"
PDF_BM_Hue "Hue"
PDF_BM_Lighten "Lighten"
PDF_BM_Luminosity "Luminosity"
PDF_BM_Multiply "Multiply"
PDF_BM_Normal "Normal"
PDF_BM_Overlay "Overlay"
PDF_BM_Saturation "Saturation"
PDF_BM_Screen "Screen"
PDF_BM_SoftLight "Softlight" 
```  ## 印章注释图标

MuPDF 为**橡皮图章**注释定义了以下图标:

```py
STAMP_Approved 0
STAMP_AsIs 1
STAMP_Confidential 2
STAMP_Departmental 3
STAMP_Experimental 4
STAMP_Expired 5
STAMP_Final 6
STAMP_ForComment 7
STAMP_ForPublicRelease 8
STAMP_NotApproved 9
STAMP_NotForPublicRelease 10
STAMP_Sold 11
STAMP_TopSecret 12
STAMP_Draft 13 

你对这个页面有什么反馈吗?


本软件按原样提供,不附带任何明示或暗示的保证。本软件在许可下分发,未经授权不得复制、修改或分发。有关详细信息,请参阅artifex.com的许可信息或联系 Artifex Software Inc.,39 Mesa Street,Suite 108A,San Francisco CA 94129,美国。

本文档涵盖了所有版本,直至 1.24.4。

Discord logo

常量

Base14_Fonts

预定义的 Python 列表,包含有效的 PDF 基础 14 字体。

返回类型:

列表

csRGB

预定义的 RGB 颜色空间 pymupdf.Colorspace(pymupdf.CS_RGB)

返回类型:

颜色空间

csGRAY

预定义的 GRAY 颜色空间 pymupdf.Colorspace(pymupdf.CS_GRAY)

返回类型:

颜色空间

csCMYK

预定义的 CMYK 颜色空间 pymupdf.Colorspace(pymupdf.CS_CMYK)

返回类型:

颜色空间

CS_RGB

1 – 颜色空间 的类型为 RGBA

返回类型:

int

CS_GRAY

2 – 颜色空间 的类型为 GRAY

返回类型:

int

CS_CMYK

3 – 颜色空间 的类型为 CMYK

返回类型:

int

VersionBind

‘x.xx.x’ – PyMuPDF(这些绑定)的版本

返回类型:

字符串

VersionFitz

‘x.xxx’ – MuPDF 的版本

返回类型:

字符串

VersionDate

这些绑定构建的 ISO 时间戳为 YYYY-MM-DD HH:MM:SS

返回类型:

字符串

注意

fitz 的文档字符串包含上述信息,可以像这样检索:print(fitz.doc),应如下所示:PyMuPDF 1.10.0: Python bindings for the MuPDF 1.10 library, built on 2016-11-30 13:09:13

version

(VersionBind, VersionFitz, timestamp) – 组合版本信息,其中 timestamp 是以“YYYYMMDDhhmmss”格式化的生成时间点。

返回类型:

元组

文档权限

Code 允许的操作
PDF_PERM_PRINT 打印文档
PDF_PERM_MODIFY 修改文档内容
PDF_PERM_COPY 复制或提取文本和图形
PDF_PERM_ANNOTATE 添加或修改文本注释和交互式表单字段
PDF_PERM_FORM 填写表单并签署文档
PDF_PERM_ACCESSIBILITY 已过时,总是允许
PDF_PERM_ASSEMBLE 插入、旋转或删除页面、书签、缩略图图像
PDF_PERM_PRINT_HQ 高质量打印

PDF 可选内容代码

Code 含义
PDF_OC_ON 暂时将一个 OCG 设置为开启状态
PDF_OC_TOGGLE 暂时切换 OCG 状态
PDF_OC_OFF 暂时将一个 OCG 设置为关闭状态

PDF 加密方法代码

Code 含义
PDF_ENCRYPT_KEEP 不更改
PDF_ENCRYPT_NONE 移除任何加密
PDF_ENCRYPT_RC4_40 RC4 40 位
PDF_ENCRYPT_RC4_128 RC4 128 位
PDF_ENCRYPT_AES_128 高级加密标准 128 位
PDF_ENCRYPT_AES_256 高级加密标准 256 位
PDF_ENCRYPT_UNKNOWN 未知

字体文件扩展名

表格显示了从 PDF 中提取的字体文件缓冲区时应使用的文件扩展名。此字符串由 Document.get_page_fonts()Page.get_fonts()Document.extract_font() 返回。

Ext 描述
ttf TrueType 字体
pfa ASCII 字体的 Postscript(各种子类型)
cff Type1C 字体(相当于 Type1 的压缩字体)
cid 字符标识符字体(后缀格式)
otf 开放类型字体
n/a 无法提取,例如 PDF 基础 14 字体、Type 3 字体和其他字体

文本对齐

TEXT_ALIGN_LEFT

0 – 左对齐。

TEXT_ALIGN_CENTER

1 – 居中对齐。

TEXT_ALIGN_RIGHT

2 – 右对齐。

TEXT_ALIGN_JUSTIFY

3 – 两端对齐。

文本提取标志

控制被解析为 TextPage 的数据量的选项位 – 此类主要仅在 PyMuPDF 内部使用。

对于 PyMuPDF 程序员,在所有文本搜索和文本提取方法的 flags 整数参数中,可以使用 Python 的 | 运算符的某种组合,或者简单地使用 +。根据各个方法的不同,默认组合会使用不同的值。请使用适合你情况的值。特别是要确保除非确实需要,否则关闭图像提取。这会对性能和内存有显著影响!

TEXT_PRESERVE_LIGATURES

1 – 如果设置,连字将以其原始形式传递到应用程序。否则,连字将展开为其组成部分,例如连字“ffi”将展开为三个单独的字符 f、f 和 i。在 PyMuPDF 中默认为“开启”。MuPDF 支持以下 7 种连字:“ff”、“fi”、“fl”、“ffi”、“ffl”、“ft”、“st”。

TEXT_PRESERVE_WHITESPACE

2 – 如果设置,将传递空白字符。否则,任何类型的水平空白字符(包括水平制表符)将替换为可变宽度的空格字符。在 PyMuPDF 中默认为“开启”。

TEXT_PRESERVE_IMAGES

4 – 如果设置,图像将存储在 TextPage 中。这将导致在“blocks”、“dict”、“json”、“rawdict”、“rawjson”、“html”和“xhtml”类型的文本提取输出中存在(通常很大的!)二进制图像内容,并且在那里是默认的。然而,如果与“blocks”一起使用,则仅返回图像元数据,而不包含图像本身。

TEXT_INHIBIT_SPACES

8 – 如果设置,MuPDF 将不会尝试在字符之间存在较大间隙时添加缺失的空格字符。在 PDF 中,创建者通常不会插入空格以指示下一个字符的位置,而是提供直接的位置地址。在 PyMuPDF 中默认为“关闭” – 因此会生成空格。

TEXT_DEHYPHENATE

16 – 忽略行尾的连字符并与下一行连接。与文本搜索函数一起内部使用。但通常也可用:如果开启,文本提取将返回连接的文本行(或 span),第一行的结束连字符将被消除。因此,在不同行上的两个独立 span “first meth-”“od leads to wrong results” 将连接为一个 span “first method leads to wrong results” 并相应更新 bboxes:结果 span 的字符将不再具有相同的 y 坐标。

TEXT_PRESERVE_SPANS

32 – 每个 span 生成一个新行。在 PyMuPDF 中未使用(“关闭”),但可供您使用。在“dict”、“json”、“rawdict”、“rawjson”中的每行将恰好包含一个 span。

TEXT_MEDIABOX_CLIP

64 – 如果设置,将忽略页面mediabox之外的字符。这是 PyMuPDF 的默认设置。

TEXT_CID_FOR_UNKNOWN_UNICODE

128 – 如果设置,将使用原始字符代码而不是 U+FFFD。这是 PyMuPDF 中文本提取的默认设置。如果你希望检测编码信息缺失或不确定时,请切换此标志并扫描结果文本中是否存在 U+FFFD(即 chr(0xfffd))字符。

下列常数代表文本提取和搜索的默认组合:

TEXTFLAGS_TEXT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_WORDS

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_BLOCKS

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_DICT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_RAWDICT

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_HTML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_XHTML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_PRESERVE_IMAGES | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_XML

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_CID_FOR_UNKNOWN_UNICODE

TEXTFLAGS_SEARCH

TEXT_PRESERVE_LIGATURES | TEXT_PRESERVE_WHITESPACE | TEXT_MEDIABOX_CLIP | TEXT_DEHYPHENATE

链接目标类型

linkDest.kind(链接目标类型)的可能值。

LINK_NONE

0 – 没有目标。指示一个虚拟链接。

返回类型:

int

LINK_GOTO

1 – 指向本文档中的一个位置。

返回类型:

int

LINK_URI

2 – 指向一个 URI,通常使用互联网语法指定的资源。

  • PyMuPDF 将任何包含冒号且不以file:开头的外部链接视为LINK_URI

返回类型:

int

LINK_LAUNCH

3 – 启动(打开)另一个文件(任何“可执行”类型)。

  • PyMuPDF 将任何以file:开头或不包含冒号的外部链接视为LINK_LAUNCH

返回类型:

int

LINK_NAMED

4 – 指向一个命名位置。

返回类型:

int

LINK_GOTOR

5 – 指向另一个 PDF 文档中的一个位置。

返回类型:

int

链接目标标志

注意:

这个整数的最右字节是一个位字段,所以使用 & 运算符测试这些位的真实性。

LINK_FLAG_L_VALID

1 (bit 0) 左上角 x 值有效

返回类型:

bool

LINK_FLAG_T_VALID

2 (bit 1) 左上角 y 值有效

返回类型:

bool

LINK_FLAG_R_VALID

4 (bit 2) 右下角 x 值有效

返回类型:

bool

LINK_FLAG_B_VALID

8 (bit 3) 右下角 y 值有效

返回类型:

bool

LINK_FLAG_FIT_H

16 (bit 4) 水平适合

返回类型:

bool

LINK_FLAG_FIT_V

32 (bit 5) 垂直适合

返回类型:

bool

LINK_FLAG_R_IS_ZOOM

64 (bit 6) 右下角 x 是一个缩放图。

返回类型:

bool

注释相关常量

详细内容请参阅 Adobe PDF References 第 8.4.5 章,第 615 页。

注释类型

这些标识符还涵盖链接小部件:PDF 规范在技术上以相同的方式处理它们,而MuPDF(和 PyMuPDF)将它们视为三种基本不同的对象类型。

PDF_ANNOT_TEXT 0
PDF_ANNOT_LINK 1  # <=== Link object in PyMuPDF
PDF_ANNOT_FREE_TEXT 2
PDF_ANNOT_LINE 3
PDF_ANNOT_SQUARE 4
PDF_ANNOT_CIRCLE 5
PDF_ANNOT_POLYGON 6
PDF_ANNOT_POLY_LINE 7
PDF_ANNOT_HIGHLIGHT 8
PDF_ANNOT_UNDERLINE 9
PDF_ANNOT_SQUIGGLY 10
PDF_ANNOT_STRIKE_OUT 11
PDF_ANNOT_REDACT 12
PDF_ANNOT_STAMP 13
PDF_ANNOT_CARET 14
PDF_ANNOT_INK 15
PDF_ANNOT_POPUP 16
PDF_ANNOT_FILE_ATTACHMENT 17
PDF_ANNOT_SOUND 18
PDF_ANNOT_MOVIE 19
PDF_ANNOT_RICH_MEDIA 20
PDF_ANNOT_WIDGET 21  # <=== Widget object in PyMuPDF
PDF_ANNOT_SCREEN 22
PDF_ANNOT_PRINTER_MARK 23
PDF_ANNOT_TRAP_NET 24
PDF_ANNOT_WATERMARK 25
PDF_ANNOT_3D 26
PDF_ANNOT_PROJECTION 27
PDF_ANNOT_UNKNOWN -1 
```  ### 注释标志位

```py
PDF_ANNOT_IS_INVISIBLE 1 << (1-1)
PDF_ANNOT_IS_HIDDEN 1 << (2-1)
PDF_ANNOT_IS_PRINT 1 << (3-1)
PDF_ANNOT_IS_NO_ZOOM 1 << (4-1)
PDF_ANNOT_IS_NO_ROTATE 1 << (5-1)
PDF_ANNOT_IS_NO_VIEW 1 << (6-1)
PDF_ANNOT_IS_READ_ONLY 1 << (7-1)
PDF_ANNOT_IS_LOCKED 1 << (8-1)
PDF_ANNOT_IS_TOGGLE_NO_VIEW 1 << (9-1)
PDF_ANNOT_IS_LOCKED_CONTENTS 1 << (10-1) 
```  ### 注释行结束样式

```py
PDF_ANNOT_LE_NONE 0
PDF_ANNOT_LE_SQUARE 1
PDF_ANNOT_LE_CIRCLE 2
PDF_ANNOT_LE_DIAMOND 3
PDF_ANNOT_LE_OPEN_ARROW 4
PDF_ANNOT_LE_CLOSED_ARROW 5
PDF_ANNOT_LE_BUTT 6
PDF_ANNOT_LE_R_OPEN_ARROW 7
PDF_ANNOT_LE_R_CLOSED_ARROW 8
PDF_ANNOT_LE_SLASH 9 
```  ### 注释类型

这些标识符也涵盖了**链接**和**小部件**:PDF 规范在技术上以相同的方式处理它们,而**MuPDF**(以及 PyMuPDF)将它们视为基本上不同类型的对象。

```py
PDF_ANNOT_TEXT 0
PDF_ANNOT_LINK 1  # <=== Link object in PyMuPDF
PDF_ANNOT_FREE_TEXT 2
PDF_ANNOT_LINE 3
PDF_ANNOT_SQUARE 4
PDF_ANNOT_CIRCLE 5
PDF_ANNOT_POLYGON 6
PDF_ANNOT_POLY_LINE 7
PDF_ANNOT_HIGHLIGHT 8
PDF_ANNOT_UNDERLINE 9
PDF_ANNOT_SQUIGGLY 10
PDF_ANNOT_STRIKE_OUT 11
PDF_ANNOT_REDACT 12
PDF_ANNOT_STAMP 13
PDF_ANNOT_CARET 14
PDF_ANNOT_INK 15
PDF_ANNOT_POPUP 16
PDF_ANNOT_FILE_ATTACHMENT 17
PDF_ANNOT_SOUND 18
PDF_ANNOT_MOVIE 19
PDF_ANNOT_RICH_MEDIA 20
PDF_ANNOT_WIDGET 21  # <=== Widget object in PyMuPDF
PDF_ANNOT_SCREEN 22
PDF_ANNOT_PRINTER_MARK 23
PDF_ANNOT_TRAP_NET 24
PDF_ANNOT_WATERMARK 25
PDF_ANNOT_3D 26
PDF_ANNOT_PROJECTION 27
PDF_ANNOT_UNKNOWN -1 

注释标志位

PDF_ANNOT_IS_INVISIBLE 1 << (1-1)
PDF_ANNOT_IS_HIDDEN 1 << (2-1)
PDF_ANNOT_IS_PRINT 1 << (3-1)
PDF_ANNOT_IS_NO_ZOOM 1 << (4-1)
PDF_ANNOT_IS_NO_ROTATE 1 << (5-1)
PDF_ANNOT_IS_NO_VIEW 1 << (6-1)
PDF_ANNOT_IS_READ_ONLY 1 << (7-1)
PDF_ANNOT_IS_LOCKED 1 << (8-1)
PDF_ANNOT_IS_TOGGLE_NO_VIEW 1 << (9-1)
PDF_ANNOT_IS_LOCKED_CONTENTS 1 << (10-1) 

注释线结束样式

PDF_ANNOT_LE_NONE 0
PDF_ANNOT_LE_SQUARE 1
PDF_ANNOT_LE_CIRCLE 2
PDF_ANNOT_LE_DIAMOND 3
PDF_ANNOT_LE_OPEN_ARROW 4
PDF_ANNOT_LE_CLOSED_ARROW 5
PDF_ANNOT_LE_BUTT 6
PDF_ANNOT_LE_R_OPEN_ARROW 7
PDF_ANNOT_LE_R_CLOSED_ARROW 8
PDF_ANNOT_LE_SLASH 9 

小部件常量

小部件类型(field_type

PDF_WIDGET_TYPE_UNKNOWN 0
PDF_WIDGET_TYPE_BUTTON 1
PDF_WIDGET_TYPE_CHECKBOX 2
PDF_WIDGET_TYPE_COMBOBOX 3
PDF_WIDGET_TYPE_LISTBOX 4
PDF_WIDGET_TYPE_RADIOBUTTON 5
PDF_WIDGET_TYPE_SIGNATURE 6
PDF_WIDGET_TYPE_TEXT 7 

文本小部件子类型(text_format

PDF_WIDGET_TX_FORMAT_NONE 0
PDF_WIDGET_TX_FORMAT_NUMBER 1
PDF_WIDGET_TX_FORMAT_SPECIAL 2
PDF_WIDGET_TX_FORMAT_DATE 3
PDF_WIDGET_TX_FORMAT_TIME 4 

小部件标志位(field_flags

所有字段类型共同的

PDF_FIELD_IS_READ_ONLY 1
PDF_FIELD_IS_REQUIRED 1 << 1
PDF_FIELD_IS_NO_EXPORT 1 << 2 

文本小部件

PDF_TX_FIELD_IS_MULTILINE  1 << 12
PDF_TX_FIELD_IS_PASSWORD  1 << 13
PDF_TX_FIELD_IS_FILE_SELECT  1 << 20
PDF_TX_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_TX_FIELD_IS_DO_NOT_SCROLL  1 << 23
PDF_TX_FIELD_IS_COMB  1 << 24
PDF_TX_FIELD_IS_RICH_TEXT  1 << 25 

按钮小部件

PDF_BTN_FIELD_IS_NO_TOGGLE_TO_OFF  1 << 14
PDF_BTN_FIELD_IS_RADIO  1 << 15
PDF_BTN_FIELD_IS_PUSHBUTTON  1 << 16
PDF_BTN_FIELD_IS_RADIOS_IN_UNISON  1 << 25 

选择小部件

PDF_CH_FIELD_IS_COMBO  1 << 17
PDF_CH_FIELD_IS_EDIT  1 << 18
PDF_CH_FIELD_IS_SORT  1 << 19
PDF_CH_FIELD_IS_MULTI_SELECT  1 << 21
PDF_CH_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_CH_FIELD_IS_COMMIT_ON_SEL_CHANGE  1 << 26 

小部件类型(field_type

PDF_WIDGET_TYPE_UNKNOWN 0
PDF_WIDGET_TYPE_BUTTON 1
PDF_WIDGET_TYPE_CHECKBOX 2
PDF_WIDGET_TYPE_COMBOBOX 3
PDF_WIDGET_TYPE_LISTBOX 4
PDF_WIDGET_TYPE_RADIOBUTTON 5
PDF_WIDGET_TYPE_SIGNATURE 6
PDF_WIDGET_TYPE_TEXT 7 

文本小部件子类型(text_format

PDF_WIDGET_TX_FORMAT_NONE 0
PDF_WIDGET_TX_FORMAT_NUMBER 1
PDF_WIDGET_TX_FORMAT_SPECIAL 2
PDF_WIDGET_TX_FORMAT_DATE 3
PDF_WIDGET_TX_FORMAT_TIME 4 

小部件标志位(field_flags

所有字段类型共同的

PDF_FIELD_IS_READ_ONLY 1
PDF_FIELD_IS_REQUIRED 1 << 1
PDF_FIELD_IS_NO_EXPORT 1 << 2 

文本小部件

PDF_TX_FIELD_IS_MULTILINE  1 << 12
PDF_TX_FIELD_IS_PASSWORD  1 << 13
PDF_TX_FIELD_IS_FILE_SELECT  1 << 20
PDF_TX_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_TX_FIELD_IS_DO_NOT_SCROLL  1 << 23
PDF_TX_FIELD_IS_COMB  1 << 24
PDF_TX_FIELD_IS_RICH_TEXT  1 << 25 

按钮小部件

PDF_BTN_FIELD_IS_NO_TOGGLE_TO_OFF  1 << 14
PDF_BTN_FIELD_IS_RADIO  1 << 15
PDF_BTN_FIELD_IS_PUSHBUTTON  1 << 16
PDF_BTN_FIELD_IS_RADIOS_IN_UNISON  1 << 25 

选择小部件

PDF_CH_FIELD_IS_COMBO  1 << 17
PDF_CH_FIELD_IS_EDIT  1 << 18
PDF_CH_FIELD_IS_SORT  1 << 19
PDF_CH_FIELD_IS_MULTI_SELECT  1 << 21
PDF_CH_FIELD_IS_DO_NOT_SPELL_CHECK  1 << 22
PDF_CH_FIELD_IS_COMMIT_ON_SEL_CHANGE  1 << 26 

PDF 标准混合模式

有关说明,请参阅 Adobe PDF References,第 324 页:

PDF_BM_Color "Color"
PDF_BM_ColorBurn "ColorBurn"
PDF_BM_ColorDodge "ColorDodge"
PDF_BM_Darken "Darken"
PDF_BM_Difference "Difference"
PDF_BM_Exclusion "Exclusion"
PDF_BM_HardLight "HardLight"
PDF_BM_Hue "Hue"
PDF_BM_Lighten "Lighten"
PDF_BM_Luminosity "Luminosity"
PDF_BM_Multiply "Multiply"
PDF_BM_Normal "Normal"
PDF_BM_Overlay "Overlay"
PDF_BM_Saturation "Saturation"
PDF_BM_Screen "Screen"
PDF_BM_SoftLight "Softlight" 

图章注释图标

MuPDF 为橡皮图章注释定义了以下图标:

STAMP_Approved 0
STAMP_AsIs 1
STAMP_Confidential 2
STAMP_Departmental 3
STAMP_Experimental 4
STAMP_Expired 5
STAMP_Final 6
STAMP_ForComment 7
STAMP_ForPublicRelease 8
STAMP_NotApproved 9
STAMP_NotForPublicRelease 10
STAMP_Sold 11
STAMP_TopSecret 12
STAMP_Draft 13 

对此页面有任何反馈吗?


此软件按原样提供,不附带任何明示或暗示的保证。此软件根据许可证分发,未经许可不得复制、修改或分发。有关详细信息,请参阅 artifex.com 的许可信息或联系美国加利福尼亚州旧金山 Mesa 街 39 号 108A 室的 Artifex Software Inc。

此文档涵盖了所有版本直到 1.24.4。

Discord logo

色彩数据库

原文:pymupdf.readthedocs.io/en/latest/colors.html

自引入涉及颜色的方法(如Page.draw_circle())以来,可能需要访问预定义的颜色。

精美的 GUI 包wxPython具有超过 540 种预定义的 RGB 颜色数据库,这些颜色具有更多或更少可以记住的名称。其中不仅包括标准名称如“green”或“blue”,还有“turquoise”、“skyblue”以及 100(不仅仅是 50…)种“gray”等。

我们已经自由地复制了这个数据库(一个元组列表)修改为 PyMuPDF,并将其颜色作为 PDF 兼容的浮点三元组提供:对于 wxPython 的(“WHITE”, 255, 255, 255),我们返回(1, 1, 1),可以直接用于colorfill参数。我们还接受任何混合大小写的“wHiTe”以找到颜色。

函数getColor()

由于可能不经常需要颜色数据库,因此一个额外的导入语句似乎是可以接受的,以便访问它:

>>> # "getColor" is the only method you really need
>>> from pymupdf.utils import getColor
>>> getColor("aliceblue")
(0.9411764705882353, 0.9725490196078431, 1.0)
>>> #
>>> # to get a list of all existing names
>>> from pymupdf.utils import getColorList
>>> cl = getColorList()
>>> cl
['ALICEBLUE', 'ANTIQUEWHITE', 'ANTIQUEWHITE1', 'ANTIQUEWHITE2', 'ANTIQUEWHITE3',
'ANTIQUEWHITE4', 'AQUAMARINE', 'AQUAMARINE1'] ...
>>> #
>>> # to see the full integer color coding
>>> from pymupdf.utils import getColorInfoList
>>> il = getColorInfoList()
>>> il
[('ALICEBLUE', 240, 248, 255), ('ANTIQUEWHITE', 250, 235, 215),
('ANTIQUEWHITE1', 255, 239, 219), ('ANTIQUEWHITE2', 238, 223, 204),
('ANTIQUEWHITE3', 205, 192, 176), ('ANTIQUEWHITE4', 139, 131, 120),
('AQUAMARINE', 127, 255, 212), ('AQUAMARINE1', 127, 255, 212)] ... 

打印颜色数据库

如果您真的想看看有多少可用的颜色,可以使用示例目录中的脚本print by RGBprint by HSV。它们在相同的目录中创建 PDF 文件(已经存在),其中包含所有这些颜色。它们唯一的区别是排序顺序:一个按 RGB 值排序,另一个按色相-饱和度值作为排序标准。这是这些文件的屏幕打印样式。

_images/img-colordb.png您对本页有什么反馈吗?


此软件按原样提供,不带任何明示或暗示的担保。此软件在许可下分发,除非根据该许可明确授权,否则不得复制、修改或分发。请参阅artifex.com的许可信息,或联系美国加利福尼亚州旧金山 Mesa Street 39 号 108A 套房的 Artifex Software Inc.获取更多信息。

本文档覆盖所有版本直到 1.24.4。

Discord logo

函数getColor()

由于可能不经常需要颜色数据库,因此一个额外的导入语句似乎是可以接受的,以便访问它:

>>> # "getColor" is the only method you really need
>>> from pymupdf.utils import getColor
>>> getColor("aliceblue")
(0.9411764705882353, 0.9725490196078431, 1.0)
>>> #
>>> # to get a list of all existing names
>>> from pymupdf.utils import getColorList
>>> cl = getColorList()
>>> cl
['ALICEBLUE', 'ANTIQUEWHITE', 'ANTIQUEWHITE1', 'ANTIQUEWHITE2', 'ANTIQUEWHITE3',
'ANTIQUEWHITE4', 'AQUAMARINE', 'AQUAMARINE1'] ...
>>> #
>>> # to see the full integer color coding
>>> from pymupdf.utils import getColorInfoList
>>> il = getColorInfoList()
>>> il
[('ALICEBLUE', 240, 248, 255), ('ANTIQUEWHITE', 250, 235, 215),
('ANTIQUEWHITE1', 255, 239, 219), ('ANTIQUEWHITE2', 238, 223, 204),
('ANTIQUEWHITE3', 205, 192, 176), ('ANTIQUEWHITE4', 139, 131, 120),
('AQUAMARINE', 127, 255, 212), ('AQUAMARINE1', 127, 255, 212)] ... 

打印颜色数据库

如果您想实际看看许多可用颜色的外观,可以使用脚本 print by RGB 或者 print by HSV 在示例目录中。它们会创建 PDF 文件(已存在于同一目录中),展示所有这些颜色。它们唯一的区别在于排序顺序:一个按照 RGB 值排序,另一个按照色调-饱和度-亮度值排序。这是这些文件外观的屏幕截图。

_images/img-colordb.png您对本页面有任何反馈吗?


此软件按原样提供,没有明示或暗示的任何保证。此软件根据许可证分发,未经授权的情况下不得复制、修改或分发此软件。有关详细信息,请参阅 artifex.com 的许可信息或联系美国加利福尼亚州旧金山 Mesa Street 39 号 108A 套房的 Artifex Software Inc。

此文档涵盖了截至 1.24.4 版本的所有内容。

Discord logo

其他

附录 1:文本提取的详细信息

原文:pymupdf.readthedocs.io/en/latest/app1.html

本章介绍了 PyMuPDF 的文本提取方法背景。

感兴趣的信息包括

  • 它们提供了什么?

  • 它们意味着什么(处理时间/数据大小)?

TextPage 的一般结构

TextPage 是(Py-)MuPDF 的类之一。通常在使用 Page 文本提取方法时在幕后创建(和销毁),但也可以直接使用并且可以作为持久对象使用。除了其名称所示,图像也可以选择性地作为文本页面的一部分:

<page>
    <text block>
        <line>
            <span>
                <char>
    <image block>
        <img> 

一个文本页面由块(≈大致段落)组成。

一个由行及其字符或图像组成。

span组成。

一个span由具有相同字体属性的相邻字符组成:名称、大小、标志和颜色。

纯文本

函数TextPage.extractText()(或者Page.get_text(“text”))提取页面的原始顺序中的纯文本。

一个示例输出:

>>> print(page.get_text("text"))
Some text on first page. 

注意

输出可能与习惯的“自然”阅读顺序不一致。但是,您可以执行page.get_text("text", sort=True)请求按照“从左上到右下”的方案重新排序。

函数TextPage.extractBLOCKS()(或者Page.get_text(“blocks”))提取页面的文本块作为像这样的项目列表:

(x0, y0, x1, y1, "lines in block", block_no, block_type) 

前 4 个项目是块的浮点坐标。每个块内的行由换行符连接。

这是一种高速方法,默认情况下也会提取图像的元信息:每个图像显示为一个块,其中包含元信息的文本行。图像本身不会显示。

与上面的简单文本输出一样,也可以使用sort参数来获取阅读顺序。

示例输出:

>>> print(page.get_text("blocks", sort=False))
[(50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375,
'Some text on first page.', 0, 0)] 

单词

函数TextPage.extractWORDS()(或者Page.get_text(“words”))提取页面的文本单词作为像这样的项目列表:

(x0, y0, x1, y1, "word", block_no, line_no, word_no) 

前 4 个项目是单词的浮点 bbox 坐标。最后三个整数提供有关单词位置的更多信息。

这是一种高速方法。与前面的方法一样,参数sort=True将重新排序单词。

示例输出:

>>> for word in page.get_text("words", sort=False):
 print(word)
(50.0, 88.17500305175781, 78.73200225830078, 103.28900146484375,
'Some', 0, 0, 0)
(81.79000091552734, 88.17500305175781, 99.5219955444336, 103.28900146484375,
'text', 0, 0, 1)
(102.57999420166016, 88.17500305175781, 114.8119888305664, 103.28900146484375,
'on', 0, 0, 2)
(117.86998748779297, 88.17500305175781, 135.5909881591797, 103.28900146484375,
'first', 0, 0, 3)
(138.64898681640625, 88.17500305175781, 166.1709747314453, 103.28900146484375,
'page.', 0, 0, 4) 

HTML

TextPage.extractHTML()(或者Page.get_text(“html”)输出完整反映了TextPage页面的结构 - 就像下面的 DICT / JSON 一样。其中包括图像、字体信息和文本位置。如果包含在 HTML 头和尾部代码中,它可以被互联网浏览器轻松显示。我们上面的例子:

>>> for line in page.get_text("html").splitlines():
 print(line)

<div id="page0" style="position:relative;width:300pt;height:350pt;
background-color:white">
<p style="position:absolute;white-space:pre;margin:0;padding:0;top:88pt;
left:50pt"><span style="font-family:Helvetica,sans-serif;
font-size:11pt">Some text on first page.</span></p>
</div> 

控制 HTML 输出的质量

尽管 MuPDF v1.12.0 中的 HTML 输出已经有了很大改进,但还不是无 bug 的:我们在字体支持图像定位方面发现了问题。

  • HTML 文本包含对原始文档中使用的字体的引用。如果浏览器不认识这些字体(几乎不可能!),它将用其他字体替换它们;结果可能看起来很奇怪。这个问题因浏览器而异——在我的 Windows 机器上,MS Edge 表现得很好,而 Firefox 看起来很糟糕。

  • 对于具有复杂结构的 PDF 文件,图像可能无法正确地定位和/或调整大小。这在旋转页面和页面 bbox 变体不重合的情况下可能发生(例如MediaBox != CropBox)。我们还不知道如何解决这个问题——我们在 MuPDF 的网站上提交了一个 bug 报告。

要解决字体问题,您可以使用一个简单的实用脚本扫描 HTML 文件并替换字体引用。这里有一个小例子,将所有字体替换为 PDF 基本 14 种字体之一:有衬线字体将变成“Times”,非衬线字体将变成“Helvetica”,等宽字体将变成“Courier”。希望您的浏览器能够正确处理它们的粗体、斜体等变体:

import sys
filename = sys.argv[1]
otext = open(filename).read()                 # original html text string
pos1 = 0                                      # search start poition
font_serif = "font-family:Times"              # enter ...
font_sans  = "font-family:Helvetica"          # ... your choices ...
font_mono  = "font-family:Courier"            # ... here
found_one  = False                            # true if search successful

while True:
    pos0 = otext.find("font-family:", pos1)   # start of a font spec
    if pos0 < 0:                              # none found - we are done
        break
    pos1 = otext.find(";", pos0)              # end of font spec
    test = otext[pos0 : pos1]                 # complete font spec string
    testn = ""                                # the new font spec string
    if test.endswith(",serif"):               # font with serifs?
        testn = font_serif                    # use Times instead
    elif test.endswith(",sans-serif"):        # sans serifs font?
        testn = font_sans                     # use Helvetica
    elif test.endswith(",monospace"):         # monospaced font?
        testn = font_mono                     # becomes Courier

    if testn != "":                           # any of the above found?
        otext = otext.replace(test, testn)    # change the source
        found_one = True
        pos1 = 0                              # start over

if found_one:
    ofile = open(filename + ".html", "w")
    ofile.write(otext)
    ofile.close()
else:
    print("Warning: could not find any font specs!") 

DICT(或 JSON)

TextPage.extractDICT()(或 Page.get_text("dict", sort=False))输出完全反映了TextPage的结构,并为每个块、行和 span 提供了图像内容和位置详细信息(bbox——以像素为单位的边界框)。对于 DICT 输出,图像以bytes形式存储,而对于 JSON 输出,它们以 base64 编码字符串存储。

要查看字典输出结构的可视化,请查看字典输出的结构。

这是它的外观:

{
    "width": 300.0,
    "height": 350.0,
    "blocks": [{
        "type": 0,
        "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375),
        "lines": ({
            "wmode": 0,
            "dir": (1.0, 0.0),
            "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375),
            "spans": ({
                "size": 11.0,
                "flags": 0,
                "font": "Helvetica",
                "color": 0,
                "origin": (50.0, 100.0),
                "text": "Some text on first page.",
                "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375)
            })
        }]
    }]
} 

RAWDICT(或 RAWJSON)

TextPage.extractRAWDICT()(或 Page.get_text("rawdict", sort=False))是DICT的信息超集,将详细级别提升一步。它看起来与上面的完全相同,只是其中的“text”项目(string)在 spans 中被“chars”列表替换。每个“chars”条目都是一个字符dict。例如,以下是上述“text”: “Text in black color.”条目的替代内容:

"chars": [{
    "origin": (50.0, 100.0),
    "bbox": (50.0, 88.17500305175781, 57.336997985839844, 103.28900146484375),
    "c": "S"
}, {
    "origin": (57.33700180053711, 100.0),
    "bbox": (57.33700180053711, 88.17500305175781, 63.4530029296875, 103.28900146484375),
    "c": "o"
}, {
    "origin": (63.4530029296875, 100.0),
    "bbox": (63.4530029296875, 88.17500305175781, 72.61600494384766, 103.28900146484375),
    "c": "m"
}, {
    "origin": (72.61600494384766, 100.0),
    "bbox": (72.61600494384766, 88.17500305175781, 78.73200225830078, 103.28900146484375),
    "c": "e"
}, {
    "origin": (78.73200225830078, 100.0),
    "bbox": (78.73200225830078, 88.17500305175781, 81.79000091552734, 103.28900146484375),
    "c": " "
< ... deleted ... >
}, {
    "origin": (163.11297607421875, 100.0),
    "bbox": (163.11297607421875, 88.17500305175781, 166.1709747314453, 103.28900146484375),
    "c": "."
}], 

XML

TextPage.extractXML()(或 Page.get_text("xml"))版本提取了没有图像的文本,详细级别与 RAWDICT 相同:

>>> for line in page.get_text("xml").splitlines():
 print(line)

<page id="page0" width="300" height="350">
<block bbox="50 88.175 166.17098 103.289">
<line bbox="50 88.175 166.17098 103.289" wmode="0" dir="1 0">
<font name="Helvetica" size="11">
<char quad="50 88.175 57.336999 88.175 50 103.289 57.336999 103.289" x="50"
y="100" color="#000000" c="S"/>
<char quad="57.337 88.175 63.453004 88.175 57.337 103.289 63.453004 103.289" x="57.337"
y="100" color="#000000" c="o"/>
<char quad="63.453004 88.175 72.616008 88.175 63.453004 103.289 72.616008 103.289" x="63.453004"
y="100" color="#000000" c="m"/>
<char quad="72.616008 88.175 78.732 88.175 72.616008 103.289 78.732 103.289" x="72.616008"
y="100" color="#000000" c="e"/>
<char quad="78.732 88.175 81.79 88.175 78.732 103.289 81.79 103.289" x="78.732"
y="100" color="#000000" c=" "/>

... deleted ...

<char quad="163.11298 88.175 166.17098 88.175 163.11298 103.289 166.17098 103.289" x="163.11298"
y="100" color="#000000" c="."/>
</font>
</line>
</block>
</page> 

注意

我们已经成功测试了lxml来解释此输出。

XHTML

TextPage.extractXHTML()(或 Page.get_text("xhtml"))是 TEXT 的 HTML 格式变体,包含裸文本和图像(“语义”输出):

<div id="page0">
<p>Some text on first page.</p>
</div> 

文本提取标志的默认值

  • 新增于版本 1.16.2:方法 Page.get_text() 支持关键参数 flags(整数),以控制提取数据的量和质量。下表显示了每个提取变体的默认设置(省略或设为 None 的 flags 参数)。如果指定的 flags 值不为 None,请确保设置 所有所需的 选项。有关各位设置的描述,请参阅 Text Extraction Flags。

  • 新增于 v1.19.6:以下表格中的默认组合现在可作为 Python 常量使用:TEXTFLAGS_TEXTTEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_SEARCH。现在,您可以轻松修改默认标志,例如:

    • 包括 图片在“块”输出中:

    flags = TEXTFLAGS_BLOCKS | TEXT_PRESERVE_IMAGES

    • 不包括 图片在“字典”输出中:

    flags = TEXTFLAGS_DICT & ~TEXT_PRESERVE_IMAGES

    • 在文本搜索中关闭 去连字符 选项:

    flags = TEXTFLAGS_SEARCH & ~TEXT_DEHYPHENATE

指示符 文本 html xhtml xml 字典 原始字典 单词 搜索
保留连字 1 1 1 1 1 1 1 1 1
保留空格 1 1 1 1 1 1 1 1 1
保留图片 n/a 1 1 n/a 1 1 n/a 0 0
抑制空格 0 0 0 0 0 0 0 0 0
取消连字符 0 0 0 0 0 0 0 0 1
剪裁至媒体框 1 1 1 1 1 1 1 1 1
使用 CID 而非 U+FFFD 1 1 1 1 1 1 1 1 0
  • 搜索 指的是文本搜索功能。

  • “json” 的处理与 “dict” 完全相同,因此被省略。

  • “rawjson” 的处理与 “rawdict” 完全相同,因此被省略。

  • “n/a” 指定意味着值为 0,设置此位不会对输出产生任何影响(但会影响性能)。

  • 如果您在使用默认包含图像的输出变体时对图像不感兴趣,那么请务必关闭相应的位:这将提升性能并大大减少空间需求。

要查看 TEXT_INHIBIT_SPACES 的效果,请看这个例子:

>>> print(page.get_text("text"))
H a l l o !
Mo r e  t e x t
i s  f o l l o w i n g
i n  E n g l i s h
. . .  l e t ' s  s e e
w h a t  h a p p e n s .
>>> print(page.get_text("text", flags=pymupdf.TEXT_INHIBIT_SPACES))
Hallo!
More text
is following
in English
... let's see
what happens.
>>> 

性能

文本提取方法在提供的信息和资源需求及运行时间方面存在显著差异。通常,更多信息意味着需要更多处理和生成更高的数据量。

注意

特别是图像对结果有非常显著的影响。确保在不需要时排除它们(通过flags参数)。处理下述提到的 2,700 页总页数使用默认标志设置需要 160 秒。当排除所有图像时,仅需要这些时间的不到 50%(77 秒)。

首先,与市场上其他产品相比,所有方法在处理速度上都非常快。就处理速度而言,我们不知道有比这个更快的(免费)工具。即使是最详细的方法,如 RAWDICT,在不到 5 秒的时间内处理完所有 1,310 页的 Adobe PDF 参考手册(简单文本在这里不到 2 秒)。

下表显示了平均相对速度(“RSpeed”,基准为 1.00 为 TEXT),涵盖了约 1,400 页文本密集和 1,300 页图像密集的页面。

Method RSpeed 评论 没有图像
TEXT 1.00 没有图像,普通文本,换行 1.00
BLOCKS 1.00 图像边界框(仅),级文本与边界框,换行 1.00
WORDS 1.02 没有图像,级文本与边界框 1.02
XML 2.72 没有图像,字符级文本,布局和字体细节 2.72
XHTML 3.32 base64图像,跨度级文本,无布局信息 1.00
HTML 3.54 base64图像,跨度级文本,布局和字体细节 1.01
DICT 3.93 二进制图像,跨度级文本,布局和字体细节 1.04
RAWDICT 4.50 二进制图像,字符级文本,布局和字体细节 1.68

如前所述:在排除图像提取(最后一列)时,相对速度发生了显著变化:除了 RAWDICT 和 XML 外,其他方法几乎同样快,而 RAWDICT 比现在最慢的 XML需要少 40%的执行时间。

查看附录 1章节获取更多性能信息。

对本页有任何反馈吗?


本软件按原样提供,不带任何明示或暗示的保证。本软件在许可下分发,未经授权不得复制、修改或分发。有关详细信息,请参阅artifex.com的许可信息或联系位于美国旧金山 94129 号,Mesa 街 39 号,108A 套房的 Artifex Software Inc。

此文档覆盖了所有 1.24.4 版本。

Discord logo

TextPage 的一般结构

TextPage 是(Py-)MuPDF 的类之一。通常在使用 Page 文本提取方法时在幕后创建(和销毁),但也可以直接使用,并可用作持久对象。除了其名称暗示的,图像也可以选择作为文本页的一部分:

<page>
    <text block>
        <line>
            <span>
                <char>
    <image block>
        <img> 

文本页由块组成(≈ 段落)。

由行及其字符或图像组成。

由跨度组成。

跨度由具有相同字体属性的相邻字符组成:名称、大小、标志和颜色。

纯文本

函数TextPage.extractText()(或Page.get_text(“text”))提取页面按文档创建者指定的原始顺序的纯文本。

示例输出:

>>> print(page.get_text("text"))
Some text on first page. 

注意

输出可能与习惯的“自然”阅读顺序不同。然而,您可以通过执行page.get_text("text", sort=True)请求按照“从左上到右下”的方案重新排序。

BLOCKS

函数TextPage.extractBLOCKS()(或Page.get_text(“blocks”))提取页面的文本块作为项目列表,如下所示:

(x0, y0, x1, y1, "lines in block", block_no, block_type) 

前 4 个项目是块边界框的浮点坐标。每个块内的行通过换行符连接。

这是一种高速方法,默认情况下还提取图像元信息:每个图像都显示为包含元信息的一行文本块。图像本身不会显示。

与上述简单文本输出一样,sort参数也可以用来获取阅读顺序。

示例输出:

>>> print(page.get_text("blocks", sort=False))
[(50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375,
'Some text on first page.', 0, 0)] 

WORDS

函数TextPage.extractWORDS()(或Page.get_text(“words”))提取页面的文本单词作为项目列表,如下所示:

(x0, y0, x1, y1, "word", block_no, line_no, word_no) 

前 4 个项目是单词边界框的浮点坐标。最后三个整数提供有关单词位置的更多信息。

这是一种高速方法。与之前的方法一样,使用参数sort=True将重新排序单词。

示例输出:

>>> for word in page.get_text("words", sort=False):
 print(word)
(50.0, 88.17500305175781, 78.73200225830078, 103.28900146484375,
'Some', 0, 0, 0)
(81.79000091552734, 88.17500305175781, 99.5219955444336, 103.28900146484375,
'text', 0, 0, 1)
(102.57999420166016, 88.17500305175781, 114.8119888305664, 103.28900146484375,
'on', 0, 0, 2)
(117.86998748779297, 88.17500305175781, 135.5909881591797, 103.28900146484375,
'first', 0, 0, 3)
(138.64898681640625, 88.17500305175781, 166.1709747314453, 103.28900146484375,
'page.', 0, 0, 4) 

HTML

TextPage.extractHTML()(或Page.get_text(“html”))完全反映了页面的TextPage结构,类似于下面的 DICT / JSON。这包括图像、字体信息和文本位置。如果包含在 HTML 头部和尾部代码中,它可以轻松地被互联网浏览器显示。我们的上述示例:

>>> for line in page.get_text("html").splitlines():
 print(line)

<div id="page0" style="position:relative;width:300pt;height:350pt;
background-color:white">
<p style="position:absolute;white-space:pre;margin:0;padding:0;top:88pt;
left:50pt"><span style="font-family:Helvetica,sans-serif;
font-size:11pt">Some text on first page.</span></p>
</div> 

控制 HTML 输出的质量

尽管 HTML 输出在 MuPDF v1.12.0 中有了很大改进,但仍不是无 bug 的:我们发现了字体支持图像定位方面的问题。

  • HTML 文本包含对原始文档使用的字体的引用。如果浏览器不知道这些字体(几乎不可能!),它将用其他字体替换它们;结果可能看起来很奇怪。这个问题在不同的浏览器上差异很大——在我的 Windows 机器上,MS Edge 工作得很好,而 Firefox 看起来很糟糕。

  • 对于结构复杂的 PDF,图像可能无法正确定位和/或调整大小。这似乎是旋转页面和页面等情况的问题,其中各种可能的页面 bbox 变体不重合(例如MediaBox != CropBox)。我们尚不清楚如何解决这个问题——我们在 MuPDF 的网站上报告了一个错误。

要解决字体问题,您可以使用一个简单的实用程序脚本扫描 HTML 文件并替换字体引用。这里有一个小例子,将所有字体替换为 PDF 基本 14 字体之一:有衬线字体将成为“Times”,无衬线字体将成为“Helvetica”,等宽字体将成为“Courier”。希望您的浏览器能够正确处理它们的粗体、斜体等变体:

import sys
filename = sys.argv[1]
otext = open(filename).read()                 # original html text string
pos1 = 0                                      # search start poition
font_serif = "font-family:Times"              # enter ...
font_sans  = "font-family:Helvetica"          # ... your choices ...
font_mono  = "font-family:Courier"            # ... here
found_one  = False                            # true if search successful

while True:
    pos0 = otext.find("font-family:", pos1)   # start of a font spec
    if pos0 < 0:                              # none found - we are done
        break
    pos1 = otext.find(";", pos0)              # end of font spec
    test = otext[pos0 : pos1]                 # complete font spec string
    testn = ""                                # the new font spec string
    if test.endswith(",serif"):               # font with serifs?
        testn = font_serif                    # use Times instead
    elif test.endswith(",sans-serif"):        # sans serifs font?
        testn = font_sans                     # use Helvetica
    elif test.endswith(",monospace"):         # monospaced font?
        testn = font_mono                     # becomes Courier

    if testn != "":                           # any of the above found?
        otext = otext.replace(test, testn)    # change the source
        found_one = True
        pos1 = 0                              # start over

if found_one:
    ofile = open(filename + ".html", "w")
    ofile.write(otext)
    ofile.close()
else:
    print("Warning: could not find any font specs!") 

DICT(或 JSON)

TextPage.extractDICT()(或Page.get_text(“dict”, sort=False))的输出完全反映了TextPage的结构,并为每个块、行和跨度提供图像内容和位置详细信息(bbox——以像素为单位的边界框)。图像以字典输出的形式存储,并且以 JSON 输出的形式进行 base64 编码。

若要查看字典输出结构的可视化,请参阅字典输出结构。

这是它的外观:

{
    "width": 300.0,
    "height": 350.0,
    "blocks": [{
        "type": 0,
        "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375),
        "lines": ({
            "wmode": 0,
            "dir": (1.0, 0.0),
            "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375),
            "spans": ({
                "size": 11.0,
                "flags": 0,
                "font": "Helvetica",
                "color": 0,
                "origin": (50.0, 100.0),
                "text": "Some text on first page.",
                "bbox": (50.0, 88.17500305175781, 166.1709747314453, 103.28900146484375)
            })
        }]
    }]
} 

RAWDICT(或 RAWJSON)

TextPage.extractRAWDICT()(或Page.get_text(“rawdict”, sort=False))是DICT 的信息超集,并进一步深入到详细级别。它的外观与上述完全相同,只是“text”项(string)在跨度中被“chars”列表替换。每个“chars”条目都是一个字符dict。例如,这是上面示例中“text”: “Text in black color.”的替代内容:

"chars": [{
    "origin": (50.0, 100.0),
    "bbox": (50.0, 88.17500305175781, 57.336997985839844, 103.28900146484375),
    "c": "S"
}, {
    "origin": (57.33700180053711, 100.0),
    "bbox": (57.33700180053711, 88.17500305175781, 63.4530029296875, 103.28900146484375),
    "c": "o"
}, {
    "origin": (63.4530029296875, 100.0),
    "bbox": (63.4530029296875, 88.17500305175781, 72.61600494384766, 103.28900146484375),
    "c": "m"
}, {
    "origin": (72.61600494384766, 100.0),
    "bbox": (72.61600494384766, 88.17500305175781, 78.73200225830078, 103.28900146484375),
    "c": "e"
}, {
    "origin": (78.73200225830078, 100.0),
    "bbox": (78.73200225830078, 88.17500305175781, 81.79000091552734, 103.28900146484375),
    "c": " "
< ... deleted ... >
}, {
    "origin": (163.11297607421875, 100.0),
    "bbox": (163.11297607421875, 88.17500305175781, 166.1709747314453, 103.28900146484375),
    "c": "."
}], 

XML

TextPage.extractXML()(或Page.get_text(“xml”))版本提取了具有 RAW 字典详细级别的文本(无图像):

>>> for line in page.get_text("xml").splitlines():
 print(line)

<page id="page0" width="300" height="350">
<block bbox="50 88.175 166.17098 103.289">
<line bbox="50 88.175 166.17098 103.289" wmode="0" dir="1 0">
<font name="Helvetica" size="11">
<char quad="50 88.175 57.336999 88.175 50 103.289 57.336999 103.289" x="50"
y="100" color="#000000" c="S"/>
<char quad="57.337 88.175 63.453004 88.175 57.337 103.289 63.453004 103.289" x="57.337"
y="100" color="#000000" c="o"/>
<char quad="63.453004 88.175 72.616008 88.175 63.453004 103.289 72.616008 103.289" x="63.453004"
y="100" color="#000000" c="m"/>
<char quad="72.616008 88.175 78.732 88.175 72.616008 103.289 78.732 103.289" x="72.616008"
y="100" color="#000000" c="e"/>
<char quad="78.732 88.175 81.79 88.175 78.732 103.289 81.79 103.289" x="78.732"
y="100" color="#000000" c=" "/>

... deleted ...

<char quad="163.11298 88.175 166.17098 88.175 163.11298 103.289 166.17098 103.289" x="163.11298"
y="100" color="#000000" c="."/>
</font>
</line>
</block>
</page> 

注意

我们已成功测试了lxml来解释这个输出。

XHTML

TextPage.extractXHTML()(或Page.get_text(“xhtml”))是 TEXT 的一种变体,但以 HTML 格式呈现,包含裸文本和图像(“语义”输出):

<div id="page0">
<p>Some text on first page.</p>
</div> 

文本提取标志默认值

  • 从版本 1.16.2 开始:方法Page.get_text() 支持关键参数 flags (int) 以控制提取数据的数量和质量。以下表格显示了每个提取变体的默认设置(省略了 flags 参数或设为 None)。如果您指定了除 None 以外的值的 flags,请注意您必须设置所有所需的选项。有关各位设置的描述,请参见文本提取标志。

  • 从版本 v1.19.6 开始:以下表中的默认组合现在作为 Python 常量提供:TEXTFLAGS_TEXT, TEXTFLAGS_WORDS, TEXTFLAGS_BLOCKS, TEXTFLAGS_DICT, TEXTFLAGS_RAWDICT, TEXTFLAGS_HTML, TEXTFLAGS_XHTML, TEXTFLAGS_XML, 和 TEXTFLAGS_SEARCH。现在您可以轻松修改默认标志,例如:

    • 在“blocks”输出中包含图像:

    flags = TEXTFLAGS_BLOCKS | TEXT_PRESERVE_IMAGES

    • 在“dict”输出中排除图像:

    flags = TEXTFLAGS_DICT & ~TEXT_PRESERVE_IMAGES

    • 在文本搜索中关闭连字化

    flags = TEXTFLAGS_SEARCH & ~TEXT_DEHYPHENATE

指示符 文本 html xhtml xml dict rawdict 词语 搜索
保留连字 1 1 1 1 1 1 1 1 1
保留空白 1 1 1 1 1 1 1 1 1
保留图像 n/a 1 1 n/a 1 1 n/a 0 0
禁止空格 0 0 0 0 0 0 0 0 0
连字化 0 0 0 0 0 0 0 0 1
剪切到 mediabox 1 1 1 1 1 1 1 1 1
使用 CID 而非 U+FFFD 1 1 1 1 1 1 1 1 0
  • 搜索 是指文本搜索功能。

  • “json”“dict” 处理方式完全相同,因此被省略。

  • “rawjson”“rawdict” 处理方式完全相同,因此被省略。

  • “n/a” 规范意味着值为 0,并且设置此位对输出没有任何影响(但对性能有不利影响)。

  • 如果在使用默认包含图像的输出变体时不对图像感兴趣,那么请务必关闭相应的位:您将体验到更好的性能和更低的空间需求。

要查看TEXT_INHIBIT_SPACES 的效果,请参考以下示例:

>>> print(page.get_text("text"))
H a l l o !
Mo r e  t e x t
i s  f o l l o w i n g
i n  E n g l i s h
. . .  l e t ' s  s e e
w h a t  h a p p e n s .
>>> print(page.get_text("text", flags=pymupdf.TEXT_INHIBIT_SPACES))
Hallo!
More text
is following
in English
... let's see
what happens.
>>> 

性能

文本提取方法在提供的信息量、资源需求和运行时间方面有显著差异。显然,提供更多信息意味着需要更多的处理和生成更大的数据量。

特别是图像对性能有非常显著的影响。确保在不需要时(通过flags参数)将其排除。在默认标志设置下处理下述提到的 2700 页总共需要 160 秒。当所有图像都排除时,只需要不到这个时间的一半(77 秒)。

首先,所有方法在市场上相比其他产品非常快。就处理速度而言,我们不知道有比这更快的(免费)工具。即使是最详细的方法 RAW 字典,在不到 5 秒的时间内就可以处理完所有 1,310 页的 Adobe PDF 参考手册(简单文本只需不到 2 秒)。

下表显示了平均相对速度(“RSpeed”,基准为 1.00 是 TEXT),涵盖了约 1400 页文本密集和 1300 页图像密集的页面。

Method RSpeed Comments 无图像
TEXT 1.00 无图像,普通文本,换行符 1.00
BLOCKS 1.00 图像边界框(仅限),级文本和边界框,换行符 1.00
WORDS 1.02 无图像,单词级文本和边界框 1.02
XML 2.72 无图像,字符级文本,布局和字体详细信息 2.72
XHTML 3.32 base64图像,跨度级文本,无布局信息 1.00
HTML 3.54 base64图像,跨度级文本,布局和字体详细信息 1.01
DICT 3.93 二进制图像,跨度级文本,布局和字体详细信息 1.04
RAWDICT 4.50 二进制图像,字符级文本,布局和字体详细信息 1.68

如前所述:当排除图像提取(最后一列)时,相对速度会发生显著变化:除了 RAWDICT 和 XML 外,其他方法几乎同样快,而 RAWDICT 的执行时间比现在最慢的 XML 要少 40%。

查看附录 1 章节获取更多性能信息。

对本页有任何反馈吗?


本软件按原样提供,不附带任何明示或暗示的保证。本软件根据许可分发,未经授权不得复制、修改或分发。请参考artifex.com获取许可信息或联系 Artifex Software Inc., 39 Mesa Street, Suite 108A, San Francisco CA 94129, United States 获取更多信息。

本文档涵盖了所有 1.24.4 版本及其之前的版本。

Discord logo

posted @   绝不原创的飞龙  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示