使用mupdf处理PDF中的文字

您所在的位置:网站首页 word半个字符如何对齐 使用mupdf处理PDF中的文字

使用mupdf处理PDF中的文字

2023-06-13 05:34| 来源: 网络整理| 查看: 265

如何提取所有文档文本

该脚本将采用文档文件名并从其所有文本生成一个文本文件。

文档可以是任何受支持的类型,如 PDF、XPS 等。

该脚本作为命令行工具工作,需要将文档文件名作为参数提供。它在脚本目录中生成一个名为“filename.txt”的文本文件。页面文本由换页符分隔:

输出将是文档中编码的纯文本。没有任何方式美化。特别是对于 PDF,这可能意味着输出不符合通常的阅读顺序、意外的换行符等。

您有多种选择来纠正此问题 - 其中包括:

提取 HTML 格式的文本并将其存储为 HTML 文档,以便可以在任何浏览器中查看。

通过Page.get_text(“blocks”)将文本提取为文本块列表。该列表的每一项都包含其文本的位置信息,可用于建立方便的阅读顺序。

通过Page.get_text(“words”)提取单个单词的列表。它的项目是带有位置信息的单词。使用它来确定给定矩形中包含的文本——请参阅下一节。

如何从页面中提取键值对

如果页面布局在某种意义上是“可预测的” ,那么有一种简单的方法可以快速轻松地找到一组给定关键字的值——无需使用正则表达式。

在这种情况下,“可预测”是指:

每个关键字后面都有它的值——它们之间没有其他文本。

值边界框的底部不在关键字之一之上。

没有其他限制:页面布局可以固定也可以不固定,文本也可以存储为一个字符串。键和值之间可以有任何距离。

如何以自然阅读顺序提取文本

PDF 文本提取的一个常见问题是,文本可能不会以任何特定的阅读顺序出现。

这是 PDF 创建者(软件或人)的责任。例如,页眉可能是在单独的步骤中插入的——在文档生成之后。在这种情况下,页眉文本将出现在页面文本提取的末尾(尽管它会被 PDF 查看器软件正确显示)。例如,以下代码片段将向现有 PDF 添加一些页眉和页脚行:

从以这种方式修改的页面中提取的文本序列:原文、标题行、页脚行

PyMuPDF 有几种方法可以重新建立一些阅读顺序,甚至可以重新生成接近原始的布局:

使用sort参数Page.get_text(). 它将输出从左上角到右下角排序(对于 XHTML、HTML 和 XML 输出忽略)。

fitz在 CLI: 中使用该模块,它会生成一个文本文件,其中的文本以保留布局的模式重新排列。许多选项可用于控制输出。python -m fitz gettext ...

如何从文档中提取表格内容

如果您在文档中看到一个表格,您通常不会看到类似嵌入式 Excel 或其他可识别对象的东西。它通常只是文本,经过格式化以适当显示。

因此,从这样的页面区域中提取表格数据意味着您必须找到一种方法来(1)以图形方式指示表格和列的边框,以及(2)然后根据此信息提取文本。

wxPython GUI 脚本extract.py努力做到这一点。您可能想看一下并根据自己的喜好进行调整。

如何标记提取的文本

有一个标准的搜索功能可以搜索页面上的任意文本:Page.search_for()。它返回围绕找到的事件的Rect对象列表。例如,这些矩形可用于自动插入明显标记找到的文本的注释。

这种方法有优点也有缺点。优点是:

搜索字符串可以包含空格并换行

大写或小写字符被同等对待

检测并解决行尾的单词断字

Return 也可以是Quad对象的列表,以精确定位不平行于任一轴的文本——当页面旋转不为零时,也建议使用Quad输出。

但您还有其他选择:

此脚本用于Page.get_text("words")查找通过 cli 参数提交的字符串。此方法使用空格和换行符作为分隔符将页面的文本分隔为“单词”。进一步说明:

如果找到,则包含该字符串的完整单词会被标记(加下划线)——而不仅仅是搜索字符串。

搜索字符串不能包含空格或其他空格。

如此处所示,尊重大写/小写。但这可以通过在函数mark_word中使用字符串方法lower()(甚至正则表达式)来改变。

没有上限:所有的事件都会被检测到。

您可以使用任何东西来标记单词:'Underline'、'Highlight'、'StrikeThrough' 或 'Square' 注释等。

这是本手册页面的示例片段,其中“MuPDF”已用作搜索字符串。请注意,所有包含“MuPDF”的字符串都带有下划线(不仅仅是搜索字符串)。

如何标记搜索到的文本

搜索文本并对其进行标记:

如何标记非水平文本

使用“dict”/“rawdict”选项的文本提取Page.get_text()也可能返回与 x 轴成非零角度的文本。这由线字典的键的值表示:它是那个角度的"dir"元组。如果,则其所有跨度的文本旋转(相同)角度 != 0。(cosine, sine)line["dir"] != (1, 0)

然而,该方法返回的“bboxes”只是矩形——不是四边形。因此,要正确标记跨度文本,必须从行和跨度字典中包含的数据中恢复其四边形。使用以下实用程序函数(v1.18.9 中的新功能)执行此操作:

如果要一次性标记完整行或其跨度的子集,请使用以下代码段

上面的参数spans可以指定 的任何子列表line["spans"]。在上面的示例中,标记了倒数第二个跨度。如果省略,则采用完整的行。

如何分析字体特征

要分析 PDF 中文本的特征,请使用此基本脚本作为起点:

如何插入文本

PyMuPDF 提供了在新的或现有的 PDF 页面上插入文本的方法,具有以下功能:

选择字体,包括内置字体和作为文件提供的字体

选择文本特征,如粗体、斜体、字体大小、字体颜色等。

以多种方式定位文本:

作为从某一点开始的简单的面向行的输出,

或在以矩形形式提供的框中放置文本,在这种情况下也可以选择文本对齐方式,

选择文本是否应置于前景(覆盖现有内容),

所有文本都可以任意“变形”,即可以通过Matrix更改其外观,以实现缩放、剪切或镜像等效果,

独立于变形,除此之外,文本可以旋转 90 度的整数倍

Page.insert_font()– 为页面安装字体以供以后参考。结果反映在 的输出中Document.get_page_fonts()。字体可以是:

作为文件提供,

通过字体(然后使用Font.buffer)

已经出现在这个或另一个PDF 中的某处,或者

成为内置字体。

Page.insert_text()– 写几行文字。在内部,这使用Shape.insert_text().

Page.insert_textbox()– 使文本适合给定的矩形。您可以在此处选择文本对齐功能(左对齐、右对齐、居中对齐、两端对齐),并控制文本是否真正适合。在内部,这使用Shape.insert_textbox().

两种文本插入方法都会根据需要自动安装字体。

如何编写文本行

在页面上输出一些文本行:

使用这种方法,只会控制行数不超过页面高度。多余的行不会写入,返回实际行数。该计算使用根据字体大小计算的行高和 36 点(0.5 英寸)作为下边距。

忽略线宽。一条线的多余部分将完全不可见。

但是,对于内置字体,有一些方法可以预先计算线宽 - 请参阅get_text_length()。

这是另一个例子。它使用四种不同的旋转选项插入 4 个文本字符串,从而解释了必须如何选择文本插入点才能获得所需的结果:

如何填充文本框

此脚本用文本填充 4 个不同的矩形,每次选择不同的旋转值:

上面使用了几个默认值:字体“Helvetica”、字体大小 11 和文本对齐“左”。结果将如下所示:

如何使用非标准编码

从 v1.14 开始,MuPDF 允许Base14_Fonts. 在 PyMuPDF 中,这是通过一个额外的编码参数来支持的。实际上,这仅与 Helvetica、Times-Roman 和 Courier(及其粗体/斜体形式)和 ASCII 代码范围之外的字符相关。在其他地方,参数被忽略。以下是如何使用标准字体 Helvetica 请求俄语编码:

有效的编码值为 TEXT_ENCODING_LATIN (0)、TEXT_ENCODING_GREEK (1) 和 TEXT_ENCODING_CYRILLIC(2,俄语),拉丁语为默认值。编码可以由所有相关的字体和文本插入方法指定。

通过上面的语句,字体名称helv自动连接到 Helvetica 的俄语字体变体。使用此字体名称的任何后续文本插入都将使用俄语 Helvetica 编码。

如果稍微更改字体名称,您还可以在同一页面上为相同的基本字体实现编码“混合” :

上面的代码片段确实导致了 PDF 中 Helvetica 字体的三个不同副本。通过使用保留字“helv”的正确大小写拼写来唯一标识(和引用)每个副本:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3