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

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

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

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

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

核心步骤说明:

  1. 实例化 PdfImageHelper:这是提取图片的核心辅助类。
  2. 获取图片信息 :通过 image_helper.GetImagesInfo(page) 获取包含图片数据及其元数据的集合。
  3. 直接保存 :利用 image_info.Image.Save() 方法直接将图片对象导出。Spire.PDF 会自动处理图像解码,确保提取出的图片保持高质量。

同时提取文本和图片

如果需要一次性获取页面中的所有内容,可以将 PdfTextExtractorPdfImageHelper 结合使用。这种方法非常适合需要对文档进行内容索引或归档的自动化任务。

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 提取整页或特定区域的文本
  • 通过 ImagesInfoPdfImageHelper 提取页面中的图片
  • 利用 PDF 到 Excel 的转换功能间接提取表格数据
  • 实现批量提取功能处理多个文档

这些技术为 PDF 文档的内容再利用提供了强大的工具。掌握这些技能后,您将能够高效地从 PDF 文件中提取所需的信息,将静态文档转换为有价值的数据资源,显著提升工作效率和数据处理的灵活性。

相关推荐
郝学胜-神的一滴2 小时前
深度学习入门:极简神经网络搭建与参数计算全攻略
人工智能·pytorch·python·深度学习·神经网络·机器学习
2301_796588502 小时前
Navicat连ClickHouse出现中文乱码怎么办_字符集编码调整
jvm·数据库·python
编码者卢布2 小时前
【App Service】常规排查 App Service 启动 Application Insights 无数据的步骤 (.NET版本)
python·flask·.net
hljqfl2 小时前
银河麒麟安装PDF虚拟打印机
linux·运维·pdf
2401_837163892 小时前
CSS如何处理带有状态切换的折叠菜单_利用BEM修饰符管理状态
jvm·数据库·python
m0_617881422 小时前
Navicat连接MariaDB报1045密码错误怎么办_权限排查与解决
jvm·数据库·python
m0_515098422 小时前
C#怎么操作WPF数据模板 C#如何用DataTemplate定义集合项的显示样式和布局【控件】
jvm·数据库·python
qq_654366982 小时前
golang如何实现告警分级与升级_golang告警分级与升级实现步骤
jvm·数据库·python
2401_897190552 小时前
Redis怎样在Spring中执行批量Pipeline指令
jvm·数据库·python