查看: 100|回复: 3

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

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在文档自动化处理中,将PDF文件内容转换为结构化JSON是一项常见需求。Python提供了多个库来实现这一过程,本文基于两种主流方案——Free Spire.PDF for Python 和 pdfplumber,分别演示如何提取文档元信息与逐页文本,并组装为标准的JSON格式。

方案一:使用Free Spire.PDF
首先安装依赖:
  1. pip install spire.pdf.free
复制代码
核心步骤如下:

1. 加载PDF并读取文档属性
  1. from spire.pdf.common import *
  2. from spire.pdf import *
  3. import json
  4. pdf = PdfDocument()
  5. pdf.LoadFromFile("SampleReport.pdf")
  6. doc_info = pdf.DocumentInformation
  7. metadata = {
  8.     "title": doc_info.Title,
  9.     "author": doc_info.Author,
  10.     "subject": doc_info.Subject,
  11.     "keywords": doc_info.Keywords,
  12.     "creation_date": doc_info.CreationDate.strftime("%Y-%m-%d %H:%M:%S"),
  13.     "modification_date": doc_info.ModificationDate.strftime("%Y-%m-%d %H:%M:%S")
  14. }
复制代码
PdfDocument是操作入口,LoadFromFile加载文件,DocumentInformation返回包含作者、标题、日期等元信息的对象。

2. 逐页提取文本
  1. pages_data = []
  2. page_count = pdf.Pages.Count
  3. for i in range(page_count):
  4.     page = pdf.Pages[i]
  5.     text_extractor = PdfTextExtractor(page)
  6.     text_options = PdfTextExtractOptions()
  7.     page_text = text_extractor.ExtractText(text_options)
  8.     pages_data.append({
  9.         "page_number": i + 1,
  10.         "content": page_text.strip()
  11.     })
复制代码
通过Pages集合遍历每一页,PdfTextExtractor负责提取,PdfTextExtractOptions可配置区域(此处使用默认全页)。ExtractText返回当前页文本。

3. 组装JSON并输出
  1. result = {
  2.     "document_info": metadata,
  3.     "total_pages": page_count,
  4.     "pages": pages_data
  5. }
  6. with open("output/pdf_content.json", "w", encoding="utf-8") as f:
  7.     json.dump(result, f, ensure_ascii=False, indent=2)
  8. pdf.Close()
复制代码
ensure_ascii=False保证中文正常写入,indent=2使输出可读。最后关闭文档释放资源。

方案二:使用pdfplumber(轻量级,社区活跃)
pdfplumber易于安装且提取效果稳定,适合纯文本场景。

安装:
  1. pip install pdfplumber
复制代码

定义转换函数:
  1. import json
  2. import pdfplumber
  3. from pathlib import Path
  4. def pdf_to_json(pdf_path, output_path=None, include_metadata=False):
  5.     result = {
  6.         "source": str(pdf_path),
  7.         "pages": []
  8.     }
  9.     with pdfplumber.open(pdf_path) as pdf:
  10.         if include_metadata:
  11.             result["metadata"] = pdf.metadata
  12.         for i, page in enumerate(pdf.pages, start=1):
  13.             text = page.extract_text() or ""
  14.             result["pages"].append({
  15.                 "page_num": i,
  16.                 "text": text.strip()
  17.             })
  18.     json_output = json.dumps(result, ensure_ascii=False, indent=2)
  19.     if output_path:
  20.         with open(output_path, "w", encoding="utf-8") as f:
  21.             f.write(json_output)
  22.         print(f"JSON已保存至{output_path}")
  23.     else:
  24.         return json_output
复制代码
参数说明:pdf_path为输入文件,output_path指定保存文件(不指定则返回JSON字符串),include_metadata控制是否提取元数据(如标题、作者)。

使用示例:
  1. # 返回字符串
  2. json_str = pdf_to_json("sample.pdf")
  3. print(json_str[:200])
  4. # 保存文件,包含元数据
  5. pdf_to_json("sample.pdf", output_path="output.json", include_metadata=True)
复制代码
输出JSON结构示例:
  1. {
  2.   "source": "sample.pdf",
  3.   "metadata": {
  4.     "Title": "示例文档",
  5.     "Author": "张三"
  6.   },
  7.   "pages": [
  8.     {"page_num": 1, "text": "第一页内容\n多行文本"},
  9.     {"page_num": 2, "text": "第二页内容..."}
  10.   ]
  11. }
复制代码

高级扩展:若需按段落或保留位置信息,可调整提取逻辑。例如使用page.extract_words()获取每个文本块及其坐标:
  1. blocks = []
  2. for word in page.extract_words():
  3.     blocks.append({
  4.         "text": word["text"],
  5.         "x0": word["x0"],
  6.         "y0": word["top"],
  7.         "font": word.get("fontname")
  8.     })
复制代码
但需注意,并非所有PDF都包含字体或位置信息,实际使用时应容错。

方案对比与总结
- Free Spire.PDF 功能全面,支持更多高级操作(如提取图片、表格),但商业使用需注意许可证。
- pdfplumber 轻量、开源,提取文本质量较好,适合纯文本转JSON场景。

两种方案均能实现PDF到JSON的自动化转换,可大幅提升文档归档、数据治理效率。开发者可根据实际需求选择,亦可结合正则表达式清洗文本或嵌套表格数据。以上代码已通过Python 3.8+测试,建议在目标环境中确保库版本兼容。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-30 11:50 , Processed in 0.044991 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部