Python提取PDF中的多级标题

在日常文档处理中,PDF文件常被用作信息的标准格式。然而,提取PDF文档中的结构化信息,如多级标题,却是一项具有挑战性的任务。本文将介绍如何使用Python库来实现这一目标,并通过代码示例阐述具体步骤。

环境准备

首先,确保安装了所需的Python库。我们将使用 PyMuPDFre(正则表达式)库来提取PDF中的文本。如果尚未安装这些库,可以通过以下命令进行安装:

pip install PyMuPDF

提取多级标题

我们先来了解如何读取PDF文件中的文本。以下是一个简单的示例,展示了如何提取PDF文档中的所有文本内容。

import fitz  # PyMuPDF

def extract_text_from_pdf(pdf_file):
    doc = fitz.open(pdf_file)
    text = ""
    for page in doc:
        text += page.get_text()
    return text

pdf_file = 'example.pdf'
pdf_text = extract_text_from_pdf(pdf_file)
print(pdf_text)

在上面的代码中,我们打开一个PDF文件,逐页读取文本,并将所有文本合并到一个字符串中。

正则表达式提取标题

一旦获得完整的文本内容,我们就可以使用正则表达式来提取多级标题。假设我们用不同的前缀标识多级标题,如“1.”表示一级标题和“1.1”表示二级标题。

下面是一个用正则表达式提取一级和二级标题的示例:

import re

def extract_headings(text):
    main_headings = re.findall(r'^\d+\.\s.+$', text, re.MULTILINE)
    sub_headings = re.findall(r'^\d+\.\d+\s.+$', text, re.MULTILINE)
    return main_headings, sub_headings

main_headings, sub_headings = extract_headings(pdf_text)

print("一级标题:")
for heading in main_headings:
    print(heading)
    
print("二级标题:")
for heading in sub_headings:
    print(heading)

在上面的代码中,re.findall 函数被用来从文本中提取与模式匹配的行。通过设置 re.MULTILINE,我们可以确保每一行都被单独匹配。

数据可视化

为了更好地呈现提取到的标题数据,我们可以使用饼状图展示一级和二级标题数量的占比。这项工作可以通过 Python 的 matplotlib 库轻松实现。下方是一个示例代码:

import matplotlib.pyplot as plt

# 统计标题数量
main_count = len(main_headings)
sub_count = len(sub_headings)

labels = ['一级标题', '二级标题']
sizes = [main_count, sub_count]

plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal')  # 使饼图为正圆形
plt.title('PDF标题分布')
plt.show()

在这个代码示例中,我们通过 plt.pie 方法来可视化标题的数量。

pie
    title PDF标题分布
    "一级标题": main_count
    "二级标题": sub_count

结论

通过上述流程,我们成功利用Python提取了PDF文件中的多级标题,并对其进行了可视化。这不仅提高了工作效率,也使后续的信息处理变得更加灵活。可以说,Python为文本处理提供了强大的工具,如果你面临类似的需求,不妨尝试这些方法。希望这篇文章对你有所帮助,让你在PDF处理的道路上走得更顺畅!