使用 Python 将 PDF 文件转换为 JSON 格式,主要步骤如下:
-
读取 PDF 内容:首先使用一个库读取 PDF 文件内容,如
PyMuPDF
或pdfplumber
。这些库可以逐页提取文本,并返回结构化的数据。 -
组织数据到 JSON:将提取的文本数据格式化为字典或嵌套字典,然后将其转化为 JSON 格式。
-
输出 JSON 文件:使用
json
库将字典保存为 JSON 文件。
以下是使用 pdfplumber
的示例代码:
import pdfplumber
import jsondef 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 的格式是包含 chapter
和 text
字段,可以先在 PDF 中查找章节标题(例如根据特定的关键字或字体格式),然后提取相应的文本内容。假设每个章节标题以 “Chapter” 开头,以下是一个可能的实现方法:
import pdfplumber
import json
import redef pdf_to_json(pdf_path, json_path):data = []current_chapter = Nonecurrent_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_chapter
和current_text
保存到data
列表,然后开始新的章节记录。
注意事项
- 如果章节标题格式不同,修改正则表达式条件以适应实际标题格式。
- 可以根据需要调整数据结构,以实现更灵活的 JSON 格式。