在文档自动化处理中,将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[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()
- })
复制代码 通过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易于安装且提取效果稳定,适合纯文本场景。
安装:
定义转换函数:- 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+测试,建议在目标环境中确保库版本兼容。 |