使用 Python 提取 PDF 文件中的文本、表格、图片

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()

这个示例展示了文本提取的基本流程:

  1. 加载 PDF 文档并获取目标页面
  2. 创建 PdfTextExtractor 对象用于文本提取
  3. 配置 PdfTextExtractOptions 选项(可选)
  4. 调用 extract_text 方法提取文本内容
  5. 将结果保存到文本文件

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()

核心步骤说明:

  1. 实例化 PdfImageHelper:这是提取图片的核心辅助类。
  2. 获取图片信息:通过 image_helper.get_images_info(page) 获取包含图片数据及其元数据的集合。
  3. 直接保存:利用 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()

核心步骤说明:

  1. 创建 PdfTableExtractor 对象:用于提取 PDF 中的表格数据。
  2. 提取表格:通过 extract_tables(page) 方法获取页面中的所有表格。
  3. 保存到 Excel:将提取的表格数据逐行逐列写入 Excel 工作表,并保存为文件。

总结

本文介绍了如何使用 Python 和 Spire.PDF 库从 PDF 文件中提取文本、表格和图片。通过这些方法,可以将静态的 PDF 文档转换为可编辑、可分析的数据资源,提高数据处理的效率和准确性。建议读者根据实际需求选择合适的提取方法,并结合具体的业务场景进行应用。希望本文对您的工作有所帮助。