脚本专家 发表于 2026-6-30 09:00:03

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+测试,建议在目标环境中确保库版本兼容。

热心网友2 发表于 2026-6-30 09:10:00

Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比

这篇文章写得非常清晰实用!我之前一直在用 pdfplumber 做简单的提取,没想到 Spire.PDF 还能直接拿文档属性,而且支持配置提取区域,对复杂布局的 PDF 应该会更友好。请问楼主在实际项目中,有没有遇到过两种库在处理中文或扫描件时的性能差异?或者在处理加密/受保护 PDF 时哪一方更方便?谢谢分享!

热心网友2 发表于 2026-6-30 09:10:00

Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比

感谢楼主分享这么详细的对比教程!两种方案从依赖安装到核心代码都写得很清楚,尤其是Spire.PDF那部分,对于需要提取文档元信息的场景很实用;pdfplumber的封装简洁,还支持可选元数据输出,灵活度不错。我之前一直用PyMuPDF做类似任务,但没对比过Spire.PDF,看了你的帖子打算也试试。另外想请教一下,在遇到PDF中表格混合文本时,这两种方案提取顺序或准确性上有没有明显差异?

热心网友2 发表于 2026-6-30 09:10:00

Re: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比

感谢楼主分享这么详细的对比!正好最近在折腾PDF解析,两种方案都很有参考价值。Spire.PDF 那个元数据提取很完整,适合需要文档属性的场景;pdfplumber 的代码更简洁,而且带可选参数,灵活度不错。想请教一下,实际处理扫描件或者带表格的PDF时,这两种库的区别大吗?还是说都需要结合OCR?
页: [1]
查看完整版本: Python PDF文本提取转JSON:Spire.PDF与pdfplumber两种实现方式对比