PDF文档中常常包含大量数据,尤其是官方报告、学术论文、财务报表等文档,往往包含了结构化的表格数据。表格作为承载关键信息的载体,其内容的准确提取对于数据分析、研究论证乃至业务决策具有重大意义。然而,PDF格式虽保证了文档的跨平台一致性,却给数据的直接提取和利用设置了障碍。掌握如何用Python高效地从PDF文档中提取表格,可以提升我们的数据处理能力、加速信息流转的能力。本文介绍如何利用Python来快速提取PDF文档中的表格数据,以及将表格数据保存到Excel表格和CSV文件。

  • 用Python提取PDF文档中的表格数据
  • 提取PDF文档中的表格并保存到Excel文件

本文所使用的方法需要用到Spire.PDF for Python,可通过PyPI安装:pip install Spire.PDF

提取PDF文档中的表格数据

PdfTableExtractor(PdfDocument) 类可以用于处理PDF文档表格提取工作。创建好此类的实例之后,再使用 PdfTableExtractor.ExtractTable(int: page index) 方法就可以提取到指定页面上的所有表格了。获取到表格之后,我们就可以使用 PdfTable.GetText(int: row index, int column index) 方法提取表格数据保存到其他位置了。
以下是提取PDF表格并保存到文本的操作步骤:

  1. 导入所需模块。
  2. 创建 PdfDocument 实例,并使用 PdfDocument.LoadFromFile() 方法载入PDF文档。
  3. 创建一个列表储存表格数据,再使用文档创建一个 PdfTableExtractor 实例。
  4. 遍历文档页面,使用 PdfTableExtractor.ExtractTable(int: page index) 方法提取页面上的表格。
  5. 遍历每个提取到的表格,为每个表格创建字符串对象,再使用 PdfTable.GetText(int: row index, int column index) 方法获取表格数据并添加到字符串中。
  6. 将每个表格保存为一个文本文件。
  7. 释放资源。

代码示例:

from spire.pdf import *
from spire.pdf.common import *

# 创建PdfDocument类的实例
pdf = PdfDocument()

# 加载PDF文件
pdf.LoadFromFile("示例.pdf")

# 创建列表
list = []

# 创建PdfTableExtractor对象
extractor = PdfTableExtractor(pdf)

# 遍历文档的页面
for pageIndex in range(pdf.Pages.Count):
    # 从页面提取表格
    tableList = extractor.ExtractTable(pageIndex)

    # 检查表格列表是否不为空且列表不为空
    if tableList is not None and len(tableList) > 0:
        # 遍历列表中的表格
        for table in tableList:
            tableData = ''
            # 获取行数和列数
            row = table.GetRowCount()
            column = table.GetColumnCount()

            # 遍历表格的行和列
            for i in range(row):
                for j in range(column):
                    # 从单元格获取文本
                    text = table.GetText(i, j)

                    # 将文本添加到列表中
                    tableData += text + " "
                tableData += "\n"
        list.append(tableData)

# 将每个表格保存为txt文件
for i in range(len(list)):
    fileName = "output/Tables/ExtractedPDFTables{0}.txt".format(i)
    with open(fileName, "w") as f:
        f.writelines(list[i])

# 释放资源
pdf.Close()

提取结果:

提取PDF文档中的表格并保存到CSV文件

在提取表格数据时,我们可以结合Spire.XLS for Python库(pip install Spire.XLS)来直接将表格数据写入Excel文件中。以下是操作步骤:

  1. 导入所需模块。
  2. 创建一个 PdfDocument 类的实例。
  3. 使用 PdfDocument.LoadFromFile() 方法加载一个示例PDF文档。
  4. 创建一个 Workbook 类的实例,并清除其中的默认工作表。
  5. 遍历PDF文档中的页面。
  6. 使用 PdfTableExtractor.ExtractTable() 方法从页面中提取表格。
  7. 遍历提取出的表格。
  8. 对于每个表格,使用 Workbook.Worksheets.Add() 方法向工作簿中添加一个工作表。
  9. 使用 PdfTable.GetText() 方法获取表格中单元格的文本。
  10. 使用 Worksheet.Range[rowIndex, columnIndex].Value 属性将文本写入工作表中的特定单元格。
  11. 使用 Workbook.SaveToFile() 方法将结果工作簿保存为Excel文件。
  12. 释放资源。

代码示例:

from spire.pdf import *
from spire.xls import *

# 创建一个PdfDocument对象
doc = PdfDocument()

# 加载示例PDF文件
doc.LoadFromFile("示例.pdf")

# 创建一个Workbook对象
workbook = Workbook()

# 清除默认的工作表
workbook.Worksheets.Clear()

# 创建一个PdfTableExtractor对象
extractor = PdfTableExtractor(doc)

sheetNumber = 1

# 循环遍历页面
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

            # 自动调整列宽
            sheet.AllocatedRange.AutoFitColumns()

            sheetNumber += 1

# 保存到文件
workbook.SaveToFile("output/Tables/PDF表格到Excel文件.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

提取的表格:

本文演示了如何使用Python提取PDF文档中的表格数据,并将其保存到文本文件或Excel文件。

更多PDF文档操作技巧请前往Spire.PDF for Python教程

申请免费许可


大丸子
12 声望3 粉丝