使用 Python 提取 PDF 文件中的文本、表格、图片
- Python
- 3天前
- 6热度
- 0评论
PDF 文档作为一种广泛使用的文件格式,常常包含丰富的内容元素——从简单的文字段落,到复杂的数据表格,再到精美的图片和图表。当我们需要对这些内容进行二次利用或数据分析时,如何高效地从 PDF 中提取这些不同类型的元素就成为了一个关键问题。
本文将介绍如何使用 Python 和 Spire.PDF 库来提取 PDF 文件中的文本、表格和图片,帮助读者将静态的 PDF 文档转换为可编辑、可分析的数据资源。
为什么需要提取 PDF 内容?
从 PDF 中提取内容在实际工作中有着广泛的应用场景:
- 数据再利用:从报告或文档中提取文本内容,用于其他文档或系统
- 数据分析:提取表格数据进行统计分析或导入数据库
- 素材收集:提取图片用于演示文稿、网站或其他设计项目
- 内容归档:将 PDF 内容转换为结构化格式便于检索和管理
- 自动化处理:批量提取多个文档的内容,提高工作效率
通过 Python 自动化这些提取操作,可以显著减少手动复制粘贴的工作量,并提高数据处理的准确性。
环境准备
首先,需要安装 Spire.PDF for Python 库。可以通过 pip 命令轻松完成安装:
pip install Spire.PDF安装完成后,即可在 Python 脚本中导入该库并使用其提供的内容提取功能。
提取 PDF 中的文本
提取整页文本
最基础的提取操作是从 PDF 页面中提取所有文本内容。Spire.PDF 提供了 PdfTextExtractor 类来实现这一功能,它能够智能识别页面中的文本布局并保持原有的阅读顺序。
以下代码展示了如何从 PDF 的第一页提取文本并保存到文件:
from spire.pdf.common import *
from spire.pdf import *
def write_all_text(fname: str, text: List[str]):
"""辅助函数:将文本列表写入文件"""
with open(fname, "w", encoding="utf-8") as fp:
for s in text:
fp.write(s)
input_file = "./data/sample.pdf"
output_file = "extracted_text.txt"
doc = PdfDocument()
doc.load_from_file(input_file)
page = doc.pages[0]
text_extractor = PdfTextExtractor(page)
option = PdfTextExtractOptions()
text = text_extractor.extract_text(option)
write_all_text(output_file, text)
doc.close()这个示例展示了文本提取的基本流程:
- 加载 PDF 文档并获取目标页面
- 创建 PdfTextExtractor 对象用于文本提取
- 配置 PdfTextExtractOptions 选项(可选)
- 调用 extract_text 方法提取文本内容
- 将结果保存到文本文件
PdfTextExtractOptions 允许您自定义提取行为,例如是否保留空白字符、如何处理换行符等,这为不同场景下的文本提取提供了灵活性。
提取特定区域的文本
有时候我们只对 PDF 页面中的某个特定区域感兴趣,比如表单字段、标题部分或某个数据块。Spire.PDF 支持通过定义矩形区域来精确提取指定范围内的文本。
以下示例演示了如何从页面的特定矩形区域提取文本:
from spire.pdf.common import *
from spire.pdf import *
def write_all_text(fname: str, text: List[str]):
"""辅助函数:将文本写入文件"""
with open(fname, "w", encoding="utf-8") as fp:
for s in text:
fp.write(s)
input_file = "./data/sample.pdf"
output_file = "extracted_text_from_area.txt"
pdf = PdfDocument()
pdf.load_from_file(input_file)
page = pdf.pages[0]
# RectangleF 参数:x坐标, y坐标, 宽度, 高度
pdf_text_extractor = PdfTextExtractor(page)
pdf_text_extract_options = PdfTextExtractOptions()
pdf_text_extract_options.extract_area = RectangleF(80.0, 180.0, 500.0, 200.0)
text = pdf_text_extractor.extract_text(pdf_text_extract_options)
write_all_text(output_file, [text])
pdf.close()这段代码的关键在于 RectangleF 参数的设置:
- x坐标和y坐标:定义矩形区域左上角的位置(单位为点,1点=1/72英寸)
- 宽度和高度:定义提取区域的大小
通过精确控制这些参数,您可以只提取感兴趣的区域,避免获取无关内容。这种方法特别适合处理结构化的 PDF 表单、发票或报表。
提取 PDF 中的图片
PDF 文档中的图片可能是产品照片、图表、Logo 或其他视觉元素。Spire.PDF 提供了高效的方法来提取这些图片,最常用的方式是借助 PdfImageHelper 工具类。
使用 PdfImageHelper 提取图片
以下代码展示了如何遍历 PDF 页面中的所有图片并将其保存为单独的 PNG 文件:
from spire.pdf.common import *
from spire.pdf import *
doc = PdfDocument()
doc.load_from_file("./data/sample.pdf")
image_helper = PdfImageHelper()
image_count = 1
for i in range(doc.pages.count):
# 获取当前页面中的图片信息集合
images_info = image_helper.get_images_info(doc.pages[i])
# 遍历图片信息并保存图片
for j in range(len(images_info)):
image_info = images_info[j]
# 设置输出文件名
output_file = f"image_{image_count}.png"
# 直接通过 Image 对象保存文件
image_info.image.save(output_file)
image_count += 1
doc.close()核心步骤说明:
- 实例化 PdfImageHelper:这是提取图片的核心辅助类。
- 获取图片信息:通过 image_helper.get_images_info(page) 获取包含图片数据及其元数据的集合。
- 直接保存:利用 image_info.image.save() 方法直接将图片对象导出。Spire.PDF 会自动处理图像解码,确保提取出的图片保持高质量。
同时提取文本和图片
如果需要一次性获取页面中的所有内容,可以将 PdfTextExtractor 与 PdfImageHelper 结合使用。这种方法非常适合需要对文档进行内容索引或归档的自动化任务。
from spire.pdf import *
import os
input_file = "./data/sample.pdf"
doc = PdfDocument()
doc.load_from_file(input_file)
sbuffer = []
images = []
image_helper = PdfImageHelper()
for i in range(doc.pages.count):
page = doc.pages[i]
# 创建 PdfTextExtractor 对象并提取文本
pdf_text_extractor = PdfTextExtractor(page)
pdf_text_extract_options = PdfTextExtractOptions()
sbuffer.append(pdf_text_extractor.extract_text(pdf_text_extract_options))
# 获取页面中的所有图片并存入缓存
image_info = image_helper.get_images_info(page)
for info in image_info:
images.append(info.image)
file_name = "extracted_content.txt"
with open(file_name, "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("./data", f"image_{index}.png")
img.save(img_path)
doc.close()这种方法的优势在于可以统一处理文档的各种媒体元素,并能够通过循环结构轻松实现批量提取,是处理复杂 PDF 文档的标准做法。
提取 PDF 中的表格
表格是 PDF 文档中常见的数据结构,但也是最难准确提取的元素之一。Spire.PDF 提供了将 PDF 转换为 Excel 的功能,通过这种方式可以间接提取表格数据。
提取 PDF 表格并保存为数据文件
通过 PdfTableExtractor 类,可以精确识别并提取 PDF 中的表格结构。这种方法允许开发者遍历每一行和每一列,将数据按原样填入 Excel 工作表或保存为 CSV 格式,便于后续的数据处理。
from spire.pdf import *
from spire.pdf.common import *
from spire.xls import *
doc = PdfDocument()
doc.load_from_file("./data/sample.pdf")
workbook = Workbook()
workbook.worksheets.clear()
extractor = PdfTableExtractor(doc)
sheet_number = 1
for i in range(doc.pages.count):
page = doc.pages[i]
# 提取页面中的所有表格
tables = extractor.extract_tables(page)
# 遍历每个表格并将其保存到 Excel 工作表
for table in tables:
worksheet = workbook.create_worksheet(f"Sheet{sheet_number}")
sheet_number += 1
# 遍历表格的每一行
for row_index, row in enumerate(table.rows):
# 遍历行中的每一列
for col_index, cell in enumerate(row.cells):
# 将单元格内容写入 Excel 单元格
worksheet.set_value(row_index, col_index, cell.text)
workbook.save_to_file("extracted_tables.xlsx")
doc.close()核心步骤说明:
- 创建 PdfTableExtractor 对象:用于提取 PDF 中的表格数据。
- 提取表格:通过 extract_tables(page) 方法获取页面中的所有表格。
- 保存到 Excel:将提取的表格数据逐行逐列写入 Excel 工作表,并保存为文件。
总结
本文介绍了如何使用 Python 和 Spire.PDF 库从 PDF 文件中提取文本、表格和图片。通过这些方法,可以将静态的 PDF 文档转换为可编辑、可分析的数据资源,提高数据处理的效率和准确性。建议读者根据实际需求选择合适的提取方法,并结合具体的业务场景进行应用。希望本文对您的工作有所帮助。