基于 Python 将 PDF 转 Markdown 并拆解为 JSON,支持自定义标题处理

在日常工作中,我们经常需要将 PDF 文件转换为可编辑、可结构化的数据格式,比如 Markdown 和 JSON。但实际操作中,自动化工具往往会出现标题识别不准确的问题,尤其是 PDF 转换过程中,缺乏明确的标题标识。这篇文章将教你如何使用 Python 将 PDF 转换为 Markdown ,并通过自定义规则精准识别标题,最终将内容按标题结构拆解为 JSON,方便后续快速检索与使用。


1. 实现目标

  1. 将 PDF 文件转换为 Markdown 格式,保留内容和大致结构。
  2. 自定义处理标题,解决自动识别不准确的问题。
  3. 将 Markdown 内容解析并按标题结构拆解为 JSON,支持通过标题快速查找对应内容。

2. 技术方案

我们将使用以下技术工具:

  • pdfminer.six:提取 PDF 中的文本。
  • markdownify:将纯文本转换为 Markdown 格式。
  • 自定义标题识别:通过规则或关键词判断哪些行是标题。
  • JSON 结构化输出:将 Markdown 内容拆解并按标题结构存储为 JSON。

3. 依赖安装

首先,确保你的环境已安装所需的 Python 库:

bash 复制代码
pip install pdfminer.six markdownify

4. 代码实现

以下是完整的代码实现,分为 PDF 转 Markdown标题自定义处理生成 JSON 三个步骤。

4.1 PDF 转 Markdown

使用 pdfminer.six 提取 PDF 文本,然后通过 markdownify 转换为 Markdown 格式:

python 复制代码
from pdfminer.high_level import extract_text
from markdownify import markdownify

def pdf_to_markdown(pdf_path):
    """
    将 PDF 文件转换为 Markdown 文本
    """
    # 提取 PDF 文本
    raw_text = extract_text(pdf_path)
    # 将原始文本转换为 Markdown 格式
    markdown_text = markdownify(raw_text)
    return markdown_text

4.2 自定义标题识别与解析

标题识别不准确时,可以通过自定义规则进行判断:

  1. 根据 关键词(如"第"、"章"、"节")判断是否是标题。
  2. 通过 文本长度大写格式 等规则进一步判断。
python 复制代码
import re

def is_custom_title(line, keywords=None, min_length=10, max_length=50):
    """
    自定义判断是否是标题的逻辑
    :param line: 待判断的行
    :param keywords: 标题中常见的关键词列表
    :param min_length: 最小标题长度限制
    :param max_length: 最大标题长度限制
    :return: 是否为标题(布尔值)
    """
    if not line.strip():
        return False

    # 规则1:根据关键词判断
    if keywords:
        for keyword in keywords:
            if keyword in line:
                return True

    # 规则2:根据文本长度判断
    if min_length <= len(line.strip()) <= max_length:
        return True

    # 规则3:大写或特殊标识判断
    if line.isupper() or re.match(r'^[A-Z0-9\s]+\:?', line):
        return True

    return False

4.3 Markdown 拆解并生成 JSON

将处理后的 Markdown 内容拆解为 JSON,按标题与内容分级存储:

python 复制代码
import json

def markdown_to_json(markdown_text, keywords=None):
    """
    将 Markdown 文本拆解成基于标题的 JSON 结构
    """
    result = {}
    current_section = None
    content_buffer = []

    for line in markdown_text.split("\n"):
        line = line.strip()
        
        # 自定义标题判断
        if is_custom_title(line, keywords=keywords):
            # 保存上一部分内容
            if current_section:
                result[current_section] = "\n".join(content_buffer)
            # 新标题
            current_section = line.strip()
            content_buffer = []
        else:
            content_buffer.append(line)
    
    # 保存最后一部分内容
    if current_section:
        result[current_section] = "\n".join(content_buffer)
    
    return result

def save_to_json(data, output_path):
    """
    将数据保存为 JSON 文件
    """
    with open(output_path, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

4.4 主函数入口

整合所有步骤:

python 复制代码
def main(pdf_path, output_json, custom_keywords=None):
    # 1. PDF 转 Markdown
    markdown_text = pdf_to_markdown(pdf_path)
    
    # 2. 解析 Markdown 并自定义标题处理
    result_json = markdown_to_json(markdown_text, keywords=custom_keywords)
    
    # 3. 保存 JSON 数据
    save_to_json(result_json, output_json)
    print(f"JSON 数据已保存至:{output_json}")

if __name__ == "__main__":
    # 输入 PDF 文件路径和输出 JSON 文件路径
    input_pdf = "example.pdf"  # 替换为你的 PDF 文件路径
    output_json = "output.json"

    # 自定义关键词列表(可以根据实际情况调整)
    custom_keywords = ["第", "章", "节", "引言", "方法", "总结", "讨论"]

    # 执行主程序
    main(input_pdf, output_json, custom_keywords)

5. 示例演示

5.1 输入示例

PDF 转换后的 Markdown 文本示例:

markdown 复制代码
第一章 引言
本章介绍了研究的背景和目标。

数据采集过程
数据通过传感器和手工记录获取。

第二章 研究方法
本章主要描述了数据处理和算法实现的过程。

讨论与总结
总结了本研究的关键发现。

5.2 输出 JSON

json 复制代码
{
    "第一章 引言": "本章介绍了研究的背景和目标。",
    "数据采集过程": "数据通过传感器和手工记录获取。",
    "第二章 研究方法": "本章主要描述了数据处理和算法实现的过程。",
    "讨论与总结": "总结了本研究的关键发现。"
}

6. 自定义规则说明

  • 关键词匹配:如"第"、"章"、"节"、"引言"等。
  • 长度约束:排除过长或过短的行,避免误判。
  • 格式特征:如全大写、冒号分隔等。

7. 应用场景

  1. 文档结构化
    • 将技术文档、电子书章节自动拆解为 JSON,方便后续数据分析。
  2. 知识检索
    • 通过标题快速定位内容,实现高效的文档查询。
  3. 大规模数据处理
    • 对批量 PDF 进行自动化转换和整理。

8. 总结

通过本文的方法,你可以将 PDF 文档 自动转换为 Markdown 格式,并通过自定义标题识别规则,实现精确的 章节拆解JSON 数据结构化 输出。这种方法对于大规模文档处理、自动化知识整理等场景非常实用。你还可以根据自己的需求进一步优化标题识别规则或扩展功能,比如引入机器学习模型提高标题判断的智能性。

代码可直接运行,简单易用,赶快试试吧!

相关推荐
databook6 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar7 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780517 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_7 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机14 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机15 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机15 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机15 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i15 小时前
drf初步梳理
python·django
每日AI新事件15 小时前
python的异步函数
python