用Python代码批量提取PDF文件中的表格

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

  • 用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. 释放资源。

代码示例:

python 复制代码
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. 释放资源。

代码示例:

python 复制代码
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教程。

申请免费许可加粗样式

相关推荐
程序 代码狂人43 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521591 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿1 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521592 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港2 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987372 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying88382 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
人工智能导论实践课2 小时前
【GUI桌面开发3】PyCharm配置外部工具
ide·python·pycharm
一千柯橘2 小时前
LangChain 的实时输出处理: stream_events 和 Streaming
python·langchain·agent
贾公子2 小时前
图片 AIGC 检测接入实战——URL 与 Base64 的取舍、体积校验与「你送过去的可能不是那张图」
python·aigc