如何用python将pdf转换为json格式
使用 Python 将 PDF 文件转换为 JSON 格式,主要步骤如下:
-
读取 PDF 内容:首先使用一个库读取 PDF 文件内容,如
PyMuPDF
或pdfplumber
。这些库可以逐页提取文本,并返回结构化的数据。 -
组织数据到 JSON:将提取的文本数据格式化为字典或嵌套字典,然后将其转化为 JSON 格式。
-
输出 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 的格式是包含 chapter
和 text
字段,可以先在 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_chapter
和current_text
保存到data
列表,然后开始新的章节记录。
注意事项
- 如果章节标题格式不同,修改正则表达式条件以适应实际标题格式。
- 可以根据需要调整数据结构,以实现更灵活的 JSON 格式。