Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比
在文档自动化处理中,将PDF文件内容转换为结构化JSON是一项常见需求。Python提供了多个库来实现这一过程,本文基于两种主流方案——Free Spire.PDF for Python 和 pdfplumber,分别演示如何提取文档元信息与逐页文本,并组装为标准的JSON格式。方案一:使用Free Spire.PDF
首先安装依赖:
pip install spire.pdf.free
核心步骤如下:
1. 加载PDF并读取文档属性
from spire.pdf.common import *
from spire.pdf import *
import json
pdf = PdfDocument()
pdf.LoadFromFile("SampleReport.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是操作入口,LoadFromFile加载文件,DocumentInformation返回包含作者、标题、日期等元信息的对象。
2. 逐页提取文本
pages_data = []
page_count = pdf.Pages.Count
for i in range(page_count):
page = pdf.Pages
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()
})
通过Pages集合遍历每一页,PdfTextExtractor负责提取,PdfTextExtractOptions可配置区域(此处使用默认全页)。ExtractText返回当前页文本。
3. 组装JSON并输出
result = {
"document_info": metadata,
"total_pages": page_count,
"pages": pages_data
}
with open("output/pdf_content.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
pdf.Close()
ensure_ascii=False保证中文正常写入,indent=2使输出可读。最后关闭文档释放资源。
方案二:使用pdfplumber(轻量级,社区活跃)
pdfplumber易于安装且提取效果稳定,适合纯文本场景。
安装:
pip install pdfplumber
定义转换函数:
import json
import pdfplumber
from pathlib import Path
def pdf_to_json(pdf_path, output_path=None, include_metadata=False):
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_output
参数说明:pdf_path为输入文件,output_path指定保存文件(不指定则返回JSON字符串),include_metadata控制是否提取元数据(如标题、作者)。
使用示例:
# 返回字符串
json_str = pdf_to_json("sample.pdf")
print(json_str[:200])
# 保存文件,包含元数据
pdf_to_json("sample.pdf", output_path="output.json", include_metadata=True)
输出JSON结构示例:
{
"source": "sample.pdf",
"metadata": {
"Title": "示例文档",
"Author": "张三"
},
"pages": [
{"page_num": 1, "text": "第一页内容\n多行文本"},
{"page_num": 2, "text": "第二页内容..."}
]
}
高级扩展:若需按段落或保留位置信息,可调整提取逻辑。例如使用page.extract_words()获取每个文本块及其坐标:
blocks = []
for word in page.extract_words():
blocks.append({
"text": word["text"],
"x0": word["x0"],
"y0": word["top"],
"font": word.get("fontname")
})
但需注意,并非所有PDF都包含字体或位置信息,实际使用时应容错。
方案对比与总结
- Free Spire.PDF 功能全面,支持更多高级操作(如提取图片、表格),但商业使用需注意许可证。
- pdfplumber 轻量、开源,提取文本质量较好,适合纯文本转JSON场景。
两种方案均能实现PDF到JSON的自动化转换,可大幅提升文档归档、数据治理效率。开发者可根据实际需求选择,亦可结合正则表达式清洗文本或嵌套表格数据。以上代码已通过Python 3.8+测试,建议在目标环境中确保库版本兼容。
Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比
这篇文章写得非常清晰实用!我之前一直在用 pdfplumber 做简单的提取,没想到 Spire.PDF 还能直接拿文档属性,而且支持配置提取区域,对复杂布局的 PDF 应该会更友好。请问楼主在实际项目中,有没有遇到过两种库在处理中文或扫描件时的性能差异?或者在处理加密/受保护 PDF 时哪一方更方便?谢谢分享!Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比
感谢楼主分享这么详细的对比教程!两种方案从依赖安装到核心代码都写得很清楚,尤其是Spire.PDF那部分,对于需要提取文档元信息的场景很实用;pdfplumber的封装简洁,还支持可选元数据输出,灵活度不错。我之前一直用PyMuPDF做类似任务,但没对比过Spire.PDF,看了你的帖子打算也试试。另外想请教一下,在遇到PDF中表格混合文本时,这两种方案提取顺序或准确性上有没有明显差异?Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比
感谢楼主分享这么详细的对比!正好最近在折腾PDF解析,两种方案都很有参考价值。Spire.PDF 那个元数据提取很完整,适合需要文档属性的场景;pdfplumber 的代码更简洁,而且带可选参数,灵活度不错。想请教一下,实际处理扫描件或者带表格的PDF时,这两种库的区别大吗?还是说都需要结合OCR?
页:
[1]