甜蜜的工厂
108.96M · 2026-04-23
PDF 文档作为一种广泛使用的文件格式,常常包含丰富的内容元素——从简单的文字段落,到复杂的数据表格,再到精美的图片和图表。当我们需要对这些内容进行二次利用或数据分析时,如何高效地从 PDF 中提取这些不同类型的元素就成为了一个关键问题。
本文将介绍如何使用 Python 和 Spire.PDF 库来提取 PDF 文件中的文本、表格和图片,帮助您将静态的 PDF 文档转换为可编辑、可分析的数据资源。
从 PDF 中提取内容在实际工作中有着广泛的应用场景:
通过 Python 自动化这些提取操作,可以显著减少手动复制粘贴的工作量,并提高数据处理的准确性。
首先,需要安装 Spire.PDF for Python 库。可以通过 pip 命令轻松完成安装:
pip install Spire.PDF
安装完成后,即可在 Python 脚本中导入该库并使用其提供的内容提取功能。
最基础的提取操作是从 PDF 页面中提取所有文本内容。Spire.PDF 提供了 PdfTextExtractor 类来实现这一功能,它能够智能识别页面中的文本布局并保持原有的阅读顺序。
以下代码展示了如何从 PDF 的第一页提取文本并保存到文件:
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()
这个示例展示了文本提取的基本流程:
PdfTextExtractor 对象用于文本提取PdfTextExtractOptions 选项(可选)ExtractText 方法提取文本内容PdfTextExtractOptions 允许您自定义提取行为,例如是否保留空白字符、如何处理换行符等,这为不同场景下的文本提取提供了灵活性。
有时候我们只对 PDF 页面中的某个特定区域感兴趣,比如表单字段、标题部分或某个数据块。Spire.PDF 支持通过定义矩形区域来精确提取指定范围内的文本。
以下示例演示了如何从页面的特定矩形区域提取文本:
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 参数的设置:
通过精确控制这些参数,您可以只提取感兴趣的区域,避免获取无关内容。这种方法特别适合处理结构化的 PDF 表单、发票或报表。
PDF 文档中的图片可能是产品照片、图表、Logo 或其他视觉元素。Spire.PDF 提供了高效的方法来提取这些图片,最常用的方式是借助 PdfImageHelper 工具类。
以下代码展示了如何遍历 PDF 页面中的所有图片并将其保存为单独的 PNG 文件:
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()
核心步骤说明:
image_helper.GetImagesInfo(page) 获取包含图片数据及其元数据的集合。image_info.Image.Save() 方法直接将图片对象导出。Spire.PDF 会自动处理图像解码,确保提取出的图片保持高质量。如果需要一次性获取页面中的所有内容,可以将 PdfTextExtractor 与 PdfImageHelper 结合使用。这种方法非常适合需要对文档进行内容索引或归档的自动化任务。
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 文档中常见的数据结构,但也是最难准确提取的元素之一。Spire.PDF 提供了将 PDF 转换为 Excel 的功能,通过这种方式可以间接提取表格数据。
通过 PdfTableExtractor 类,可以精确识别并提取 PDF 中的表格结构。这种方法允许开发者遍历每一行和每一列,将数据按原样填入 Excel 工作表或保存为 CSV 格式,便于后续的数据处理。
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 文件时,可以编写批处理函数来自动化提取过程。以下是一个实用的批量提取示例:
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 + "nn")
doc.Close()
print(f"已处理: {filename} (提取了 {image_count} 张图片)")
# 使用示例
input_folder = "./PDF文档"
output_folder = "./提取内容"
ExtractContentFromPdfFolder(input_folder, output_folder)
从 PDF 表单或报告中提取特定区域的文本,自动填充到数据库或电子表格中,减少人工录入的工作量和错误率。
设计师可以从大量的 PDF 宣传材料中提取图片资源,建立可重用的素材库,提高设计效率。
将纸质文档扫描成的 PDF 进行内容提取,转换为可搜索、可编辑的数字格式,便于长期保存和检索。
在进行 PDF 内容提取时,以下技巧可以帮助获得更好的结果:
通过本文的介绍,我们学习了使用 Python 和 Spire.PDF 库提取 PDF 内容的多种方法:
PdfTextExtractor 提取整页或特定区域的文本ImagesInfo 或 PdfImageHelper 提取页面中的图片这些技术为 PDF 文档的内容再利用提供了强大的工具。掌握这些技能后,您将能够高效地从 PDF 文件中提取所需的信息,将静态文档转换为有价值的数据资源,显著提升工作效率和数据处理的灵活性。