如何从pdf中提取特定标题下的文本?

Posted

技术标签:

【中文标题】如何从pdf中提取特定标题下的文本?【英文标题】:How to extract text under specific headings from a pdf? 【发布时间】:2018-06-14 21:53:44 【问题描述】:

我想使用 python 从 pdf 中提取特定标题下的文本。

例如,我有一个带有标题简介、摘要、内容的 pdf。我只需要提取标题“摘要”下的文本。

我该怎么做?

【问题讨论】:

因为我不喜欢用 python 处理 PDF,所以我无法给出答案;不过,对 PDF 有所了解,让我暗示一些困难:您的示例文件有两个文本列。但是,这不一定反映在内部 PDF 内容中。根据文档本身,很可能有解决该任务的方法;但是,要提供匹配的解决方案,最好提供有问题的 PDF。否则,人们可能会提出适用于类似文档但不适用于您的文档的解决方案。或者不提供解决方案,因为他们无法测试它是否匹配。 @Midhun 打开赏金可能是一个好主意,但即便如此,OP 的合作也需要,并且 Alfiya 没有在 Ankit 的回答下回复 usr2564301 的评论是否使用该评论中的提示答案是否解决问题。 你找到解决方案了吗? @user2999110 嘿,我能理解,正则表达式是唯一的解决方案。但是对于标题格式不可预测的 pdf,我找不到任何解决方案。在这种情况下,正则表达式将不起作用 【参考方案1】:

我发现使用正则表达式的最佳方法

regex = r"^\d+(?:\.\d+)* .*(?:\r?\n(?!\d+(?:\.\d+)* ).*)*"
print(re.findall(regex,samplestring, re.M))

【讨论】:

【参考方案2】:

Pdf 是非结构化文本,因此没有标签可以直接提取数据。因此,我们使用正则表达式从文本语料库中找到所需的信息。 使用以下代码提取原始页面文本。

import fitz
page = pdf_file.loadPage(0) # 0 represents the page number... upto n-1 pages...
dl = page.getDisplayList()
tp = dl.getTextPage()
tp_text=tp.extractText()
re.split('\n\d+.+[ \t][a-zA-Z].+\n',tp_text)

然后根据您的需要应用正则表达式...(这为我重新工作,但您可能需要也可能不需要更改它)

我正在给出一个详细的例子,这是如何工作的

re.findall('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")

输出:['\n1.标题 1\n', '\n1.2.3 标题 2\n']

您可以使用re.split 来拆分每个标题的文本并检索您想要的标题文本。

re.split('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")

输出:['some text', 'paragraph 1', 'parapgraph 2']

仅第 i 个标题将有 (i+1) 个标题文本。

【讨论】:

【参考方案3】:

这个场景正是我在我现在的公司中所做的。我们需要提取标题下的文本。我个人使用的是基于规则的系统,即在逐行阅读整个文档后使用正则表达式来识别所有编号的标题。获得标题后,我输入要为其查找相应段落的标题名称。此输入与预先存在的标题列表匹配,并使用通用句子编码器找到最接近的匹配项。之后,我只显示从该标题到下一个标题的所有内容。

【讨论】:

能否请您添加代码 sn-ps 并解释其步骤以便更好地理解?

以上是关于如何从pdf中提取特定标题下的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何从特定的二进制文件格式中提取文本?

如何从 PDF 文件中提取文本和文本坐标?

如何利用python提取文本内标题下的内容?

如何从PDF文档中提取文本? [关闭]

如何将使用 Tika 从 PDF 中提取的文本放入 JSON?

带坐标的PDF文本提取