从PDF文件提取表格到Excel就这么简单!
PDF 文件处理
PDF(Portable Document Format的简称,意为“可携带文档格式”),是由Adobe Systems用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即PDF会忠实地再现原稿的每一个字符、颜色以及图象。
可移植文档格式是一种电子文件格式。这种文件格式与操作系统平台无关,也就是说,PDF文件不管是在Windows,Unix还是在苹果公司的Mac OS操作系统中都是通用的。这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式。越来越多的电子图书、产品说明、公司文告、网络资料、电子邮件在开始使用PDF格式文件。
Adobe公司设计PDF文件格式的目的,是跨平台支持多媒体集成信息的出版和发布,尤其是提供对网络信息发布的支持。为了达到此目的, PDF具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。
安装 pdfplumber
neo@MacBook-Pro-Neo ~/workspace/python % pip install pdfplumber
查看 pdfplumber 是否安装成功
neo@MacBook-Pro-Neo ~/workspace/python % pip show pdfplumber
Name: pdfplumber
Version: 0.5.26
Summary: Plumb a PDF for detailed information about each char, rectangle, and line.
Home-page: https://github.com/jsvine/pdfplumber
Author: Jeremy Singer-Vine
Author-email: jsvine@gmail.com
License: UNKNOWN
Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
Requires: pdfminer.six, Pillow, Wand
Required-by:
获取PDF文档信息
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
print(pdf.metadata)
输出结果
{'Producer': 'macOS 版本11.2.1(版号20D74) Quartz PDFContext', 'CreationDate': "D:20210227145013Z00'00'", 'ModDate': "D:20210227145013Z00'00'"}
获取PDF总页数
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
print(len(pdf.pages))
查看PDF页面信息
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
first_page = pdf.pages[0]
# 查看当前页码
print('页码:',first_page.page_number)
# 查看当前页宽
print('页宽:',first_page.width)
# 查看当前页高
print('页高:',first_page.height)
输出结果
neo@MacBook-Pro-Neo ~/workspace/python % python3 pdf.py
页码: 1
页宽: 1324
页高: 7638
提取文本内容
PDF样本文件
萃取程序
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
first_page = pdf.pages[0]
# 读取文本
text = first_page.extract_text()
print(text)
输出结果
neo@MacBook-Pro-Neo ~/workspace/python % python3 pdf.py
⾸页 ENGLISH RSS订阅 统计微博|统计微讯|移动客户端 2021年2⽉27⽇ 星期六
检索 | ⾼级
热词: GDP CPI PPI PMI 总⼈⼜ 社会消费品零售总额
国家统计局 最新发布 统计动态 统计百科 微观数据申请 公开指南
派驻纪检组 数据查询 通知公告 统计词典 曝光台 公开规定
机构职能 数据解读 图⽚新闻 常见问题解答 ⾏政处罚信息 公开⽬录
当前位置 > ⾸页 > 统计数据 > 最新发布
第第四四次次全全国国经经济济普普查查公公报报((第第七七号号))
来源:国家统计局 发布时间:2019-11-20 10:00 关闭窗⼝ 打印本⻚
第四次全国经济普查公报(第七号)
——分区域单位和从业⼈员情况
国家统计局
国务院第四次全国经济普查领导⼩组办公室
2019年11⽉20⽇
根据第四次全国经济普查结果,现将我国分区域的单位和从业⼈员基本情况公布如下:
⼀、单位基本情况
2018年末,东部地区拥有法⼈单位1280.2万个,占58.8%,⽐2013年末下降了0.5个百分点;中部地区492.9万个,占22.6%,提
⾼了0.1个百分点;西部地区405.8万个,占18.6%,提⾼了0.4个百分点。东部地区拥有产业活动单位1408.3万个,占57.4%;中部地
区568.4万个,占23.2%;西部地区478.3万个,占19.5%。
在第⼆产业和第三产业法⼈单位中,位居前三位的地区是:⼴东省312.7万个,占14.3%;江苏省205.4万个,占9.4%;⼭东
省180.1万个,占8.3%。
按地区分组的单位情况详见表7-1。
提取pdf中的表格数据
PDF文件内容如下
数据萃取程序
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
first_page = pdf.pages[0]
table = first_page.extract_table()
print(table)
table 中是一行一行的数据
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
with pdfplumber.open(file) as pdf:
first_page = pdf.pages[0]
table = first_page.extract_table()
# print(table)
for t in table:
print(t)
输出结果如下
neo@MacBook-Pro-Neo ~/workspace/python % python3 pdf.py
['关注', '⽐较', '序号', '基⾦代码', '基⾦简称', '2021-02-26', None, '2021-02-25', None, '⽇增长值', '⽇增长率', '申购状态', '赎回状态', '⼿续费']
[None, None, None, None, None, '单位净值', '累计净值', '单位净值', '累计净值', None, None, None, None, None]
['', '', '1', '501030', '汇添富中证环境治理指数A 估值图 基⾦吧', '0.5501', '0.5501', '0.5421', '0.5421', '0.0080', '1.48%', '开放', '开放', '0.12%']
['', '', '2', '501031', '汇添富中证环境治理指数C 估值图 基⾦吧', '0.5471', '0.5471', '0.5392', '0.5392', '0.0079', '1.47%', '开放', '开放', '0.00%']
['', '', '3', '164908', '交银中证环境治理(LOF) 估值图 基⾦吧', '0.4890', '0.4890', '0.4820', '0.4820', '0.0070', '1.45%', '开放', '开放', '0.12%']
['', '', '4', '004005', '东⽅民丰回报赢安混合A 估值图 基⾦吧', '1.0564', '1.0709', '1.0438', '1.0583', '0.0126', '1.21%', '开放', '开放', '0.06%']
['', '', '5', '004006', '东⽅民丰回报赢安混合C 估值图 基⾦吧', '1.0463', '1.0593', '1.0338', '1.0468', '0.0125', '1.21%', '开放', '开放', '0.00%']
['', '', '6', '003359', '⼤成360互联⽹+⼤数据100C 估值图 基⾦吧', '1.2160', '1.2160', '1.2060', '1.2060', '0.0100', '0.83%', '开放', '开放', '0.00%']
['', '', '7', '002236', '⼤成360互联⽹+⼤数据100A 估值图 基⾦吧', '1.2450', '1.2450', '1.2350', '1.2350', '0.0100', '0.81%', '开放', '开放', '0.12%']
['', '', '8', '004685', '⾦元顺安元启灵活配置混合 估值图 基⾦吧', '1.8064', '1.8064', '1.8023', '1.8023', '0.0041', '0.23%', '开放', '开放', '0.15%']
['', '', '9', '970008', '华安证券汇赢增利⼀年持有混合C 估值图 基⾦吧', '1.0241', '1.0241', '1.0222', '1.0222', '0.0019', '0.19%', '开放', '暂停', '0.15%']
['', '', '10', '110036', '易⽅达双债增强债券C 估值图 基⾦吧', '1.6250', '1.7750', '1.6220', '1.7720', '0.0030', '0.18%', '开放', '开放', '0.00%']
['', '', '11', '970007', '华安证券汇赢增利⼀年持有混合B 估值图 基⾦吧', '1.0191', '1.0191', '1.0173', '1.0173', '0.0018', '0.18%', '开放', '暂停', '0.00%']
['', '', '12', '970006', '华安证券汇赢增利⼀年持有混合A 估值图 基⾦吧', '0.9643', '1.2003', '0.9626', '1.1986', '0.0017', '0.18%', '封闭期', '封闭期', '---']
['', '', '13', '008827', '建信易盛郑商所能源化⼯期货ET... 估值图 基⾦吧', '1.1550', '1.1550', '1.1534', '1.1534', '0.0016', '0.14%', '开放', '开放', '0.15%']
['', '', '14', '008828', '建信易盛郑商所能源化⼯期货ET... 估值图 基⾦吧', '1.1533', '1.1533', '1.1517', '1.1517', '0.0016', '0.14%', '开放', '开放', '0.00%']
['', '', '15', '007817', '国泰中证全指通信设备ETF联接A 估值图 基⾦吧', '0.9943', '0.9943', '0.9930', '0.9930', '0.0013', '0.13%', '开放', '开放', '0.10%']
['', '', '16', '110035', '易⽅达双债增强债券A 估值图 基⾦吧', '1.6840', '1.8340', '1.6820', '1.8320', '0.0020', '0.12%', '开放', '开放', '0.08%']
保存数据到 Excel
安装依赖包 openpyxl 否则会提示让你安装。
neo@MacBook-Pro-Neo ~/workspace/python % pip install openpyxl
import os,pdfplumber
import pandas as pd
file = os.path.expanduser("~/tmp/每日开放式基金净值表.pdf")
# 读取pdf文件,保存为excel
with pdfplumber.open(file) as pdf:
first_page = pdf.pages[0]
# 自动读取表格信息,返回列表
table = first_page.extract_table()
# print(table)
save = pd.DataFrame(table[2:],columns=table[0])
# 保存excel
save.to_excel('output.xlsx')
输出结果如下