python实现PDF中表格转化为Excel的方法


Posted in Python onJune 16, 2020

这几天想统计一下《中国人文社会科学期刊 AMI 综合评价报告(2018 年):A 刊评价报告》中的期刊,但是只找到了该报告的PDF版,对于表格的编辑不太方便,于是想到用Python将表格转成Excel格式。

python实现PDF中表格转化为Excel的方法

看过别人写的博客,发现Python解析PDF有以下四种方式:

-pdfminer:擅长文字的解析,把表格解析成普通的文本,没有格式;
-pdf2html:把pdf解析成html,但html的标签并没有规律,解析一个表格还可以,多个表格的话不太好提取;
-tabula:对于简单的表格,即单元格中没有换行的,表头表尾形式不复杂的,使用比较方便。但是单脑需要Java环境;
-pdfplumber:是一个可以处理pdf格式信息的库。可以查找关于每个文本字符、矩阵、和行的详细信息,也可以对表格进行提取并进行可视化调试。

本文采用pdfplumber库读取PDF中的表格,运行环境:Python3.5.2,Anaconda4.2.0。首先简单介绍一下pdfplumber库:

-pdfplumber.pdf中包含了.metadata和.pages两个属性:
.metadata是一个包含pdf信息的字典。
.pages是一个包含页面信息的列表。

-pdfplumber.page的类中包含的主要的属性:

.page_number 页码。
.width 页面宽度。
.height 页面高度。
.objects/.chars/.lines/.rects 这些属性中每一个都是一个列表,每个列表都包含一个字典,每个字典用于说明页面中的对象信息, 包括直线,字符, 方格等位置信息。

-一些常用的方法:

.extract_text() 用来提页面中的文本,将页面的所有字符对象整理为的那个字符串。
.extract_words() 返回的是所有的单词及其相关信息。
.extract_tables() 提取页面的表格。
.to_image() 用于可视化调试时,返回PageImage类的一个实例。

import pdfplumber
import pandas as pd

path = 'test.pdf'
pdf = pdfplumber.open(path)
i=1
#writer=pd.ExcelWriter('output.xlsx')
df=pd.DataFrame(columns=['序号','刊名','主办单位','等级'])
sheetname=['考古文博','历史学','马克思主义理论','民族学与文化学','文学-外国文学','文学-中国文学','艺术学','语言学','哲学','宗教学','法学'
   ,'管理学','环境科学','教育学','经济学-财政科学','经济学-工业经济','经济学-金融','经济学-经济管理','经济学-经济综合','经济学-贸易经济'
   ,'经济学-农业经济','经济学-世界经济','人文地理学','社会学','体育学','统计学','图书馆情报与档案学','心理学','新闻学与传播学'
   ,'政治学-国际政治','政治学-中国政治','综合-高校综合性学报','综合-综合性人文社科期刊']
   
##由于存在一个表格跨页的情况,先将所有表格存放在一个DataFrame中,再根据序号拆分。

for page in pdf.pages[17:59]:
 print (page)
 # 获取当前页面的全部文本信息,包括表格中的文字
 # print(page.extract_text())
 for table in page.extract_tables():
  #print(table)
  df=df.append(pd.DataFrame(table[1:],columns=table[0]),ignore_index=True)
print (df)

writer=pd.ExcelWriter('output3.xlsx')
new_df=pd.DataFrame()
j=1
index=[]
#记录序号==1的行索引,用于后面的表格拆分
for i in range(len(df)):
 if df.ix[i,0]=='1':
  index.append(i)
  print ("################")
index.append(len(df))
#print (index)

#按行索引将内容切片并逐个添加到表中
for t in range(len(index)-1):
 new_df=df.ix[index[t]:index[t+1]-1,:]
 #print (new_df)
 new_df.to_excel(writer,sheet_name=sheetname[t],encoding='gb2312',index=None)
writer.save()
pdf.close()
print('finished')

最终保存为Excel。

python实现PDF中表格转化为Excel的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python搭建微信公众平台
Feb 09 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
浅析Python装饰器以及装饰器模式
May 28 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
Python request操作步骤及代码实例
Apr 13 Python
Python json格式化打印实现过程解析
Jul 21 Python
Python实现手势识别
Oct 21 Python
python des,aes,rsa加解密的实现
Jan 16 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
详解如何用Python实现感知器算法
Jun 18 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 #Python
结束运行python的方法
Jun 16 #Python
深入理解Python 多线程
Jun 16 #Python
keras.layer.input()用法说明
Jun 16 #Python
python适合做数据挖掘吗
Jun 16 #Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 #Python
Python实现SMTP邮件发送
Jun 16 #Python
You might like
PHP调用三种数据库的方法(1)
2006/10/09 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Js组件的一些写法
2010/09/10 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Windows下PyMongo下载及安装教程
2015/04/27 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python中的localtime()方法使用详解
2015/05/22 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
Python如何访问字符串中的值
2020/02/09 Python
python实现梯度下降法
2020/03/24 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
银行工作检查书范文
2014/01/31 职场文书
元旦晚会主持词
2014/03/24 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript