用Python将PDF表格提取到文本、CSV和Excel文件中
从PDF文档中提取表格并将其转换为更易于处理的格式(如文本、CSV和Excel文件),是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理,使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文,还是包含结构化信息的其他文档,掌握这些表格准确转换的方法对于充分发挥数据潜力至关重要。
本文将介绍如何使用简单的Python代码从PDF文档中提取表格数据并将其写入文本、CSV和Excel文件,从而轻松实现PDF表格的自动化提取。
文章目录
- 如何使用Python提取PDF表格数据
- 用Python将PDF表格数据提取为文本文件
- 用Python将PDF表格数据提取为CSV文件
- 用Python将PDF表格数据提取到Excel工作表
- 使用Python直接将PDF转换为Excel文件
本文所需的库为Spire.PDF for Python。可通过PyPI安装:pip install spire.pdf。
用于操作的示例PDF

如何使用Python提取PDF表格数据
库中的PdfTableExtractor类用于处理PDF文档的表格提取。可以通过PdfTableExtractor.ExtractTable(pageIndex: int)方法从PDF页面中提取表格,并以Utilities_PdfTable对象的集合形式返回表格数据。接着,可通过遍历表格并使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取每个单元格中的数据。
提取PDF表格数据的一般步骤如下:
- 创建一个
PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。 - 使用该文档创建
PdfTableExtractor实例。 - 使用
PdfTableExtractor.ExtractTable(pageIndex: int)方法提取文档中每页的表格。 - 遍历每个表格并使用
Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取单元格值。 - 将提取的表格数据写入其他文件。
注意:当使用提取的表格数据构建字符串时,如果单元格文本中包含换行符,最终生成的文本文件中可能会多出额外的换行符。为了避免造成混淆,应将这些换行符去除或替换为空格。
用Python将PDF表格数据提取为文本文件
提取PDF文档中的表格数据后,可直接将每个表格的数据写入字符串并保存到文本文件中,从而实现将PDF表格数据导出为文本文件。
具体步骤如下:
- 导入所需模块:
PdfDocument和PdfTableExtractor。 - 创建
PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。 - 使用该文档创建
PdfTableExtractor实例。 - 使用
PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。 - 遍历提取的表格:
- 创建一个
str对象以存储表格数据。 - 使用
Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取单元格值。 - 将单元格值追加到
str对象中。 - 将
str对象写入文件。
- 创建一个
- 释放资源。
代码示例
from spire.pdf import PdfDocument, PdfTableExtractor# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)# 遍历所有页面
for pageIndex in range(pdf.Pages.Count):# 从每个 PDF 页面中提取表格tables = extractor.ExtractTable(pageIndex)# 如果存在多个表格,则遍历这些表格if tables is not None:for tableIndex in range(len(tables)):# 获取一个表格table = tables[tableIndex]# 创建一个字符串对象来存储表格数据tableData = ""# 遍历表格的行和列for rowIndex in range(table.GetRowCount()):for colIndex in range(table.GetColumnCount()):# 获取单元格文本text = table.GetText(rowIndex, colIndex)text = text.replace("\n", " ")# 将单元格文本添加到表格数据中tableData += textif colIndex < table.GetColumnCount() - 1:tableData += "\t"tableData += "\n"# 将表格数据写入文本文件with open(f"output/Tables/Page{pageIndex+1}-Table{tableIndex+1}.txt", "w", encoding="utf-8") as f:f.write(tableData)# 释放资源
pdf.Dispose()
输出结果

用Python将PDF表格数据提取为CSV文件
同样,可以使用类似方法从PDF文档中提取表格数据,并利用Python标准库中的CSV模块将每个表格写入CSV文件。在此过程中也需注意去除或替换换行符,以改善CSV文件的结果。具体步骤如下:
- 导入所需模块:
PdfDocument、PdfTableExtractor和CSV。 - 创建
PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。 - 使用该文档创建
PdfTableExtractor实例。 - 使用
PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。 - 遍历提取的表格:
- 创建CSV文件。
- 遍历表格中的行并创建列表以存储行数据。
- 使用
Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取每行的单元格值并追加到列表中。 - 使用csv.writer().writerow()方法将每行写入CSV文件。
- 释放资源。
代码示例
from spire.pdf import PdfDocument, PdfTableExtractor
import csv# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)# 遍历所有页面
for pageIndex in range(pdf.Pages.Count):# 从每个 PDF 页面中提取表格tables = extractor.ExtractTable(pageIndex)# 如果存在多个表格,则遍历这些表格if tables is not None:for tableIndex in range(len(tables)):# 获取一个表格table = tables[tableIndex]# 创建一个 CSV 文件with open("output/Tables/Page" + str(pageIndex+1) + "-Table" + str(tableIndex+1) + ".csv", "w", newline='', encoding='utf-8') as csvFile:writer = csv.writer(csvFile)# 遍历表格的行和列for rowIndex in range(table.GetRowCount()):row = []for colIndex in range(table.GetColumnCount()):# 获取单元格文本text = table.GetText(rowIndex, colIndex)text = text.replace('\n', ' ')row.append(text)writer.writerow(row)# 释放资源
pdf.Dispose()
输出结果

用Python将PDF表格数据提取到Excel工作表
可使用另一库Spire.XLS for Python将提取的PDF表格数据写入Excel工作表。通过PyPI获取Spire.PDF for Python:pip install spire.xls。
具体步骤如下:
- 导入所需模块:
PdfDocument、PdfTableExtractor、Workbook和spire.xls.FileFormat。 - 创建
PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。 - 创建
Workbook实例用于存储表格,并使用Workbook.Worksheets.Clear()方法清除默认工作表。 - 使用该文档创建
PdfTableExtractor实例。 - 使用
PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。 - 遍历提取的表格:
- 使用
Workbook.Worksheets.Add(sheetName: str)方法为每个表格添加工作表。 - 使用
Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取表格的单元格值。 - 通过
Worksheet.Range[rowIndex + 1, colIndex + 1].Text属性将单元格值写入相应的工作表单元格。
- 使用
- 使用
Workbook.SaveToFile()方法保存工作簿。 - 释放资源。
代码示例
from spire.pdf import PdfDocument, PdfTableExtractor
from spire.xls import Workbook, FileFormat, HorizontalAlignType# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")# 创建一个 Workbook 对象
workbook = Workbook()
# 清除默认的工作表
workbook.Worksheets.Clear()# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)# 从每个 PDF 页面中提取表格
for pageIndex in range(pdf.Pages.Count):tables = extractor.ExtractTable(pageIndex)# 如果存在多个表格,则遍历这些表格if tables is not None:for tableIndex in range(len(tables)):# 获取一个表格table = tables[tableIndex]# 为表格创建一个工作表sheet = workbook.Worksheets.Add(f"Page{pageIndex + 1}-Table{tableIndex + 1}")# 遍历表格的行和列for rowIndex in range(table.GetRowCount()):for colIndex in range(table.GetColumnCount()):# 获取单元格值text = table.GetText(rowIndex, colIndex)cellText = text.replace("\n", "")# 将单元格值写入工作表的相应单元格sheet.Range[rowIndex + 1, colIndex + 1].Text = cellText# 可选:自定义表格的外观# 设置标题行样式sheet.Rows.get_Item(0).Style.Font.FontName = "Yu Gothic UI"sheet.Rows.get_Item(0).Style.Font.Size = 12sheet.Rows.get_Item(0).Style.Font.IsBold = Truesheet.Rows.get_Item(0).Style.HorizontalAlignment = HorizontalAlignType.Center# 设置数据行样式for i in range(1, sheet.Rows.Count):sheet.Rows.get_Item(i).Style.Font.FontName = "Yu Gothic UI"sheet.Rows.get_Item(i).Style.Font.Size = 12sheet.Rows.get_Item(i).Style.HorizontalAlignment = HorizontalAlignType.Left# 自动调整列宽for j in range(1, sheet.Columns.Count):sheet.AutoFitColumn(j)# 保存工作簿
workbook.SaveToFile("output/PDFTableToExcel.xlsx", FileFormat.Version2016)
# 释放资源
workbook.Dispose()
pdf.Close()
输出结果

使用Python直接将PDF转换为Excel文件
还可以使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法将PDF文档直接转换为Excel文件。此方法适用于以表格为主的PDF文档,有助于尽可能保留表格的原始外观。
为减少转换后Excel表格中的空白,可以在转换前去除PDF文档的边距。参考以下文章:
Python删除PDF文档的页边距
直接将PDF文档转换为Excel文件的具体步骤如下:
- 导入所需模块:
PdfDocument和FileFormat。 - 创建一个
PdfDocument实例。 - 使用
PdfDocument.LoadFromFile()方法加载PDF文档。 - 将文档转换为Excel文件并使用
PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法保存。 - 释放资源。
代码示例
from spire.pdf import PdfDocument, FileFormat# 创建一个 PdfDocument 实例
pdf = PdfDocument()# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")# 将 PDF 文档转换为 Excel 文件
pdf.SaveToFile("output/PDFToExcel.xlsx", FileFormat.XLSX)# 关闭 PDF 文档
pdf.Close()
输出结果

本文展示了如何用Python将PDF表格提取到文本、CSV和Excel文件,并将PDF文档转换为Excel工作簿。
申请免费License
相关文章:
用Python将PDF表格提取到文本、CSV和Excel文件中
从PDF文档中提取表格并将其转换为更易于处理的格式(如文本、CSV和Excel文件),是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理,使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文&am…...
AIGC在游戏设计中的应用及影响
文章目录 一、AIGC的基本概念与背景AIGC的主要应用领域AIGC技术背景 二、AIGC在游戏设计中的应用1. 自动化游戏地图与关卡设计示例:自动生成2D平台游戏关卡 2. 角色与物品生成示例:使用GAN生成虚拟角色 3. 游戏剧情与任务文本生成示例:基于GP…...
给初学者的 Jupyter Notebook 教程
目录 一、什么是Jupyter Notebook? 1. 简介 2. 组成部分 ① 网页应用 ② 文档 3. Jupyter Notebook的主要特点 二、安装Jupyter Notebook 0. 先试用,再决定 1. 安装 ① 安装前提 ② 使用Anaconda安装 ③ 使用pip命令安装 三、运行Jupyter No…...
搜维尔科技:Xsens和BoB助力生物力学教育
Xsens和BoB助力生物力学教育 搜维尔科技:Xsens和BoB助力生物力学教育...
Vue动态计算Table表格的高度
因为每个用户不同的电脑屏幕宽高度,造成了Table表格的高度不一致,因此想要动态计算出table的高度,让其能够正常的铺满整个屏幕 代码 完整代码如下:首先计算 窗口的高度 - 搜索框的高度 - 固定数值 mounted () {// 计算搜索框的高…...
【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
文章目录 MongoDB的聚合操作(Aggregate)MongoDB的管道(Pipline操作)MongoDB的聚合(Map Reduce)MongoDB的索引 更多相关内容可查看 MongoDB的聚合操作(Aggregate) 简单理解ÿ…...
数组和字符串的es6新方法使用和综合案例
文章目录 一、数组1.forEach() 对数组中的每个元素执行回调函数,无返回值。2.map() 通过对数组中的每个元素执行回调函数生成新的数组3.filter() 过滤返回一个符合条件的新数组4.find() 返回符合条件的第一个数组元素,如果不存在则返回undefined5.every(…...
JS语法进阶第一课!—DOM(重点)
1、DOM概念 DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model) 当网页被加载时,浏览器将网页转为一个DOM,并用JS进行各种操作。比如:改变页面中的HTML 元素及其属性&#x…...
Swift 开发教程系列 - 第5章:集合类型
Swift 提供了几种常用的集合类型,用于存储和管理一组数据。这些集合类型包括数组(Array)、字典(Dictionary)和集合(Set)。本章将介绍它们的使用方法及常见操作。 5.1 数组(Array&am…...
Spring:Bean(创建方式,抽象继承,工厂Bean,生命周期)
1,Bean的创建 1.1,调用构造器创建Bean 调用Bean类的无参构造函数来创造对象,因此要求提供无参构造函数。在这种情况下class元素是必须的,值就是Bean对象的实现类。 如果采用设值注入,Spring容器将使用默认的构造器来创…...
Flutter中的Extension关键字
目录 前言 一、什么是扩展(Extension) 二、扩展的语法 三、示例:为String 添加扩展方法 四、使用扩展的场景 五、复杂示例:为DateTime添加扩展 前言 在 Dart 和 Flutter 中,extension 关键字允许开发者为现有的类添加新的功能,而无需修改原有类的代…...
transformers 框架使用详解,bert-base-chinese
以 bert-base-chinese 模型为例,模型目录 model_name "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese" bert-base-chinese 模型大小只有400多兆,参数的量级在百万级别,与现在动辄几十…...
STM32——ADC
目录 1、ADC的介绍 2、ADC主要特征 3、ADC结构与引脚 4、ADC配置流程 5、示例(光敏电阻的ADC采样) 6、提示 7、结语: 1、ADC的介绍 12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号…...
Unity SRP学习笔记(二)
Unity SRP学习笔记(二) 主要参考: https://catlikecoding.com/unity/tutorials/custom-srp/ https://docs.unity.cn/cn/2022.3/ScriptReference/index.html 中文教程部分参考(可选): https://tuncle.blog/c…...
数据库第五次作业
一要求 二建库建表 触发器 存储过程 三查询 触发器 1 建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试 测试 2 建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量 测试 3…...
健身房业务流程优化:SpringBoot解决方案
3系统分析 3.1可行性分析 通过对本健身房管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本健身房管理系统采用SSM框架,JAVA作为开发语言&a…...
【产品经理】工业互联网企业上市之路
树根互联2022年6月2日提交招股书之后,因财务资料超过六个月有效期加三个月延长期,2022年9月30日上市审核中止;2022年12月26日树根互联更新了2022年半年度财务资料,又九个月过去了,其上市进程将面临再一次中止。 处于上…...
Java学习教程,从入门到精通,Java对象和类语法知识点(20)
1、Java对象和类语法知识点 类的定义 使用class关键字定义类。类名通常使用大写驼峰命名法(PascalCase)。类与对象 类是创建对象的模板或蓝图,它定义了对象的属性和行为。对象是类的实例,它包含了类定义的数据(属性&am…...
金融场中的量化交易:民锋数据驱动策略的优势解析市
随着科技的发展,量化交易成为金融市场的重要组成部分。民锋公司通过智能算法和大数据分析,设计了一系列量化交易策略,帮助投资者实现科学投资。本文将探讨民锋在数据驱动策略上的优势,并展示如何通过量化模型在复杂的市场中获得收…...
Docker 配置镜像加速
docker 拉取代码时出现 ERROR: failed to solve: node:16: unexpected status from HEAD request to https:// xxxxxx.mirror.aliyuncs.com/v2/library/node/m…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
