PDF 文档作为一种广泛使用的文件格式,常常包含丰富的内容元素------从简单的文字段落,到复杂的数据表格,再到精美的图片和图表。当我们需要对这些内容进行二次利用或数据分析时,如何高效地从 PDF 中提取这些不同类型的元素就成为了一个关键问题。
本文将介绍如何使用 Python 和 Spire.PDF 库来提取 PDF 文件中的文本、表格和图片,帮助您将静态的 PDF 文档转换为可编辑、可分析的数据资源。
为什么需要提取 PDF 内容?
从 PDF 中提取内容在实际工作中有着广泛的应用场景:
- 数据再利用:从报告或文档中提取文本内容,用于其他文档或系统
- 数据分析:提取表格数据进行统计分析或导入数据库
- 素材收集:提取图片用于演示文稿、网站或其他设计项目
- 内容归档:将 PDF 内容转换为结构化格式便于检索和管理
- 自动化处理:批量提取多个文档的内容,提高工作效率
通过 Python 自动化这些提取操作,可以显著减少手动复制粘贴的工作量,并提高数据处理的准确性。
环境准备
首先,需要安装 Spire.PDF for Python 库。可以通过 pip 命令轻松完成安装:
bash
pip install Spire.PDF
安装完成后,即可在 Python 脚本中导入该库并使用其提供的内容提取功能。
提取 PDF 中的文本
提取整页文本
最基础的提取操作是从 PDF 页面中提取所有文本内容。Spire.PDF 提供了 PdfTextExtractor 类来实现这一功能,它能够智能识别页面中的文本布局并保持原有的阅读顺序。
以下代码展示了如何从 PDF 的第一页提取文本并保存到文件:
python
from spire.pdf.common import *
from spire.pdf import *
def WriteAllText(fname: str, text: List[str]):
"""辅助函数:将文本列表写入文件"""
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s)
fp.close()
# 定义输入和输出文件路径
inputFile = "./Demos/Data/PDFTemplate-Az.pdf"
outputFile = "ExtractTextFromParticularPage.txt"
# 创建 PDF 文档对象
doc = PdfDocument()
# 加载 PDF 文件
doc.LoadFromFile(inputFile)
# 获取第一页
page = doc.Pages[0]
# 创建文本提取器并保持空白格式
textExtractor = PdfTextExtractor(page)
option = PdfTextExtractOptions()
text = textExtractor.ExtractText(option)
# 将提取的文本写入文件
WriteAllText(outputFile, text)
doc.Close()

这个示例展示了文本提取的基本流程:
- 加载 PDF 文档并获取目标页面
- 创建
PdfTextExtractor对象用于文本提取 - 配置
PdfTextExtractOptions选项(可选) - 调用
ExtractText方法提取文本内容 - 将结果保存到文本文件
PdfTextExtractOptions 允许您自定义提取行为,例如是否保留空白字符、如何处理换行符等,这为不同场景下的文本提取提供了灵活性。
提取特定区域的文本
有时候我们只对 PDF 页面中的某个特定区域感兴趣,比如表单字段、标题部分或某个数据块。Spire.PDF 支持通过定义矩形区域来精确提取指定范围内的文本。
以下示例演示了如何从页面的特定矩形区域提取文本:
python
from spire.pdf.common import *
from spire.pdf import *
def WriteAllText(fname: str, text: List[str]):
"""辅助函数:将文本写入文件"""
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s)
fp.close()
# 定义输入和输出文件路径
inputFile = "/输入文档.pdf"
outputFile = "ExtractTextFromSpecificArea.txt"
# 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile(inputFile)
# 获取第一页
page = pdf.Pages[0]
# 从页面的特定矩形区域提取文本
# RectangleF 参数:x坐标, y坐标, 宽度, 高度
pdfTextExtractor = PdfTextExtractor(page)
pdfTextExtractOptions = PdfTextExtractOptions()
pdfTextExtractOptions.ExtractArea = RectangleF(80.0, 180.0, 500.0, 200.0)
text = pdfTextExtractor.ExtractText(pdfTextExtractOptions)
# 保存文本到文件
sb = []
sb.append(text)
WriteAllText(outputFile, sb)
pdf.Close()
这段代码的关键在于 RectangleF 参数的设置:
- x坐标和y坐标:定义矩形区域左上角的位置(单位为点,1点=1/72英寸)
- 宽度和高度:定义提取区域的大小
通过精确控制这些参数,您可以只提取感兴趣的区域,避免获取无关内容。这种方法特别适合处理结构化的 PDF 表单、发票或报表。
提取 PDF 中的图片
PDF 文档中的图片可能是产品照片、图表、Logo 或其他视觉元素。Spire.PDF 提供了高效的方法来提取这些图片,最常用的方式是借助 PdfImageHelper 工具类。
使用 PdfImageHelper 提取图片
以下代码展示了如何遍历 PDF 页面中的所有图片并将其保存为单独的 PNG 文件:
python
from spire.pdf.common import *
from spire.pdf import *
# 创建 PdfDocument 对象
doc = PdfDocument()
# 加载 PDF 文档
doc.LoadFromFile("输入文档.pdf")
# 创建 PdfImageHelper 对象
image_helper = PdfImageHelper()
image_count = 1
# 遍历文档中的页面
for i in range(doc.Pages.Count):
# 获取当前页面中的图片信息集合
images_info = image_helper.GetImagesInfo(doc.Pages[i])
# 遍历图片信息并保存图片
for j in range(len(images_info)):
image_info = images_info[j]
# 设置输出文件名
output_file = f"图片-{image_count}.png"
# 直接通过 Image 对象保存文件
image_info.Image.Save(output_file)
image_count += 1
doc.Close()

核心步骤说明:
- 实例化 PdfImageHelper:这是提取图片的核心辅助类。
- 获取图片信息 :通过
image_helper.GetImagesInfo(page)获取包含图片数据及其元数据的集合。 - 直接保存 :利用
image_info.Image.Save()方法直接将图片对象导出。Spire.PDF 会自动处理图像解码,确保提取出的图片保持高质量。
同时提取文本和图片
如果需要一次性获取页面中的所有内容,可以将 PdfTextExtractor 与 PdfImageHelper 结合使用。这种方法非常适合需要对文档进行内容索引或归档的自动化任务。
python
from spire.pdf import *
import os
inputFile = "./Demos/Data/Extraction.pdf"
# 创建 PDF 文档
doc = PdfDocument()
doc.LoadFromFile(inputFile)
# 创建缓冲区存储提取的文本
sbuffer = []
# 定义图片对象数组用于缓存
images = []
# 实例化 PdfImageHelper
imageHelper = PdfImageHelper()
# 遍历文档中的每一页
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 创建 PdfTextExtractor 对象并提取文本
pdfTextExtractor = PdfTextExtractor(page)
pdfTextExtractOptions = PdfTextExtractOptions()
sbuffer.append(pdfTextExtractor.ExtractText(pdfTextExtractOptions))
# 获取页面中的所有图片并存入缓存
imageInfo = imageHelper.GetImagesInfo(page)
for info in imageInfo:
images.append(info.Image)
# 保存提取的文本到文件
fileName = "Extraction.txt"
with open(fileName, "w", encoding="utf-8") as fp:
for s in sbuffer:
fp.write(s + "\n")
# 保存页面中的所有图片
for index, img in enumerate(images):
img_path = os.path.join("./Demos/Data", f"Image-{index}.png")
img.Save(img_path)
# 关闭文档
doc.Close()
这种方法的优势在于可以统一处理文档的各种媒体元素,并能够通过循环结构轻松实现批量提取,是处理复杂 PDF 文档的标准做法。
提取 PDF 中的表格
表格是 PDF 文档中常见的数据结构,但也是最难准确提取的元素之一。Spire.PDF 提供了将 PDF 转换为 Excel 的功能,通过这种方式可以间接提取表格数据。
提取 PDF 表格并保存为数据文件
通过 PdfTableExtractor 类,可以精确识别并提取 PDF 中的表格结构。这种方法允许开发者遍历每一行和每一列,将数据按原样填入 Excel 工作表或保存为 CSV 格式,便于后续的数据处理。
python
from spire.pdf import *
from spire.pdf.common import *
from spire.xls import *
# 创建 PdfDocument 对象
doc = PdfDocument()
# 加载 PDF 文档
doc.LoadFromFile("/input/项目进度.pdf")
# 创建 Workbook 对象
workbook = Workbook()
# 清除默认工作表
workbook.Worksheets.Clear()
# 创建 PdfTableExtractor 对象
extractor = PdfTableExtractor(doc)
sheetNumber = 1
# 遍历 PDF 文件中的页面
for pageIndex in range(doc.Pages.Count):
# 从当前页面提取表格
tableList = extractor.ExtractTable(pageIndex)
# 遍历表格
if tableList is not None and len(tableList) > 0:
for table in tableList:
# 为当前表格添加一个工作表
sheet = workbook.Worksheets.Add(f"Sheet{sheetNumber}")
# 获取表格的行数和列数
row = table.GetRowCount()
column = table.GetColumnCount()
# 遍历表格的行和列
for i in range(row):
for j in range(column):
# 获取当前单元格中的文本
text = table.GetText(i, j)
# 将文本写入工作表的指定单元格
sheet.Range[i + 1, j + 1].Value = text
sheetNumber += 1
# 将工作簿保存为 CSV 文件
workbook.SaveToFile("/output/提取表格.csv", FileFormat.CSV)
workbook.Dispose()
doc.Close()

核心步骤说明:
- 初始化提取器 :使用
PdfTableExtractor(doc)实例化表格提取对象。 - 按页提取 :通过
extractor.ExtractTable(pageIndex)获取特定页面的所有表格。 - 行列遍历 :利用
table.GetRowCount()和table.GetColumnCount()确定表格维度,并通过table.GetText(i, j)抓取每一个单元格的文本内容。 - 数据导出 :将提取的数据填入
Workbook单元格,并根据需要保存为 CSV 或其他 Excel 支持的格式。
这种逐单元格处理的方式提供了极高的灵活性,例如你可以在写入数据前对特定文本进行过滤、清洗或重新格式化。
实际应用
PDF 内容提取功能在实际工作中有广泛的应用场景:
批量提取文档内容
当需要处理大量 PDF 文件时,可以编写批处理函数来自动化提取过程。以下是一个实用的批量提取示例:
python
from spire.pdf.common import *
from spire.pdf import *
import os
def ExtractContentFromPdfFolder(input_folder: str, output_folder: str):
"""从文件夹中的所有 PDF 文件提取文本和图片"""
# 如果输出文件夹不存在则创建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
if filename.endswith(".pdf"):
# 构建完整的文件路径
input_path = os.path.join(input_folder, filename)
base_name = os.path.splitext(filename)[0]
# 创建子文件夹存放提取的内容
content_folder = os.path.join(output_folder, base_name)
if not os.path.exists(content_folder):
os.makedirs(content_folder)
# 加载 PDF 文档
doc = PdfDocument()
doc.LoadFromFile(input_path)
# 提取文本和图片
all_text = []
image_count = 0
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 提取文本
textExtractor = PdfTextExtractor(page)
options = PdfTextExtractOptions()
text = textExtractor.ExtractText(options)
all_text.append(f"--- 第 {i+1} 页 ---\n{text}")
# 提取图片
imageHelper = PdfImageHelper()
imageInfo = imageHelper.GetImagesInfo(page)
for info in imageInfo:
image_count += 1
img_path = os.path.join(content_folder, f"Image-{image_count}.png")
info.Image.Save(img_path)
# 保存文本
text_file = os.path.join(content_folder, "extracted_text.txt")
with open(text_file, "w", encoding="utf-8") as fp:
for t in all_text:
fp.write(t + "\n\n")
doc.Close()
print(f"已处理: {filename} (提取了 {image_count} 张图片)")
# 使用示例
input_folder = "./PDF文档"
output_folder = "./提取内容"
ExtractContentFromPdfFolder(input_folder, output_folder)
数据录入自动化
从 PDF 表单或报告中提取特定区域的文本,自动填充到数据库或电子表格中,减少人工录入的工作量和错误率。
素材库建设
设计师可以从大量的 PDF 宣传材料中提取图片资源,建立可重用的素材库,提高设计效率。
文档数字化
将纸质文档扫描成的 PDF 进行内容提取,转换为可搜索、可编辑的数字格式,便于长期保存和检索。
实用技巧
在进行 PDF 内容提取时,以下技巧可以帮助获得更好的结果:
- 坐标定位:提取特定区域文本时,可以使用 PDF 阅读器查看页面属性来确定准确的坐标值
- 编码处理:保存提取的文本时务必使用 UTF-8 编码,以正确处理中文等特殊字符
- 图片格式:根据实际需求选择合适的图片输出格式(PNG 适合图形,JPG 适合照片)
- 分页处理:对于多页文档,建议在提取的文本中加入页码标记,便于后续定位
- 异常处理:某些 PDF 可能包含加密或损坏的内容,应添加适当的错误处理机制
总结
通过本文的介绍,我们学习了使用 Python 和 Spire.PDF 库提取 PDF 内容的多种方法:
- 使用
PdfTextExtractor提取整页或特定区域的文本 - 通过
ImagesInfo或PdfImageHelper提取页面中的图片 - 利用 PDF 到 Excel 的转换功能间接提取表格数据
- 实现批量提取功能处理多个文档
这些技术为 PDF 文档的内容再利用提供了强大的工具。掌握这些技能后,您将能够高效地从 PDF 文件中提取所需的信息,将静态文档转换为有价值的数据资源,显著提升工作效率和数据处理的灵活性。