当前位置: 首页 > article >正文

基于 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 库:

pip install pdfminer.six markdownify

4. 代码实现

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

4.1 PDF 转 Markdown

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

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. 通过 文本长度大写格式 等规则进一步判断。
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,按标题与内容分级存储:

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 主函数入口

整合所有步骤:

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 文本示例:

第一章 引言
本章介绍了研究的背景和目标。

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

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

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

5.2 输出 JSON

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

6. 自定义规则说明

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

7. 应用场景

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

8. 总结

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

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


http://www.kler.cn/a/446415.html

相关文章:

  • Ubuntu上如何部署Nginx?
  • 坑人 C# MySql.Data SDK
  • 服务器防火墙设置某个端口号只允许固定 ip地址访问
  • 《全面解析 QT 各版本:特性、应用与选择策略》
  • 纯前端实现更新检测
  • SparkSQL案例
  • Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍
  • Python Turtle图形库基本命令详解
  • leetcode之hot100---160相交链表(C++)
  • MFC/C++学习系列之简单记录2——thread和Release
  • 【服务器】MyBatis是如何在java中使用并进行分页的?
  • 中阳科技的量化交易模型:从理论到实践的全面探索
  • 1688跨境代购代采:API赋能的自动化与信息化革新
  • 【NLP 18、新词发现和TF·IDF】
  • git中的tag标签远程管理
  • Linux禁用网络、开启网络
  • Docker:Dockerfile(补充四)
  • 贪心算法 greedy
  • CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)
  • 多进程、多线程、分布式测试支持-pytest-xdis插件
  • 零基础学习OpenFOAM:从流体力学与人工智能的交叉科学,流场预测与重构,气动信息预测,基于深度强化学习的气动优化出发
  • 计算机网络:运输层 —— TCP 的选择确认(SACK)
  • WPF 用Vlc.DotNet.Wpf实现视频播放、停止、暂停功能
  • 利用爬虫获取的数据能否用于商业分析?
  • Next.js v15 - 服务器操作以及调用原理
  • 搭建云手机平台的技术要求?