用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…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...