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

代码示例:

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教程。

申请免费许可加粗样式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32——DAC篇(基于f103)

技术笔记! 一、DAC简介(了解) 1.1 DAC概念 传感器信号采集改变电信号,通过ADC转换成单片机可以处理的数字信号,处理后,通过DAC转换成电信号,进而实现对系统的控制。 1.2 DAC的特性参数 1.3…

你以为的私域是真正的私域嘛??你的私域流量真的属于你嘛?

大家好 我是一个软件开发公司的产品经理 专注私域电商行业7年有余 您的私域流量是真正的属于你自己嘛? 私域的定义 私域的界定:一个互联网私有数据(资产)积蓄的载体。这个载体的数据权益私有,且具备用户规则制定权…

继承和多态

目录: 1. 继承 2. 多态: 转型 重写 正文: 1. 继承: 观察以下代码: 我们发现Cat类和Dog类中有许多相同的属性,那不妨思考一下是否能有一种办法能把它们的相同点都归结到一块儿呢? 当然有,它就…

【html】网页布局模板01---简谱风

模板效果: 这是一种最简单,最干净的一种网页布局。 模板介绍: 模板概述: 这个模板是一个基础的网页布局模板,包括一个头部区域(header),其中包含网站标题(logo)和导航菜单(nav),以及一个页脚区域(copy),用于显示版权信息。整体布局简洁明了,适合作为各种类…

构建全面的无障碍学习环境:科技之光,照亮学习之旅

在信息与科技日益发展的当下,为所有人群提供一个包容和平等的学习环境显得尤为重要,特别是对于盲人朋友而言,无障碍学习环境的构建成为了一项亟待关注与深化的课题。一款名为“蝙蝠避障”的辅助软件,以其创新的设计理念与实用功能…

贪心算法--区间调度问题

贪心算法 引言 贪心算法是一种简单而有效的算法设计技巧,在解决一些优化问题时具有广泛的应用。其基本思想是通过每一步的局部最优选择,最终达到全局最优解。贪心算法通常不会回溯之前的决策,而是根据当前状态作出最优决策,因此…

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素(IP地址,端口号,协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…

UWA DAY 2024 正式启动|创新潜藏无限可能

备受期待的UWA DAY 2024即将盛大开幕!由侑虎科技UWA主办的这场年度游戏开发者大会,以“创新潜藏无限可能”为主题,致力于为游戏开发者呈现最前沿的技术盛宴。 大会定于2024年9月7日至9月8日(周六、周日)在上海举行&am…

YOLOv9改进策略 | 图像去雾 | 利用图像去雾网络UnfogNet辅助YOLOv9进行图像去雾检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv9针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv9的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可…

【R语言】ggplot中点的样式shape参数汇总

ggplot中点的样式展示&#xff1a; library(ggplot2)# 创建数据框 a<- data.frame(x 0:25, y 0:25) # 创建散点图 ggplot(a, aes(x x, y y, shape as.factor(y))) geom_point(size 4) scale_shape_manual(values 0:25) labs(shape "形状") theme(legend.…

k8s二进制安装与部署

目录 一、实验目的 二、实验环境 三、实验步骤 3.1 操作系统初始化配置 3.2 部署 docker引擎 3.3 部署 etcd 集群 3.3.1 在 master01 节点上操作 ​3.3.2 在 node01 节点上操作 3.3.3 在 node02 节点上操作 3.4 部署 Master 组件 3.4.1 在 mast…

【QT实战】汇总导航

✨Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆…

EN6347QI 开关稳压器 4A 贴片QFN-38 参数资料 应用案例 相关型号

EN6347QI 是一款直流/直流开关转换器。它是一款高效率的 buck (降压) 转换器&#xff0c;内置了电感器&#xff0c;能够提供高达 4A 的输出电流。其工作电压范围为 4.5V 至 12V&#xff0c;输出电压可调&#xff0c;最高可达 15V。EN6347QI 适合于各种电子设备中&#xff0c;用…

C#学习指南:重要内容与实用技巧

学习C#编程是一段充满挑战但又非常充实的旅程。以下是我在学习过程中积累的一些经验&#xff0c;希望能对大家有所帮助。 一、掌握基础概念 类及其成员 C#中的类是编程的基础模块。理解类的结构、属性、方法和构造函数是至关重要的。每个类都有其特定的功能&#xff0c;学会如…

【Linux网络编程】IO多种转接之Reactor

Reactor 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 基于上一篇epoll的学习&#xff0c;现在我们也知道epoll的工作模式有两种&#xff0c…

JavaScript Window对象

一、BOM&#xff08;浏览器对象模型&#xff09; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象。 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的。 所有通过var定义在全局作用域中的变量、…

JAVASE之类和对象(1)

路虽远&#xff0c;行则将至&#xff1b;事虽难&#xff0c;做则必成。 主页&#xff1a;趋早——Step 专栏&#xff1a;JAVASE gitte&#xff1a;https://gitee.com/good-thg 引言&#xff1a; 这篇文章我们只介绍前半部分&#xff0c;下一篇文章会介绍剩下的部分。 目录 一、…

电路仿真软件:点亮教学新篇章,十大便利助力高效学习

在信息化时代的浪潮中&#xff0c;电路仿真软件以其独特的优势&#xff0c;逐渐在教学领域崭露头角。它不仅能够帮助学生更好地理解电路知识&#xff0c;还能提升教师的教学效果。接下来&#xff0c;让我们一起探讨电路仿真软件对教学带来的十大便利。 一、直观展示电路原理 电…

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m&#xff0c;别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…

MSI U盘重装系统

MSI U盘重装系统 1. 准备一块U盘 首先需要将U盘格式化&#xff0c;这个格式化并不是在文件管理中将U盘里面的所有东西都删干净就可以了&#xff0c;需要在磁盘管理中&#xff0c;将这块U盘格式化&#xff0c;如果这块U盘有分区的话&#xff0c;那将所有的分区都格式化并且删除…