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 转换为 Excel 提取表格
通过将 PDF 转换为 XLSX 格式,可以将 PDF 中的表格数据提取到 Excel 工作表中,便于后续的分析和处理:
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()

实际应用
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 文件中提取所需的信息,将静态文档转换为有价值的数据资源,显著提升工作效率和数据处理的灵活性。