利用Python提取PDF文本并转换为JSON
作者:大丸子
在企业数据整合与文档处理流程中,PDF 文件中的内容往往需要被提取并转化为结构化格式,以便后续系统消费或进一步分析。PDF 作为一种展示型文档格式,其内容并不天然具备结构化特征,手动提取效率低且容易出错。
通过编程方式将 PDF 转换为 JSON 格式,可以实现批量、自动化处理,将 PDF 中的文档属性和各页面文本内容整理为标准的键值对结构,便于 API 传输、数据库存储或与其他系统对接。
本文将介绍如何使用 Python 从 PDF 文件中提取文档元信息和逐页文本内容,并将其组装为 JSON 格式输出。整个过程完全自动化,适用于文档归档、数据治理、内容管理等场景。
本文使用的方法需要用到 Free Spire.PDF for Python,可通过 pip 安装:
pip install spire.pdf.free
加载 PDF 文件并提取文档属性
首先,我们需要加载 PDF 文件,并从中读取文档的基本元信息,如作者、标题、创建日期等。
from spire.pdf.common import *
from spire.pdf import *
import json
input_pdf = "SampleReport.pdf"
# 创建 PDF 文档对象
pdf = PdfDocument()
# 加载 PDF 文件
pdf.LoadFromFile(input_pdf)
# 获取文档属性信息
doc_info = pdf.DocumentInformation
metadata = {
"title": doc_info.Title,
"author": doc_info.Author,
"subject": doc_info.Subject,
"keywords": doc_info.Keywords,
"creation_date": doc_info.CreationDate.strftime("%Y-%m-%d %H:%M:%S"),
"modification_date": doc_info.ModificationDate.strftime("%Y-%m-%d %H:%M:%S")
}说明:
PdfDocument()创建 PDF 文档对象,是所有操作的入口。LoadFromFile()加载指定路径的 PDF 文件。DocumentInformation属性返回文档的元数据对象,包含标题、作者、主题、关键词、创建日期和修改日期等信息。- 我们将这些元信息整理为一个 Python 字典,作为最终 JSON 结构的顶层字段。
逐页提取文本内容
接下来,遍历 PDF 的每一页,使用文本提取器获取页面中的文本内容。
pages_data = []
page_count = pdf.Pages.Count
for i in range(page_count):
# 获取当前页面
page = pdf.Pages[i]
# 创建文本提取器
text_extractor = PdfTextExtractor(page)
# 创建提取选项
text_options = PdfTextExtractOptions()
# 提取页面文本
page_text = text_extractor.ExtractText(text_options)
# 将页面信息记录到列表
pages_data.append({
"page_number": i + 1,
"content": page_text.strip()
})说明:
pdf.Pages.Count获取 PDF 的总页数。pdf.Pages[i]获取指定索引的页面对象。PdfTextExtractor(page)基于页面创建文本提取器,负责从页面中解析和提取文本。PdfTextExtractOptions()创建提取选项对象,可配置提取区域等参数。此处使用默认选项,提取整个页面的文本。ExtractText()返回提取到的文本内容。- 每页的文本与页码一起组成一个字典,追加到列表中,形成按页组织的文本数据。
组装 JSON 结构并输出
将文档属性和页面文本数据合并为一个完整的字典,然后序列化为 JSON 格式并保存到文件。
# 组装完整的 JSON 数据结构
result = {
"document_info": metadata,
"total_pages": page_count,
"pages": pages_data
}
# 设置 JSON 输出路径
output_json = "output/pdf_content.json"
# 写入 JSON 文件
with open(output_json, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
# 关闭文档
pdf.Close()说明:
result字典包含三个顶层字段:document_info(文档元信息)、total_pages(总页数)、pages(各页文本数据列表)。json.dump()将 Python 字典序列化为 JSON 格式,ensure_ascii=False确保中文字符正常输出,indent=2使输出具有良好的缩进格式。- 最后调用
pdf.Close()释放文档资源。
关键类与方法说明表
下面整理本文中涉及的核心类、方法与属性。
| 类 / 方法 | 说明 |
|---|---|
PdfDocument | PDF 文档对象,负责加载和管理 PDF 文件 |
LoadFromFile() | 从指定路径加载 PDF 文件 |
DocumentInformation | 获取 PDF 文档的元信息(作者、标题、日期等) |
Pages | 页面集合,支持通过索引访问具体页面 |
Pages.Count | 获取 PDF 文档的总页数 |
PdfTextExtractor | 文本提取器,基于指定页面创建,用于提取页面文本 |
PdfTextExtractOptions | 文本提取选项,可配置提取区域等参数 |
ExtractText() | 执行文本提取,返回页面文本内容 |
Close() | 关闭文档,释放资源 |
知识扩展
下面是一个将 PDF 文本内容转换为结构化 JSON 的 Python 实现。它使用 pdfplumber 逐页提取文本,并生成包含页码和内容的 JSON 数组。
1. 安装依赖
pip install pdfplumber
2. 转换函数
import json
import pdfplumber
from pathlib import Path
def pdf_to_json(pdf_path, output_path=None, include_metadata=False):
"""
将 PDF 文本内容转换为 JSON 格式。
Args:
pdf_path (str): PDF 文件路径。
output_path (str, optional): 输出 JSON 文件路径。若不指定,则返回 JSON 字符串。
include_metadata (bool): 是否包含文档元数据(如标题、作者等)。
Returns:
str or None: 如果 output_path 为 None,返回 JSON 字符串;否则保存文件并返回 None。
"""
result = {
"source": str(pdf_path),
"pages": []
}
with pdfplumber.open(pdf_path) as pdf:
if include_metadata:
result["metadata"] = pdf.metadata
for i, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or "" # 若无法提取则设为空字符串
result["pages"].append({
"page_num": i,
"text": text.strip()
})
json_output = json.dumps(result, ensure_ascii=False, indent=2)
if output_path:
with open(output_path, "w", encoding="utf-8") as f:
f.write(json_output)
print(f"JSON 已保存至 {output_path}")
else:
return json_output3. 使用示例
# 返回 JSON 字符串
json_str = pdf_to_json("sample.pdf")
print(json_str[:200]) # 打印前200个字符
# 保存为文件
pdf_to_json("sample.pdf", output_path="output.json", include_metadata=True)4. 输出 JSON 格式示例
{
"source": "sample.pdf",
"metadata": {
"Title": "示例文档",
"Author": "张三"
},
"pages": [
{
"page_num": 1,
"text": "这是第一页的内容。\n包含多行文本。"
},
{
"page_num": 2,
"text": "第二页的内容……"
}
]
}5. 高级处理(可选)
如果需要按段落拆分、保留字体大小或坐标等更多信息,可修改提取逻辑。例如:
# 提取每个文本块(带位置和字体)
blocks = []
for word in page.extract_words():
blocks.append({
"text": word["text"],
"x0": word["x0"],
"y0": word["top"],
"font": word.get("fontname")
})但上述字段需视 PDF 内容而定,并非所有 PDF 都能提供完整信息。
总结
通过本文示例,你已经了解如何使用 Python 将 PDF 文件转换为 JSON 格式。从加载 PDF、提取文档属性,到逐页提取文本内容,再到组装并输出 JSON,整个过程高度自动化,特别适用于批量文档处理和数据集成场景。
相比手动复制粘贴或依赖在线转换工具,代码方式具有更高的灵活性和可控性。你可以在此基础上扩展更多能力,例如按区域提取文本、提取表格数据并嵌套到 JSON 中、结合正则表达式进行内容清洗等。
如果你正在处理大量 PDF 文档并需要将其内容纳入结构化数据流程,这种基于 Python 的方案将为你的工作带来显著提升。
到此这篇关于利用Python提取PDF文本并转换为JSON的文章就介绍到这了,更多相关Python PDF文本转JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
