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

14
我希望能够使用Python从PDF中提取特定标题下的文本。
例如,我有一个包含引言、摘要和目录等标题的PDF文件。我需要仅提取“摘要”标题下的文本。
我该如何做到这一点?

sample-image


3
由于我不熟悉使用Python进行PDF处理,无法给出答案;但是,基于对PDF的一些了解,我可以提示一些难点:您的示例文件有两个文本列。然而,这并不一定反映在内部PDF内容中。根据文档本身,很可能有一种解决方案来完成任务;为了提供匹配的解决方案,必须提供相关的PDF文件。否则,人们可能会提供适用于类似文档但不适用于您的文档的解决方案,或者不提供解决方案,因为他们无法测试其是否匹配。 - mkl
1
@Midhun 开启悬赏可能是个好主意,但仍需要 OP 的合作,而 Alfiya 尚未回复 usr2564301 在 Ankit 的答案下的评论,即是否使用该评论中的提示解决了问题。 - mkl
1
你能得到解决方案吗? - anuja
@user2999110 嘿,我能理解,正则表达式是唯一的解决方案。但是我找不到任何解决方法来处理具有不可预测标题格式的PDF文件。在这种情况下,正则表达式不起作用。 - AlfyFaisy
3个回答

9

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


2
请您能否添加代码片段并解释其步骤以便更好地理解? - anushiya-thevapalan
@PrafulPrasad,你能分享一下这个代码吗? - undefined

3
我找到的使用正则表达式的最佳方法
regex = r"^\d+(?:\.\d+)* .*(?:\r?\n(?!\d+(?:\.\d+)* ).*)*"
print(re.findall(regex,samplestring, re.M))


3

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. heading 1\n', '\n1.2.3 Heading 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)个标题文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接