自学内容网 自学内容网

如何用python将pdf转换为json格式

使用 Python 将 PDF 文件转换为 JSON 格式,主要步骤如下:

  1. 读取 PDF 内容:首先使用一个库读取 PDF 文件内容,如 PyMuPDFpdfplumber。这些库可以逐页提取文本,并返回结构化的数据。

  2. 组织数据到 JSON:将提取的文本数据格式化为字典或嵌套字典,然后将其转化为 JSON 格式。

  3. 输出 JSON 文件:使用 json 库将字典保存为 JSON 文件。

以下是使用 pdfplumber 的示例代码:

import pdfplumber
import json

def pdf_to_json(pdf_path, json_path):
    data = []
    
    with pdfplumber.open(pdf_path) as pdf:
        for i, page in enumerate(pdf.pages):
            text = page.extract_text()
            # 可以根据需要进一步解析或分段文本
            data.append({"page": i + 1, "text": text})

    # 将数据写入 JSON 文件
    with open(json_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

# 使用方法
pdf_path = "sample.pdf"
json_path = "output.json"
pdf_to_json(pdf_path, json_path)

代码解释

  • pdfplumber.open(pdf_path): 打开 PDF 文件。
  • pdf.pages[i].extract_text(): 从 PDF 文件的每一页提取文本。
  • json.dump(data, f, ensure_ascii=False, indent=4): 将字典数据格式化为 JSON 并写入文件。

注意事项

  • 如果 PDF 内容包含表格或复杂的结构,可能需要额外处理,例如使用 pdfplumber 提供的 extract_table() 方法提取表格数据。
  • 可以根据需要调整数据结构,将内容分为段落、标题等,以便生成更精确的 JSON 文件。

如果希望 JSON 的格式是包含 chaptertext 字段,可以先在 PDF 中查找章节标题(例如根据特定的关键字或字体格式),然后提取相应的文本内容。假设每个章节标题以 “Chapter” 开头,以下是一个可能的实现方法:

import pdfplumber
import json
import re

def pdf_to_json(pdf_path, json_path):
    data = []
    current_chapter = None
    current_text = []

    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text = page.extract_text()
            if text is None:
                continue
            
            # 按行分割文本,便于逐行检查
            lines = text.split('\n')
            for line in lines:
                # 检查是否是章节标题(例如以 "Chapter" 开头的行)
                if re.match(r'^\s*Chapter\s+\d+', line, re.IGNORECASE):
                    # 保存上一章节内容到 data 中
                    if current_chapter:
                        data.append({"chapter": current_chapter, "text": "\n".join(current_text)})
                    
                    # 更新当前章节标题和内容
                    current_chapter = line.strip()
                    current_text = []
                else:
                    # 将非章节标题的内容加入当前章节文本
                    current_text.append(line)

    # 添加最后一个章节
    if current_chapter:
        data.append({"chapter": current_chapter, "text": "\n".join(current_text)})

    # 将数据写入 JSON 文件
    with open(json_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

# 使用方法
pdf_path = "sample.pdf"
json_path = "output.json"
pdf_to_json(pdf_path, json_path)

代码解释

  • current_chapter:用于保存当前章节标题。
  • current_text:用于收集当前章节的所有文本内容。
  • re.match(r'^\s*Chapter\s+\d+', line, re.IGNORECASE):使用正则表达式检查是否是章节标题(假设章节标题格式为 “Chapter X”)。
  • 当检测到一个新的章节时,将 current_chaptercurrent_text 保存到 data 列表,然后开始新的章节记录。

注意事项

  • 如果章节标题格式不同,修改正则表达式条件以适应实际标题格式。
  • 可以根据需要调整数据结构,以实现更灵活的 JSON 格式。

原文地址:https://blog.csdn.net/lycwhu/article/details/143751295

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!